CreateDialogParam从不调用WM_INITDIALOG

问题描述

|| 我在.rc文件中将对话框定义为:
IDD_DIALOG_AUTHENTICATION DIALOGEX 0,214,138
STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION
CAPTION \"Dialog\"
FONT 8,\"MS Shell Dlg\",400,0x1
BEGIN
    DEFPUSHBUTTON   \"Validate\",ID_BTN_VALIDATE,102,117,50,14
    PUSHBUTTON      \"Exit\",ID_BTN_EXIT,157,14
    LTEXT           \"Username\",IDC_STATIC,7,9,45,8
    CONTROL         \"<a>SysLink</a>\",IDC_SYSLINK,\"SysLink\",WS_TABSTOP,99,60,14
    LTEXT           \"Password\",25,8
    LTEXT           \"messages\",IDC_MESSAGE,39,197,55
    EDITTEXT        IDC_USERNAME,44,140,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_PASSWORD,22,ES_PASSWORD | ES_AUTOHSCROLL
END
并且ID为\“ IDD_DIALOG_AUTHENTICATION \”。 CreateDialogParam称为:
HWND hDlgWnd = CreateDialogParamW(GetModuleHandle(NULL),L\"IDD_DIALOG_AUTHENTICATION\",(DLGPROC)dialogProc,(LParaM)this);
但它返回一个空HWND且没有错误代码(GetLastError()== 0)。 有几条消息发送到我的dialogProc函数,但从未发送过WM_INITDIALOG(消息是WM_SETFONT,0x0090(??),WM_DESTROY和WM_NCDESTROY) 操作系统为Vista 32位(无SP)。 有任何想法吗 ?? 编辑:好的,罪魁祸首是SysLink控件。没有它,我会收到WM_INITDIALOG消息,并且对话框显示正常。 但是,由于需要SysLink控件,我: 1.将可执行文件与comctl32.lib链接 2.使用ICC_LINK_CLASS调用InitCommonControlsEx 但是,InitCommonControlsEx失败,即返回FALSE,因此现在的问题是如何使SysLink控件显示... :)     

解决方法

        您需要的就是
#if defined _M_IX86
  #pragma comment(linker,\"/manifestdependency:\\\"type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' processorArchitecture=\'x86\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\'\\\"\")
#elif defined _M_X64
  #pragma comment(linker,\"/manifestdependency:\\\"type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' processorArchitecture=\'amd64\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\'\\\"\")
#else
  #pragma comment(linker,\"/manifestdependency:\\\"type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' processorArchitecture=\'*\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\'\\\"\")
#endif
在您的stdafx.h文件中。 或仅将依赖项为\'Microsoft.Windows.Common-Controls \'的清单添加到您的项目中。     ,        更改:
HWND hDlgWnd = CreateDialogParamW(GetModuleHandle(NULL),L\"IDD_DIALOG_AUTHENTICATION\",(DLGPROC)dialogProc,(LPARAM)this);
至:
HWND hDlgWnd = CreateDialogParam(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DIALOG_AUTHENTICATION),(LPARAM)this);