C++ Learning Community Forum
August 01, 2010, 02:47:52 AM *
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
News: Hello. Smiley
 
   Home   Help Search Login Register  
Pages: [1]
  Print  
Author Topic: Aplication wont stop  (Read 243 times)
Hedanito
N00b!!1
*
Posts: 4


View Profile
« on: December 31, 2009, 12:23:46 AM »

I have found 2 examples on the internet. Both of them worked. One looked nice, but was limited to the message loop, and the other one was crap but used PeekMessage() instead GetMessage() so you can also do things outside of that loop. So i tried to add the PeekMessage() to the good one, but for some reason it does not close. (msg.message == WM_QUIT) is never true. Even when i use WM_CLOSE instead, it is still false, even though the WM_CLOSE message does get dispatched. So the window disappears but visual studio stays in the debugger. So i seriously do not understand what the hell is going on, to me it seems like its going beyond logic. But the debugger is always right, so i must have screwed up somewhere Tongue.

Here is my code:
Code
GeSHi (cpp):
#include <windows.h>
 
const char g_szClassName[] = "myWindowClass";
 
// Step 4: the Window Procedure
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;
   }
   return DefWindowProc(hwnd, msg, wParam, lParam);
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
   WNDCLASSEX wc;
   HWND hwnd;
   MSG msg;
   bool exitapp=false;;
 
   //Step 1: Registering the Window Class
   wc.cbSize        = sizeof(WNDCLASSEX);
   wc.style         = 0;
   wc.lpfnWndProc   = WndProc;
   wc.cbClsExtra    = 0;
   wc.cbWndExtra    = 0;
   wc.hInstance     = hInstance;
   wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
   wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
   wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
   wc.lpszMenuName  = NULL;
   wc.lpszClassName = g_szClassName;
   wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
 
   if(!RegisterClassEx(&wc))
   {
       MessageBox(NULL, "Window Registration Failed!", "Error!",
           MB_ICONEXCLAMATION | MB_OK);
       return 0;
   }
 
   // Step 2: Creating the Window
   hwnd = CreateWindowEx(
       WS_EX_CLIENTEDGE,
       g_szClassName,
       "The title of my window",
       WS_OVERLAPPEDWINDOW,
       CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
       NULL, NULL, hInstance, NULL);
 
   if(hwnd == NULL)
   {
       MessageBox(NULL, "Window Creation Failed!", "Error!",
           MB_ICONEXCLAMATION | MB_OK);
       return 0;
   }
 
   ShowWindow(hwnd, nCmdShow);
   UpdateWindow(hwnd);
 
   // Step 3: The Message Loop
   while (!exitapp)
   {
       PeekMessage(&msg,hwnd,NULL,NULL,PM_REMOVE);
 
       if (msg.message == WM_QUIT)
       {
           exitapp=true;
       }
       else
       {
           TranslateMessage(&msg);
           DispatchMessage(&msg);
       }
   }
   return msg.wParam;
}
 
Created by GeSHI 1.0.7.18
« Last Edit: December 31, 2009, 12:36:13 AM by Hedanito » Logged
adeyblue
Dr. of C++ology
****
Posts: 653

Taming the turntables a beat at a time


View Profile WWW
« Reply #1 on: December 31, 2009, 06:40:11 PM »

WM_QUIT is a thread message not a window message.

Change:
PeekMessage(&msg,hwnd,NULL,NULL,PM_REMOVE);
to
PeekMessage(&msg,NULL,0,0,PM_REMOVE);

WM_CLOSE doesn't work because it's a sent message not a posted one, so its never recieved by Get/PeekMessage.
Logged

Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC Valid XHTML 1.0! Valid CSS!