【问题标题】:C++ WIN API : why I cant use WM_CREATE [closed]C++ WIN API:为什么我不能使用 WM_CREATE [关闭]
【发布时间】:2017-06-19 13:26:22
【问题描述】:

我正在尝试学习 Winapi 以在 C++ 中开发 gui,但我在使用 VM_CREATE 时遇到了问题我的代码直到 VM_CREATE 工作正常,但代码以防 VM_CREATE 不起作用我使用的是 Visual Studio 2017 这是我的代码::: (Visual工作室没有给出错误)什么问题

#include <windows.h>
#include <tchar.h>  



LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

HWND textfield, hwnd, Button;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

    WNDCLASSEX wc;
    MSG msg;
    memset(&wc, 0, sizeof(wc));
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszClassName = L"WindowClass";
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&wc)) {
        MessageBox(NULL, L"Window Registration Failed!", L"Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, L"WindowClass", L"Window", WS_VISIBLE | WS_MINIMIZEBOX | WS_SYSMENU,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        500,
        500,
        NULL, NULL, hInstance, NULL);

    while (GetMessage(&msg, NULL, 0, 0) > 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    switch (message)
    {

    case WM_CREATE:                     // WORKS TILL HERE
    textfield = CreateWindow(L"STATIC", L"HELLO",
            WS_VISIBLE | WS_CHILD | WS_BORDER,
            300, 300, 100, 25,
            hwnd, NULL, NULL, NULL);
    Button = CreateWindow(L"BUTTON",L"Hello this is a button",
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
                20,
                20,
                300,
                300,
                hwnd,
                NULL,
                NULL,
                NULL);

    break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }

    return 0;
}

【问题讨论】:

标签: c++ winapi


【解决方案1】:

您应该在静态和按钮 CreateWindow 调用的回调中使用 hWnd 输入,而不是在 WM_CREATE 时尚未设置的全局 hwnd被调用(WM_CREATE 在 CreateWindow 返回之前被调用)

所以对于 switch 语句的 WM_CREATE 部分:

textfield = CreateWindow(L"STATIC", L"HELLO",
        WS_VISIBLE | WS_CHILD | WS_BORDER,
        300, 300, 100, 25,
        hWnd, NULL, NULL, NULL);
Button = CreateWindow(L"BUTTON",L"Hello this is a button",
            WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
            20,
            20,
            300,
            300,
            hWnd,
            NULL,
            NULL,
            NULL);

【讨论】:

  • sry c++新手可以发代码吗
  • @GameplayerXd WndProc 函数的第一个参数是什么?对于WM_CREATE,它将是创建的窗口正在(您在WinMain 中调用的CreateWindowEx 函数尚未返回)。
  • 我通过将 hwnd 更改为 hWnd 但仍然 thnx 解决了我的问题
  • 不要要求投票。此外,您应该这样标记正确的答案。你拍过tour吗?
【解决方案2】:

添加更多参数:

textfield = CreateWindow(L"STATIC", L"HELLO",
                         WS_VISIBLE | WS_CHILD | WS_BORDER,
                         300, 300, 100, 25,
                         hWnd, (HMENU)1, hInstance, NULL);

至少hInstance 很重要。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2013-12-09
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多