2014-09-16 11 views
-1

В настоящее время я создаю небольшой класс оболочки окон win32, но у меня есть несколько проблем. Если я нажму кнопку закрытия (X) окна, окно сразу закроется, не отправив сообщение о прекращении или уничтожении, поэтому я не могу, например, предотвратить закрытие окна или сохранить что-либо перед закрытием окна. И вторая проблема/вопрос: Если я использую этот небольшой код для использования этого окна, компьютерное CPU сильно используется. Но его единственное маленькое окно. Как я могу изменить/исправить это?Win32 window - no close message

int main() 
{ 
    glwCreate(); 
    while(true/*Later here comes a method that checks, wether window close is requested*/) 
    { 
     glwUpdate(); 
    } 
    glwDestroy(); 

    return 0; 
} 

-

#include "glw.h" 


#include <windows.h> 
#include <iostream> 


HINSTANCE instanceHandle; 
WNDCLASSEX windowClass; 
HWND windowHandle; 


LRESULT CALLBACK WindowMessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    std::cout<<uMsg<<'\n'; 

    switch(uMsg) 
    { 
     case WM_QUIT: 
     { 
      std::cout<<"QUIT\n"; 
      return 0; 
     } 
     case WM_DESTROY: 
     { 
      std::cout<<"DESTROY\n"; 
      return 0; 
     } 
    } 
    return (DefWindowProc(hWnd, uMsg, wParam, lParam)); 
} 


void glwCreate() 
{ 
    instanceHandle = GetModuleHandle(0); 

    windowClass.cbSize = sizeof(WNDCLASSEX); 
    windowClass.style = CS_HREDRAW | CS_VREDRAW; 
    windowClass.lpfnWndProc = WindowMessageHandler; 
    windowClass.cbClsExtra = 0; 
    windowClass.cbWndExtra = 0; 
    windowClass.hInstance = instanceHandle; 
    windowClass.hCursor = LoadCursor(0,IDC_ARROW); 
    windowClass.hIcon = LoadIcon(0, IDI_APPLICATION); 
    windowClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
    windowClass.lpszClassName = "atomus_window_class"; 
    windowClass.lpszMenuName = "menu_name"; 
    windowClass.hIconSm = LoadIcon(0, IDI_APPLICATION); 
    RegisterClassEx(&windowClass); 

    windowHandle = CreateWindowEx( 0, 
            "atomus_window_class", 
            "atomus title", 
            WS_OVERLAPPEDWINDOW, 
            0, 
            0, 
            CW_USEDEFAULT, 
            CW_USEDEFAULT, 
            0, 
            0, 
            instanceHandle, 
            0); 

    ShowWindow(windowHandle, SW_SHOW); 
} 
void glwDestroy() 
{ 
    DestroyWindow(windowHandle); 
    windowHandle = 0; 

    UnregisterClass(windowClass.lpszClassName, instanceHandle); 
} 
void glwUpdate() 
{ 
    MSG message; 
    while (PeekMessage (&message, 0, 0, 0, PM_REMOVE) > 0) //Or use an if statement 
    { 
     TranslateMessage (&message); 
     DispatchMessage (&message); 
    } 
} 
+0

Ваш вопрос немного неясен. Пожалуйста, выделите соответствующий код. –

+1

Почему кажется, что каждый, кто пытается использовать простой обработчик окон, использует PeekMessage вместо GetMessage? Разве они не замечают, что целая ядро ​​израсходована ни для чего? –

+1

Вы не получаете WM_QUIT, если не вызываете PostQuitMessage(). Он должен * не * обрабатываться оконной процедурой, окна больше нет. Нужно делать в игровом цикле. –

ответ

2

Если добавить обработку для WM_CLOSE вы можете контролировать, закрывается ли ваше окно или нет. Не предоставляя свою собственную обработку для этого сообщения, вы получаете значение по умолчанию от DefWindowProc, которое должно уничтожить ваше окно.