CreateDialogParam никогда не вызывает WM_INITDIALOG - PullRequest
2 голосов
/ 15 июня 2011

У меня есть диалог, определенный в файле .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

и идентификатор "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. Вызовите InitCommonControlsEx с ICC_LINK_CLASS

Однако InitCommonControlsEx не выполняется, т. Е. Возвращает FALSE, поэтому вопрос в том, как заставить элемент управления SysLink отображаться ...:)

Ответы [ 2 ]

3 голосов
/ 14 июня 2012

Все, что вам нужно, это

#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» в ваш проект.

0 голосов
/ 15 июня 2011

Изменение:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...