我刚刚开始学习使用C语言的Win32API,我需要将向导添加到我的应用程序中.这是我第一次这样做,所以我确信这段代码有多处错误.我一直在研究MSDN网站,我基于对那里提供的示例和解释的解释来实现这个实现.我错过了什么吗?向导按钮没有变化,并且在向导的最后一页上单击Next不执行任何操作.关闭向导的唯一方法是按下Cancel按钮.我迷路了.如有任何帮助,不胜感激!

 #include <Windows.h>
 #include <WinUser.h>
 #include <richedit.h>
 #include <prsht.h>
 #include <commctrl.h>
 #include "Resource.h"


 //declarations
 BOOL CALLBACK PrpWelcomeProc(HWND hDialog, UINT Message, WPARAM wParam, LPARAM lParam);
 BOOL CALLBACK PrpEnvironmentVarsProc(HWND hDialog, UINT Message, WPARAM wParam, LPARAM lParam);
 BOOL CALLBACK PrpToolChainVarsProc(HWND hDialog, UINT Message, WPARAM wParam, LPARAM lParam);
 BOOL CALLBACK PrpEditorBehaviorProc(HWND hDialog, UINT Message, WPARAM wParam, LPARAM lParam);
 BOOL CALLBACK PrpFinishProc(HWND hDialog, UINT Message, WPARAM wParam, LPARAM lParam);


 int CreateProjectDialog(HWND Parent)
 {
 HINSTANCE hInstance = GetModuleHandle(NULL);
 PROPSHEETPAGE psp = {sizeof (psp)};
 HPROPSHEETPAGE hPrP[5];



//Setup the Welcome page
psp.hInstance = hInstance;
psp.dwFlags = PSP_HIDEHEADER;
psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPPAGE_LARGE_WELCOME);
psp.pfnDlgProc = PrpWelcomeProc;
psp.lParam = (LPARAM)NULL;
hPrP[0] = CreatePropertySheetPage(&psp);

//Setup the Environment Variagles page
psp.dwFlags =  PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.pszHeaderTitle = TEXT("Environment Variables");
psp.pszHeaderSubTitle = TEXT("Use these options to setup the defualt environment for your OS    project.");
psp.pszTemplate = MAKEINTRESOURCE(IDD_FORMVIEW_ENV_VARIABLES);
psp.pfnDlgProc = PrpEnvironmentVarsProc;
psp.lParam = (LPARAM)NULL;

hPrP[1] = CreatePropertySheetPage(&psp);

//Setup the Toolchain Options page
psp.pszHeaderTitle = TEXT("Toolchain Settings");
psp.pszHeaderSubTitle = TEXT("Use these options to setup your toolchain.");
psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPPAGE_LARGE);
psp.pfnDlgProc = PrpToolChainVarsProc;
psp.lParam = (LPARAM)NULL;

hPrP[2] = CreatePropertySheetPage(&psp);

//Setup the Editor Behavior page
psp.pszHeaderTitle = TEXT("Editor Behavior");
psp.pszHeaderSubTitle = TEXT("Use these options to customize the editor.");
psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPPAGE_LARGE_EDITOR);
psp.pfnDlgProc = PrpEditorBehaviorProc;
psp.lParam = (LPARAM)NULL;

hPrP[3] = CreatePropertySheetPage(&psp);


//Setup the Finish Page
psp.dwFlags = PSP_HIDEHEADER;
psp.pszHeaderTitle = NULL;
psp.pszHeaderSubTitle = NULL;
psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPPAGE_FINISH);
psp.pfnDlgProc = PrpFinishProc;
psp.lParam = (LPARAM)NULL;
hPrP[4] = CreatePropertySheetPage(&psp);

//Setup the Propage Header to define the Wizzard
//The Watermark Bitmap and the Header Bitmap need to be created

PROPSHEETHEADER pHeader = { sizeof(pHeader) };
pHeader.dwFlags = PSH_WIZARD97 | PSH_WATERMARK;
pHeader.hInstance = hInstance;
pHeader.hwndParent = Parent;
pHeader.nPages = &psp;
pHeader.nStartPage = 0;
pHeader.nPages = 5;
pHeader.pszbmWatermark = MAKEINTRESOURCE(IDB_BITMAP1);
pHeader.phpage = hPrP;
//Launch the Wizzard
PropertySheet(&pHeader);

return 0;
}

//Dialog Procedures for all of the Dialogs in the Create Project Wizzard


 BOOL CALLBACK PrpWelcomeProc(HWND hDialog, UINT Message, WPARAM wParam, LPARAM lParam)
{
LPNMHDR pnmh = (LPNMHDR)lParam;

switch (Message)
{
case WM_INITDIALOG:

    
return FALSE;

case WM_NOTIFY:
    

    switch (pnmh->code)
    {
    case PSN_SETACTIVE:
    PropSheet_SetWizButtons(hDialog, PSWIZB_NEXT);
    return FALSE;
    }

}

return  FALSE;
}

BOOL CALLBACK PrpEnvironmentVarsProc(HWND hDialog, UINT Message, WPARAM wParam, LPARAM lParam)
{
LPNMHDR pnmh = (LPNMHDR)lParam;
switch (Message)
{
case WM_INITDIALOG:
    
return FALSE;


case WM_NOTIFY:
    

switch (pnmh->code)
{
case PSN_SETACTIVE:
PropSheet_SetWizButtons(hDialog, PSWIZB_NEXT | PSWIZB_BACK | PSWIZB_CANCEL);
return FALSE;


    }
}
return FALSE;
}
  BOOL CALLBACK PrpToolChainVarsProc(HWND hDialog, UINT Message, WPARAM wParam, LPARAM lParam)
  {
LPNMHDR pnmh = (LPNMHDR)lParam;

switch (Message)
{
case WM_INITDIALOG:
    
    return FALSE;

case WM_NOTIFY:
    

    switch (pnmh->code)
    {
    case PSN_SETACTIVE:
        PropSheet_SetWizButtons(hDialog, PSWIZB_NEXT | PSWIZB_BACK | PSWIZB_CANCEL);
        return FALSE;


    }
}

return FALSE;
}

BOOL CALLBACK PrpEditorBehaviorProc(HWND hDialog, UINT Message, WPARAM wParam, LPARAM lParam)
{
LPNMHDR pnmh = (LPNMHDR)lParam;

switch (Message)
{
case WM_INITDIALOG:

    return FALSE;


case WM_NOTIFY:
    ;

    switch (pnmh->code)
    {
    case PSN_SETACTIVE:
        PropSheet_SetWizButtons(hDialog, PSWIZB_NEXT | PSWIZB_BACK | PSWIZB_CANCEL);
        return FALSE;


    }

}
return FALSE;
}

BOOL CALLBACK PrpFinishProc(HWND hDialog, UINT Message, WPARAM wParam, LPARAM lParam)
{
LPNMHDR pnmh = (LPNMHDR)lParam;

switch (Message)
{
case WM_INITDIALOG:
    
    return FALSE;

case WM_NOTIFY:
    

    switch (pnmh->code)
    {
     case PSN_SETACTIVE:
        PropSheet_SetWizButtons(hDialog, PSWIZB_BACK | PSWIZB_CANCEL | PSWIZB_FINISH);
        PropSheet_SetFinishText(hDialog, TEXT("Finish"));
        return FALSE;


    }

case WM_DESTROY:
    return FALSE;
}
return FALSE;

}"

推荐答案

正如Raymond Chen所说:hDlg是"属性表的句柄".

有关向导本身的句柄,请拨打GetParent(hwnd).

C++相关问答推荐

为什么这个select()会阻止?

为什么海湾合作委员会在共享对象中的. init_data的虚拟内存地址之前留出一个空白

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

在使用GTK 4 Columnview列表模型时,如何为多列添加排序函数.C编码,Linux/GNOME环境

Tiva TM4C123GXL的I2C通信

当打印字符串时,为什么在c中没有使用常量限定符时我会收到警告?

为什么在函数内部分配内存空间时需要添加符号?

无法用C++编译我的单元测试

C中的指针增量和减量(*--*++p)

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

判断X宏的空性

如何使用_newindex数组我总是得到错误的参数

ifdef __cplusplus中的整数文字单引号

如何在C中使数组变量的值为常量?

Printf()在C中打印终止字符之后的字符,我该如何解决这个问题?

这段代码用于在C中以相反的顺序打印数组,但它不起作用

pthread_create的用法

关于不同C编译器中的__attribute__支持

将数组中的所有元素初始化为 struct 中的相同值

c 函数指针,另一种语法