2012-10-14 115 views
0

我想已經創建窗口了好幾天,但它總是告訴我:「無法創建窗口」 當隨機創建窗口,CPU變爲50%。你能幫我,告訴是什麼原因導致了這個錯誤? 這裏是源代碼:我無法創建窗口

#include<Windows.h> 
int AppRunning=1; 
void TellError(LPCWSTR error,HWND hWnd=NULL); 
LRESULT CALLBACK WindowProcedure(HWND hWnd,UINT msg,WPARAM wparam,LPARAM lparam) 
{ 
    switch(msg){ 
     case WM_KEYDOWN: 
      AppRunning=0; 
      break; 
     case WM_CLOSE: 
      DestroyWindow(hWnd); 
      break; 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 
    } 
    return DefWindowProc(hWnd,msg,wparam,lparam); 
} 

HWND NewWindow(LPCTSTR title,int xpos, int ypos, int width, int height) 
{ 
    WNDCLASSEX wcex; 
    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style = CS_HREDRAW | CS_VREDRAW; 
    wcex.lpfnWndProc = WindowProcedure; 
    wcex.cbClsExtra = 0; 
    wcex.cbWndExtra = 0; 
    wcex.hInstance = GetModuleHandle(NULL); 
    wcex.hIcon = NULL; 
    wcex.hCursor = NULL; 
    wcex.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); 
    wcex.lpszMenuName = NULL; 
    wcex.lpszClassName = L"Svet-ver1.0"; 
    wcex.hIconSm = LoadIcon(NULL,IDI_APPLICATION); 
    if(!RegisterClassEx(&wcex)){ 
     TellError(L"Cannot register window!"); 
     return NULL; 
    } 
    return CreateWindowEx(WS_EX_CONTROLPARENT, L"Svet3D-ver1.0", title, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, xpos, ypos, width, height, NULL, NULL, GetModuleHandle(NULL), NULL); 
} 

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow) 
{ 
    MSG msg; 
    HWND hWnd = NewWindow(L"Svet",100,100,500,500); 
    if(!hWnd){ 
     TellError(L"Cannot create window!"); 
     return 0; 
    } 
    while(AppRunning){ 
     if(PeekMessage(&msg,hWnd,0,0,PM_REMOVE)){ 
      if(!IsDialogMessage(hWnd,&msg)){ 
       TranslateMessage(&msg); 
       DispatchMessage(&msg); 
      } 
     } 
    } 
    DestroyWindow(hWnd); 
    return 0; 
} 
void TellError(LPCWSTR error,HWND hWnd){ 
    MessageBox(hWnd,error,NULL,MB_OK); 
} 
+1

而你有雙CPU機器,對吧? –

+1

的PeekMessage不會等待消息,並立即退出,你再次調用它,然後你在一個無限循環結束的兩個你的CPU /核中的一個耗時100%。 –

+0

謝謝:)我用的GetMessage,現在,它使用0-5%的CPU – jakubinf

回答

5

傳遞給RegisterClassEx類名是"Svet-ver1.0",但創建窗口,當你使用的是不同的類名"Svet3D-ver1.0"

而且使用的是在主迴路PeekMessage,這將只是循環很快當有隊列中沒有消息。這個空循環是燒燬你所有的CPU(50%可能是因爲你有一個雙核系統)。

您應該使用GetMessage而是將等待下一次的消息不浪費CPU時間。