2

以下是我的代码的一部分。每次运行该程序时,SPanel的CreateWindowEx返回NULL,都会触发错误。任何人都可以看到这段代码有什么问题吗?CreateWindowEx返回NULL

SPanelProcMainWndProc已经声明,并且是原型LRESULT CALLBACK SPanelProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

我编程环境是VISUAL C++ 2010

为什么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); 
} 
+2

'SPanelProc()'如何处理WM_NCCREATE和WM_CREATE?处理WM_NCCREATE时是否返回“TRUE”,处理WM_CREATE时是否返回0? –

+2

* parent *从哪里来?它属于另一个过程吗?这是不可能的。 –

+2

你可以包含GetLastError的一些输出吗?您可能可以使用它来诊断您的问题。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.85).aspx – Wug

回答

7

当您使用自定义绘制工序每个窗口过程必须在每封邮件返回DefWindowProc(hwnd,msg,wparam,lparam),对像WM_ERASEBKGNDWM_PAINT消息异常(你必须返回0,所以操作系统不重绘它的窗口的默认过程)

+0

是的,那是原因。我想我可以完成创作,然后处理WndProc,但看起来这不是事实。谢谢你们!我已向每个人投票并将您标记为答案。 – GILGAMESH