首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单击按钮时调用的CreateWindowEx失败

单击按钮时调用的CreateWindowEx失败
EN

Stack Overflow用户
提问于 2021-06-11 16:33:59
回答 2查看 88关注 0票数 0

我正在尝试从主窗口程序的按钮窗口单击WM_COMMAND中创建一个对话窗口。

代码语言:javascript
复制
case WM_CREATE: 
            hwndRegister = CreateWindow(TEXT("BUTTON"), TEXT("Register"), WS_VISIBLE | WS_CHILD, CW_USEDEFAULT, CW_USEDEFAULT, 100, 50, hwnd, (HMENU)REGISTER_WINDOW, NULL, NULL);
            break;

        case WM_COMMAND:
            switch (LOWORD(wParam)) 
            {
                case REGISTER_WINDOW:
                    DisplayRegisterDialog(hwndRegister);
                    break;
            }
            break;

如果单击该hwndRegister,它将弹出在另一个cpp文件中定义和注册新对话框窗口。

代码语言:javascript
复制
CONST wchar_t DIALOG_WINDOW_NAME[] = L"DialogClass";
void RegisterDialog(HINSTANCE hInstance) 
{
    WNDCLASS dialogBox = { };

    dialogBox.lpfnWndProc = DialogProc;
    dialogBox.lpszClassName = DIALOG_WINDOW_NAME;
    dialogBox.hInstance = hInstance;
    dialogBox.hCursor = LoadCursor(NULL, IDC_ARROW);

    RegisterClass(&dialogBox);
}

void DisplayRegisterDialog(HWND hwnd) 
{
    if (!hwnd) 
    {
        MessageBox(NULL, L"Window Creation faile", L"WINDOW CREATION FAILED", MB_ICONERROR);
    }
    HWND hwndDialogWindow = CreateWindowEx(0, DIALOG_WINDOW_NAME, L"Register User", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, hwnd, (HMENU)DIALOG_REGISTER_WINDOW, NULL, NULL);
}

我正在从主应用程序的winapi winmain中获取注册对话框的实例。

代码语言:javascript
复制
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) {
RegisterDialog(hInstance);
}

到目前为止,我没有得到任何可见的错误抛出,程序运行顺利。但是,不会创建对话框窗口,也不会抛出错误。编辑-对话过程实现:

代码语言:javascript
复制
LRESULT CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CLOSE:
            PostQuitMessage(0);
            break;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

在遵循了IInspectable关于手动检查错误的建议之后,我还想说明一下。如果正在注册window,我会执行此操作

代码语言:javascript
复制
if (RegisterClass(&dialogBox) == 0) {
        MessageBox(NULL, L"Dialog window registration failed", L"Error", 0);
        throw GetLastError();
    }

此代码在内存位置0x0078F828引发Microsoft异常: unsigned C++。

编辑2-好的。我终于发现这个错误代码为1410的类已经存在了。我对这些窗口类有不同的名称。是因为hInstance吗?

EN

回答 2

Stack Overflow用户

发布于 2021-06-11 17:15:48

您的函数DialogProc实际上是一个普通的窗口过程,而不是一个对话过程,因此您必须向DefWindowProc传递未经处理的消息,如下所示:

代码语言:javascript
复制
LRESULT CALLBACK DialogProc /*misnomer!*/(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
    case WM_CLOSE:
        MessageBox(hwnd, L"Test", L"Test", 0);
        break;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam); // important!!
}

如果改为编写return 0;,则窗口在从WM_CREATE调用返回后将立即销毁。

票数 1
EN

Stack Overflow用户

发布于 2021-06-12 13:39:31

该错误是由于在hwndDialogWindow中设置了HMENU.它必须为空。还有大约1410个错误。我也对此感到困惑。代码是

代码语言:javascript
复制
RegisterClass(&dialogBox);
if (RegisterClass(&dialogBox) == 0) {
        int nresult = GetLastError();
        MessageBox(NULL, L"Dialog window registration failed", L"Error", 0);
    }

我不知道上面的代码是如何产生1410错误的。我删除了要注册的第一行,错误就消失了。

还要感谢RemyLebeau指出了错误的方法,Inspectable提供了手动检查错误的建议,这非常有帮助,Iziminza提供了对话框rss脚本,我将使用它作为其他按钮。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67933761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档