C ++ CreateWindowEx返回NULL

我正在尝试使用C ++设置一个简单的窗口,但是我对CreateWindowEx调用返回NULL 。 我使用的大多数代码都来自MSDN网站上的示例 。 没有任何我已经尝试过的,任何帮助,将不胜感激。

这里是代码:

 //Include the windows header #include <Windows.h> //Forward declaration of the WndProc function LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); //Main entry point int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { //Window class name const wchar_t windowName[] = L"Window Class"; //Set up window class WNDCLASS wnd; wnd.lpfnWndProc = WndProc; wnd.hInstance = hInstance; wnd.lpszClassName = windowName; //Register window class RegisterClass(&wnd); //Create window //! This returns NULL HWND hWnd = CreateWindowEx( 0, windowName, L"Windows Programming", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); //Simple check to see if window creation failed if(hWnd == NULL) { //Pause system("PAUSE"); return -1; } //Show the window ShowWindow(hWnd, nCmdShow); //Main message loop MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } //WndProc function LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_PAINT: { PAINTSTRUCT ps; HDC hDc = BeginPaint(hWnd, &ps); FillRect(hDc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW + 1)); EndPaint(hWnd, &ps); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, msg, wParam, lParam); } 

Solutions Collecting From Web of "C ++ CreateWindowEx返回NULL"

请注意,来自MSDN的示例在设置它所关心的内容之前,将WNDCLASS的所有字段设置为零。

 WNDCLASS wnd = { }; // from MSDN example 

空括号是一个C和C ++的简写形式,用于将整个结构初始化为0.通常将其写为{ 0 } ,技术上略有不同,但具有相同的净效果。

在你的代码中,你放弃了初始化:

 WNDCLASS wnd; // your code 

因此,您可能会在其他重要字段之一(如cbClsExtracbWndExtra获得一些垃圾值,导致该类无法注册。 由于课程没有注册,所以不能创建该课程的窗口。

我已经使你的代码工作。 基本上我在使用WNDCLASS(或WNDCLASSEX)结构时所做的是使用所有的参数来确保不会错过任何东西。

 //Include the windows header #include <Windows.h> //Forward declaration of the WndProc function LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); //Main entry point int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { //Window class name const wchar_t windowName[] = L"Window Class"; //Set up window class WNDCLASS wnd; wnd.cbClsExtra = 0; wnd.cbWndExtra = 0; wnd.hCursor = LoadCursor(0, IDC_ARROW); wnd.hIcon = LoadIcon(0, IDI_WINLOGO); wnd.lpszMenuName = 0; wnd.style = 0; wnd.hbrBackground = 0; wnd.lpfnWndProc = WndProc; wnd.hInstance = hInstance; wnd.lpszClassName = windowName; //Register window class RegisterClass(&wnd); //Create window //! This returns NULL HWND hWnd = CreateWindowEx( 0, windowName, L"Windows Programming", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); //Simple check to see if window creation failed if(hWnd == NULL) { //Pause system("PAUSE"); return -1; } //Show the window ShowWindow(hWnd, nCmdShow); //Main message loop MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } //WndProc function LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_PAINT: { PAINTSTRUCT ps; HDC hDc = BeginPaint(hWnd, &ps); FillRect(hDc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW + 1)); EndPaint(hWnd, &ps); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, msg, wParam, lParam); }