2017-04-24 104 views
-3

我想通过msdn学习Win32,但我遇到了RegisterClassEx的问题,我查了其他线程,指出可能并非所有成员都已初始化,但我确定它们是。使用RegisterClassEx的错误

#include <Windows.h> 
#include <tchar.h> 

static const TCHAR windowclass_sz[] = _T("WindowClass1"); 
static const TCHAR windowtitle_sz[] = _T("DirectX 12 Demo"); 

bool Stop = true; 


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM 
lParam) 
{ 
switch (message) 
{ 
case WM_DESTROY: 
    PostQuitMessage(0); 
    break; 
default: 
    return DefWindowProc(hWnd, message, wParam, lParam); 
} 
return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE PrevhInstance, LPSTR 
lpCmdLine, int nCmdShow) 
{ 
MSG msg; 
HWND hWnd; 

WNDCLASSEX wcex; 
ZeroMemory(&wcex, sizeof(WNDCLASSEX)); 
wcex.cbSize = sizeof(WNDCLASSEX); 
wcex.cbClsExtra = 0; 
wcex.cbWndExtra = 0; 
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 
wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION); 
wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION); 
wcex.hInstance = hInstance; 
wcex.lpfnWndProc = WndProc; 
wcex.lpszClassName = windowclass_sz; 
wcex.lpszMenuName = nullptr; 
wcex.style = CS_HREDRAW | CS_VREDRAW; 

RegisterClassEx(&wcex); 
if (!RegisterClassEx(&wcex)) 
{ 
    GetLastError(); 
    MessageBox(NULL, _T("RegisterClassEx Call Error!"), _T("ERROR"), 
MB_ICONERROR && MB_OK); 
    return 1; 
} 

hWnd = CreateWindowEx(NULL, windowclass_sz, windowtitle_sz, 
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 
800, 600, NULL, NULL, hInstance, NULL); 

if (!hWnd) 
{ 
    MessageBox(NULL, _T("CreateWindowEx Call Error!"), _T("ERROR"), 
MB_ICONERROR && MB_OK); 
    return 1; 
} 
else 
{ 
    Stop = false; 
} 

ShowWindow(hWnd, nCmdShow); 
UpdateWindow(hWnd); 

while (Stop == false) 
{ 
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

} 

return (int)msg.wParam; 
} 

正如你所看到的,RegisterClassEx错误被触发,但我不知道什么是错的。

消息框弹出“RegisterClassEx Call Error!”所以程序结束了,这里有什么问题?

+0

你注意到了什么问题? –

+0

那么,消息框指的是WNDCLASSEX,所以我认为这是我应该看的地方,当我无法通过我自己或通过其他线程来掌握这个问题时,我就来到这里。 –

+0

有问题吗?如果是这样,你怎么知道有问题?你还没有问过问题。 –

回答

4

您打电话RegisterClassEx两次具有相同的论点。第二次调用将失败,因为该类已存在,并且GetLastError返回错误代码1410 (ERROR_CLASS_ALREADY_EXISTS)1)

解决方案:最多只能注册一次给定的窗口类。


1) 你可以通过调用FormatMessage错误代码转换为人类可读表示。工作示例代码可在此answer

+2

当第二次调用'RegisterClassEx()'失败时,'GetLastError()'会告诉你为什么它失败(但你忽略了返回值),根据[documentation](https://msdn.microsoft.com /en-us/library/windows/desktop/ms633587.aspx):“*如果函数失败,返回值为零**要获得扩展错误信息,请调用'GetLastError' **。*”在这种情况下, 'GetLastError()'返回的错误代码将是1410('ERROR_CLASS_ALREADY_EXISTS')。要在你的'MessageBox'中包含系统错误消息,首先将错误代码传递给'FormatMessage()'。 –