无法创建窗口

Unable to create a window

本文关键字:窗口 创建      更新时间:2023-10-16

RegisterClassEx 函数返回非零值,但 CreateWindowEx 函数返回 null。我已经阅读了多个答案,我似乎正确地遵循了所有内容。有人可以查看我的代码并告诉我出了什么问题吗?我的猜测是我的 WndProc 有问题,但我无法弄清楚出了什么问题。我正在尝试创建一个可以绘制窗口的类,因此 WndProc 函数是一个类成员。

void windowPainter::registerWindow()
{
    WNDCLASSEX wcex = { 0 };
    wcex.cbSize = sizeof(wcex);
    wcex.lpfnWndProc = windowPainter::WndProc;
    wcex.hInstance = m_hInstance;
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.lpszClassName = windowClassName;
    ATOM returnValue = RegisterClassEx(&wcex);
    int lastErrorValue = GetLastError();
}
void windowPainter::createWindow()
{
    DWORD dwStyle1 = WS_EX_TOPMOST | WS_EX_LAYERED; 
    if (m_isClickThrough)
        dwStyle1 = dwStyle1 | WS_EX_TRANSPARENT;
    DWORD dwStyle2 = WS_POPUP;
    RECT rc = { m_windowOriginX, m_windowOriginY, m_windowSizeX, m_windowSizeY };
    AdjustWindowRect(&rc, dwStyle1, FALSE);
    BYTE alpha_value = 255; 
    m_hWnd = CreateWindowEx(dwStyle1,windowClassName, windowTitle, dwStyle2, rc.left,
        rc.top, rc.right,
        rc.bottom,
        NULL, NULL, m_hInstance, NULL);
}
LRESULT CALLBACK windowPainter::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    UNREFERENCED_PARAMETER(lParam);
    windowPainter* pThis = NULL;
    if (WM_CREATE == message)
    {
        pThis = (windowPainter*)((LPCREATESTRUCT)lParam)->lpCreateParams;
        SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)pThis);
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    else
    {
        pThis = (windowPainter*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
    }
    if (pThis)
        switch (message)
        {
        case WM_PAINT:
            if (pThis)
            {
                //do painting using members of pThis
            }break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_LBUTTONDOWN:
            pThis->onLeftButtonClick();
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

查看代码中的这些语句:

m_hWnd = CreateWindowEx(..., NULL);

在这里,您将lpParam参数传递NULL

pThis = (windowPainter*)((LPCREATESTRUCT)lParam)->lpCreateParams;

这行代码是您读取相同值的位置。由于您在调用CreateWindowEx时将NULL传递给了lpParam,因此您将pThis设置为NULL

调用CreateWindowEx时,您必须传递实例的地址,而不是将NULL传递给lpParam

m_hWnd = CreateWindowEx(..., (LPVOID)this);

请注意,这些更改不应影响对CreateWindowEx调用是成功还是失败。对于问题中的代码,pThis NULL仅意味着您始终调用默认窗口过程。这不会导致窗口创建失败。您的代码中似乎还有其他问题,大概是我们看不到的代码。