在C中使用WinAPI,有两种方法可以用WinAPI创建对话框:比较常见的一种是在项目的.rc文件中创建一个对话框资源,然后用DialogBox()
,它会自动创建标准对话框。另一种方法是使用带有特定参数的 CreateWindowEx
,这样创建的窗口就像一个对话框。
可以在 winprog.org 上看到使用 DialogBox
创建对话框的示例:http://www.winprog.org/tutorial/dialogs.html
出于纯粹的兴趣,我尝试使用 CreateWindowEx
重新创建使用 DialogBox()
创建的对话框。为此,我只是禁用了主窗口,然后 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 调用重现此效果?
最佳答案
您的代码的问题是您创建了未拥有的窗口。调用 CreateWindowEx
时将主窗口指定为所有者。
关于c - WinAPI - 对话框 : how does disabled main window flash dialog on mouseclick?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25230820/