my window application stays in memory
Whenever I close my window application the window dissapears but the program stays in memory so I will have something to do with my message handling but I can''t figure it out
LRESULT CALLBACK MsgHandler(
HWND hwnd, // This is the handle of the window that sent the message
// currently being precessed.
UINT msg, // The message identifier
WPARAM wparam, // The exact use of the these parameters depends on which
LPARAM lparam) // message is being sent, but they are used to further
{
switch(msg)
{
case WM_CREATE: // window created
{
return 0 ;
}
break ;
case WM_COMMAND: // menu command
{
switch(LOWORD(wparam))
{
case ID_APP_EXIT:
{
PostMessage(hwnd, WM_CLOSE, 0, 0) ;
}
}
}
break ;
case WM_CLOSE: // User presses close-button or ALT-F4
{ // perfect spot to do cleanup checks
DestroyWindow(hwnd) ; // Destroys our child-windows (sends out WM_DESTROY)
PostMessage(hwnd, WM_DESTROY, 0, 0) ;
} // and then our main window
break ;
case WM_DESTROY: // exit program
{
PostQuitMessage(NULL) ; // exit program
return 0 ;
}
break ;
}
return(DefWindowProc(hwnd, msg, wparam, lparam)) ; // Default message handler
}
any help would be apreciated
How does your message loop look? If you''re using GetMessage, remember to check the return value. When GetMessage returns FALSE the app should exit. If you''re using PeekMessage check the ''message'' member of MSG. If it equals WM_QUIT, then the app should exit.
This probably has nothing to do with your problem, but anyway:
In your WM_CLOSE handler the window is destroyed thrice. First by calling DestroyWindow, then by posting the WM_DESTROY message, and since you break and let DefWindowProc handle the message it will try to destroy the window as well (since that is the default action). This might not matter, I don''t know. It is a bit messy though. You should either just call DestroyWindow and then return, or simply ignore the WM_CLOSE message and let it be handled by DefWindowProc (which then calls DestroyWindow for you).
This probably has nothing to do with your problem, but anyway:
In your WM_CLOSE handler the window is destroyed thrice. First by calling DestroyWindow, then by posting the WM_DESTROY message, and since you break and let DefWindowProc handle the message it will try to destroy the window as well (since that is the default action). This might not matter, I don''t know. It is a bit messy though. You should either just call DestroyWindow and then return, or simply ignore the WM_CLOSE message and let it be handled by DefWindowProc (which then calls DestroyWindow for you).
this is my message loop
MSG msg ;
while (true)
{
if (PeekMessage(&msg, // Pointer to a variable of the type MSG
NULL, // Handle of the window, whose queue you want to check
0, // 1ste message
0, // Last message
PM_REMOVE)) // What to do after reading the message (else PM_NOREMOVE)
{
TranslateMessage(&msg) ; // Translation of message
DispatchMessage(&msg) ; // Invoke your message handler & and sends it the
// appropriate information from the MSG structure
} // end of if
} // end of while
Edited by - da_cobra on October 27, 2001 2:25:53 PM
MSG msg ;
while (true)
{
if (PeekMessage(&msg, // Pointer to a variable of the type MSG
NULL, // Handle of the window, whose queue you want to check
0, // 1ste message
0, // Last message
PM_REMOVE)) // What to do after reading the message (else PM_NOREMOVE)
{
TranslateMessage(&msg) ; // Translation of message
DispatchMessage(&msg) ; // Invoke your message handler & and sends it the
// appropriate information from the MSG structure
} // end of if
} // end of while
Edited by - da_cobra on October 27, 2001 2:25:53 PM
October 29, 2001 08:37 PM
I have a solution!
One thing you forgot is to check if the msg sent was a WM_QUIT message, or something like that. Anyway you can just add the following code to your loop.
while(TRUE)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
// Is There A Message Waiting?
{
if (msg.message==WM_QUIT)
// Have We Received A Quit Message?
{
break;
// If So break
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
} // end
There probably are other ways, but this way works best for me.
One thing you forgot is to check if the msg sent was a WM_QUIT message, or something like that. Anyway you can just add the following code to your loop.
while(TRUE)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
// Is There A Message Waiting?
{
if (msg.message==WM_QUIT)
// Have We Received A Quit Message?
{
break;
// If So break
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
} // end
There probably are other ways, but this way works best for me.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement