Используя WinAPI в C, есть два способа создать диалог с WinAPI: более распространенный — создать ресурс диалога в файле .rc проекта, а затем использовать его с DialogBox()
, который автоматизирует создание стандартного диалога. Другой способ — использовать CreateWindowEx
с определенными параметрами, чтобы созданное окно действовало как диалог.
Пример создания диалога с помощью DialogBox
можно увидеть на сайте winprog.org: http://www.winprog.org/tutorial/dialogs.html
Из чистого интереса я попытался воссоздать диалог, созданный с помощью DialogBox()
, используя CreateWindowEx
. Для этого я просто отключил главное окно, а затем CreateWindowEx
отредактировал диалог. Однако то, что я получил, все же имело одно отличие от диалога, созданного с помощью DialogBox
: когда я нажимаю на отключенное главное окно, мигает диалог, созданный DialogBox
(скорее всего, с помощью функции FlashWindowEx
).
Вот мой код для создания диалогового окна с CreateWindowEx
:
HWND hwndParent;
HINSTANCE ghInstance;
LPCWSTR g_szDialogClassName = L"DialogClass";
void populateDialog(HWND hwnd){
/* Create various dialog controls */
}
LRESULT CALLBACK aboutDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam){
switch(Message){
case WM_CREATE:
populateDialog(hwnd);
return DefWindowProc(hwnd, Message, wParam, lParam);
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDC_CLOSEDLG:
EnableWindow(hwndParent, TRUE);
DestroyWindow(hwnd);
UnregisterClass(g_szDialogClassName, ghInstance);
break;
}
break;
case WM_CLOSE:
EnableWindow(hwndParent, TRUE);
DestroyWindow(hwnd);
UnregisterClass(g_szDialogClassName, ghInstance);
break;
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return DefWindowProc(hwnd, Message, wParam, lParam);
}
int createDialogBox(HWND hwnd, HINSTANCE hInstance){
if (registerClass(hInstance, g_szDialogClassName, (WNDPROC)aboutDlgProc) == 0){
MessageBoxA(NULL, "Dialog Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
return 0;
}
EnableWindow(hwnd, FALSE);
CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_TOPMOST | WS_EX_TOOLWINDOW, g_szDialogClassName, L"About", WS_VISIBLE | WS_CAPTION | WS_POPUP | WS_SYSMENU, 100, 100, 450, 150, NULL, NULL, hInstance, NULL);
hwndParent = hwnd;
}
Вот мне очень интересно как это делается внутри DialogBox()
? Как отключенное окно может получать ввод мыши? Или, может быть, он не был отключен стандартными средствами (чем-то, кроме EnableWindow(hwnd, FALSE)
)? Или невозможно воспроизвести этот эффект обычными вызовами WinAPI?