无法创建窗口
Unable to create a window
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
仅意味着您始终调用默认窗口过程。这不会导致窗口创建失败。您的代码中似乎还有其他问题,大概是我们看不到的代码。
相关文章:
- 如何为使用创建窗口创建的窗口创建自定义背景颜色
- 窗口 :创建仅具有对我的进程的权限的目录 (C++)
- DXGI_ERROR_INVALID_CALL为核心窗口创建交换链时
- 视觉C++窗口创建失败
- 从 WinAPI 窗口创建控制台窗口
- 窗口创建错误 - 可能是事件处理
- Qt:当主窗口被模式QDialog阻止时,如何聚焦从主窗口创建的无模式QDialog
- Visual Studio 2012应用程序窗口创建/调整大小与VS2008窗口创建不同?为什么?
- C++/SFML窗口创建失败
- 窗口创建问题
- 使用创建窗口创建 MDI 子窗口
- MDI 子窗口创建失败
- Win32窗口创建失败
- 挂钩窗口创建;挂钩未被触发
- 如何使用'C'或'C++'为窗口创建独立的程序或应用程序
- 调用glfwWindowHint()后,GLFW窗口创建失败
- c++窗口创建/ SDL
- Qt从我的主窗口创建新窗口
- 窗口创建失败-LoadFrame(IDR_MAINFRAME)使C++失败
- Visual Studio和SDL2窗口创建失败