2012-10-14 92 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时间。