2013-02-26 63 views
0

沒問題,所以我已經抽出時間學習Win32 API來打開窗口,最終我想到了代碼,但我認爲它會工作,但沒有。我註冊了窗口課程,完成了所有必要的事情,但是當我運行它時,什麼也沒有發生......如果有人能指出我做錯了什麼或缺少什麼,這將是一個很大的幫助。Win32 API窗口不會打開

#include <stdlib.h> 
#include <iostream> 
#include <Windows.h> 
#pragma comment (lib, "wsock32.lib") 
#define WNDCLASSNAME "wndclass" 

bool quit = false; 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
     case WM_CLOSE: 
      DestroyWindow(hwnd); 
      break; 

     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 

     default: 
      return DefWindowProc(hwnd, msg, wParam, lParam); 
    } 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int nshowcmd) 
{ 
    WNDCLASSEX WCE; 
    WCE.cbSize = sizeof(WNDCLASSEX); 
    WCE.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC|CS_DBLCLKS; 
    WCE.lpfnWndProc = WndProc; 
    WCE.cbClsExtra = 0; 
    WCE.cbWndExtra = 0; 
    WCE.hInstance = hinstance; 
    WCE.hIcon = NULL;//LoadImage() 
    WCE.hCursor = NULL;//LoadCursor(NULL, IDC_CROSS); 
    WCE.hbrBackground = (HBRUSH) COLOR_BACKGROUND; 
    WCE.lpszMenuName = NULL; 
    WCE.lpszClassName = "KyleWindow"; 
    WCE.hIconSm = NULL; 

    RegisterClassEx(&WCE); 

    HWND WindowHandle; 

    WindowHandle = CreateWindowEx(WS_OVERLAPPEDWINDOW, "KyleWindow", "Xerus", WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, hinstance, NULL); 

    ShowWindow(WindowHandle, SW_SHOWNORMAL); 
    UpdateWindow(WindowHandle); 

    std::cout<<"'Opened' Window"<<std::endl; 

    MSG msg; 

    while(!quit) 
    { 
     if(PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)) 
     { 
      if(msg.message == WM_QUIT) 
       quit = true; 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } 
    return msg.lParam; 
} 
+3

嗯,你能否至少說出所有的函數調用是否成功?你的窗口過程收到什麼消息?我們不是心靈的。 – 2013-02-26 02:21:56

+0

@RaymondChen對不起,是的,函數調用確實成功。 – 2013-02-26 02:29:52

+0

您正在爲擴展窗口樣式傳遞'WS_OVERLAPPEDWINDOW',我想你的意思是'WS_EX_OVERLAPPEDWINDOW'。 – 2013-02-26 03:00:09

回答

3

使用WS_EX_OVERLAPPEDWINDOW爲您CreateWindowEx功能(而不是WS_OVERLAPPEDWINDOW,這不是一個有效的擴展窗口風格)的第一個參數。

+0

非常感謝!現在它工作了! – 2013-02-26 03:07:41

-2

函數int WINAPI WinMain必須在函數LRESULT CALLBACK WndProc之前。編譯器按順序讀取。的

+0

其實,這是不正確的 - 你有它倒退。由於在初始化'WinMain'方法內部的'WNDCLASSEX'結構時使用了指向'WndProc'函數的指針,編譯器實際上需要在*'WinMain'之前看到'WndProc'函數的聲明*。所以你可以使用前向聲明,或者按照他的順序留下。 – 2013-07-26 11:33:34

-1

代替使用WNDCLASSEX使用WNDCLASS

變化:

WNDCLASSEX WCE;WNDCLASS WCE;

刪除行:

WCE.cbSize = sizeof(WNDCLASSEX); 

變化:

RegisterClassEx(&WCE);RegisterClass(&WCE);

+0

爲什麼這會解決問題?你對擴展窗口類有什麼建議? – 2013-07-26 11:34:14