[英]CreateWindowEx returns NULL
The following is a portion of my code. 以下是我的代码的一部分。 Every time I run the program,
CreateWindowEx
of the SPanel returns NULL
, triggering an error. 每次运行程序时,SPanel的
CreateWindowEx
都会返回NULL
,从而触发错误。 Can anyone see what is wrong with this piece of code? 任何人都可以看到这段代码有什么问题吗?
SPanelProc
and MainWndProc
are declared already, and is of the prototype LRESULT CALLBACK SPanelProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
SPanelProc
和MainWndProc
已经声明,并且是原型LRESULT CALLBACK SPanelProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
. 。
The environment I'm programming in is Visual C++ 2010. 我正在编程的环境是Visual C ++ 2010。
Why is CreateWindowEx
always returning NULL
? 为什么
CreateWindowEx
总是返回NULL
?
#include <Windows.h>
#include <WindowsX.h>
LRESULT CALLBACK SPanelProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_MOUSEMOVE:
break;
}
return 0;
}
void Init ()
{
HWND child;
HINSTANCE hInstance = (HINSTANCE)(GetWindowLongPtr (parent, GWLP_HINSTANCE));
WNDCLASSEX wc;
const char PanelClassName[] = "SPanel"; //ClassName of the panel. Do not reuse on another window
//Create the window, initialize GWLP_USERDATA, check for errors, register the window class, and hide the window
//Create the windowclass for the button
wc.cbSize = sizeof (WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = SPanelProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (hInstance, IDI_APPLICATION);
wc.hCursor = LoadCursor (hInstance, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = PanelClassName;
wc.hIconSm = LoadIcon (hInstance, IDI_APPLICATION);
//If could not register window class
if(!RegisterClassEx (&wc))
{
MessageBox (NULL, "Panel registration failed!", "Error!", MB_OK);
PostQuitMessage (0);
return;
}
//Create window
child = CreateWindowEx (WS_EX_NOPARENTNOTIFY, PanelClassName, "TITLE_TEXT", WS_CHILD, 0, 0, 400, 200, parent, NULL, hInstance, NULL);
//Check for error in window creation
if (child == NULL)
{
MessageBox (NULL, "Panel creation failed!", "Error!", MB_OK);
PostQuitMessage (0);
return;
}
return;
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hWnd;
MSG Msg;
int length, width;
//Register the window, create the window, and check for errors
{
//Window class
wc.cbSize = sizeof (WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance; //Instance used to create the window
wc.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_CODERICON)); //Change here to change large application icon
wc.hCursor = LoadCursor (hInstance, IDC_ARROW); //Change here to change application cursor
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //Change here to change starting background color (white)
wc.lpszMenuName = NULL;
wc.lpszClassName = Coder::Constants::MAINWNDCLASSNAME;
wc.hIconSm = (HICON)LoadImage (hInstance, MAKEINTRESOURCE (IDI_CODERICON), IMAGE_ICON, GetSystemMetrcs (SM_CXSMICON), GetSystemMetrics (SM_CYSMICON), 0); //Change here to change application icon (small, as in taskbar)
//Register the window class so that the ClassName can be used to create the window and then check for error
if (!RegisterClassEx (&wc))
{
MessageBox (NULL, "Main window registration failed!", "Error!", MB_OK);
return 0;
}
//Get screen dimensions
length = GetSystemMetrics (SM_CXSCREEN);
width = GetSystemMetrics (SM_CYSCREEN);
//Create window
hWnd = CreateWindowEx (WS_EX_CLIENTEDGE, /*Border*/
Coder::Constants::MAINWNDCLASSNAME,
Coder::Constants::MAINWNDTITLETEXT, /*Title of window*/
WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_THICKFRAME | WS_CLIPCHILDREN, /*Window style*/
(length - Coder::Constants::XDEFAULT - Coder::Constants::XSHIFT) / 2, (width - Coder::Constants::YDEFAULT - Coder::Constants::YSHIFT) / 2, /*Top-left x and y coordinates*/
Coder::Constants::XDEFAULT + Coder::Constants::XSHIFT, Coder::Constants::YDEFAULT + Coder::Constants::YSHIFT, /*Lengths and widths of window*/
NULL, NULL,
hInstance, NULL);
//Check for error in window creation
if (hWnd == NULL)
{
MessageBox (NULL, "Main window creation failed!", "Error!", MB_OK);
return 0;
}
}
//Call function
Init (hWnd);
//Show and redraw the window
ShowWindow (hWnd, nCmdShow);
UpdateWindow (hWnd);
//Put window in message loop
while (GetMessage (&Msg, NULL, 0, 0) > 0) //While not terminated
{
TranslateMessage (&Msg);
DispatchMessage (&Msg);
}
//Return
return static_cast<int>(Msg.wParam);
}
每个窗口过程必须在每条消息上返回DefWindowProc(hwnd,msg,wparam,lparam)
,当您使用自定义绘制过程时,对WM_ERASEBKGND
和WM_PAINT
等消息有例外(必须返回0,因此操作系统不会重新绘制窗口用它的默认程序)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.