c - WinAPI - 对话框 : how does disabled main window flash dialog on mouseclick?

标签 c winapi input dialog disabled-control

在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/

相关文章:

algorithm - 冒泡排序和分布排序算法的 "Problem size"是什么?

c - 可以在软件中检测内存中的位错误吗?

CLI 与程序的纯 C/C++ 库?

C++ 获取程序打开套接字的句柄

c++ - 以系统用户身份调用应用程序(Windows)

php - 具有相同名称的多个文本输入 - 添加到数据库

c - C 中更快的 I/O

c - 字符串数组的数组

c++ - Alt Tab 覆盖 Win32 标识符

javascript - 当指定文本位于页面上时,Jquery 用户脚本单击单选按钮