CreateDialogParam从不调用WM_INITDIALOG

时间:2011-06-15 09:20:34

标签: windows dialog

我在.rc文件中定义了一个对话框:

IDD_DIALOG_AUTHENTICATION DIALOGEX 0, 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, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "Validate",ID_BTN_VALIDATE,102,117,50,14
    PUSHBUTTON      "Exit",ID_BTN_EXIT,157,117,50,14
    LTEXT           "Username",IDC_STATIC,7,9,45,8
    CONTROL         "<a>SysLink</a>",IDC_SYSLINK,"SysLink",WS_TABSTOP,7,99,60,14
    LTEXT           "Password",IDC_STATIC,7,25,45,8
    LTEXT           "messages",IDC_MESSAGE,7,39,197,55
    EDITTEXT        IDC_USERNAME,44,7,140,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_PASSWORD,44,22,140,14,ES_PASSWORD | ES_AUTOHSCROLL
END

,ID为“IDD_DIALOG_AUTHENTICATION”。 CreateDialogParam被称为:

HWND hDlgWnd = CreateDialogParamW(GetModuleHandle(NULL),L"IDD_DIALOG_AUTHENTICATION", (DLGPROC)dialogProc, (LPARAM)this);

但它返回一个空HWND和 NO 错误代码(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控件显示......:)

2 个答案:

答案 0 :(得分:3)

您需要的只是

#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”依赖关系的清单添加到您的项目中。

答案 1 :(得分:0)

变化:

HWND hDlgWnd = CreateDialogParamW(GetModuleHandle(NULL),L"IDD_DIALOG_AUTHENTICATION", (DLGPROC)dialogProc, (LPARAM)this);

要:

HWND hDlgWnd = CreateDialogParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_AUTHENTICATION), (DLGPROC)dialogProc, (LPARAM)this);