//下面代码显示了如何使用WM_ENDSESSION WM_DESTROY WM_QUIT消息,基本上来自于
//<<win95-a-developers-guide>>的第一章
LRESULT WINAPI XXX_WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
...
{
switch(uMsg)...{
HANDLE_MSG(hwnd,WM_CLOSE, xxx_OnClose);
HANDLE_MSG(hwnd,WM_DESTROY, xxx_OnDestroy);
HANDLE_MSG(hwnd,WM_QUERYENDSESSION, xxx_OnQueryEndSession);
HANDLE_MSG(hwnd,WM_ENDSESSION, xxx_OnEndSession);
}
return( DefWindowProc(hwnd,uMsg,wParam,lParam));
}
BOOL xxx_OnQueryEndSession(HWND hwnd)
... {
//For demonstration purpose ,pretend that there is unsaved data.
BOOL fIsDataUnsaved = TRUE;
BOOL fOkToEndSession = TRUE;
if (fIsDataUnsaved)
...{
//Present message box.
int n = MessageBox(hwnd,__TEXT("Do you want to save changes?"),
__TEXT("xxx --Example technique for proper shutdown"),
MB_YESNOCANCEL|MB_ICONWARNING);
if(n == IDYES)
...{
//you would present a file save dialog box here.
}
if (n == IDCANCEL)
fOkToEndSession = FALSE;
}
return(fOkToEndSession);
}
/**/ //
void xxx_OnEndSession(HWND hwnd, BOOL fEnding)
... {
if (fEnding)
...{
//if the session is really ending ,explicitly destroy the window.
DestroyWindow(hwnd);
//DestroyWindow will send WM_DESTROY and WM_NCDESTROY message.
}
}
/**/ //
void xxx_OnDestroy(HWND hwnd)
... {
//the system will automaticllyu destory the edit child window.
//the main window is being destroyed;signal the message loop to terminate
//so that the thread and process terminate.
PostQuitMessage(0);
}
/**/ //
void xxx_OnClose(HWND hwnd)
... {
// we handle WM_CLOSE the same way we would handle a logoff or shutdown.
BOOL fOkToClose = xxx_OnQueryEndSession(hwnd);
xxx_OnEndSession(hwnd,fOkToClose);
}
/**/ //
switch(uMsg)...{
HANDLE_MSG(hwnd,WM_CLOSE, xxx_OnClose);
HANDLE_MSG(hwnd,WM_DESTROY, xxx_OnDestroy);
HANDLE_MSG(hwnd,WM_QUERYENDSESSION, xxx_OnQueryEndSession);
HANDLE_MSG(hwnd,WM_ENDSESSION, xxx_OnEndSession);
}
return( DefWindowProc(hwnd,uMsg,wParam,lParam));
}
BOOL xxx_OnQueryEndSession(HWND hwnd)
... {
//For demonstration purpose ,pretend that there is unsaved data.
BOOL fIsDataUnsaved = TRUE;
BOOL fOkToEndSession = TRUE;
if (fIsDataUnsaved)
...{
//Present message box.
int n = MessageBox(hwnd,__TEXT("Do you want to save changes?"),
__TEXT("xxx --Example technique for proper shutdown"),
MB_YESNOCANCEL|MB_ICONWARNING);
if(n == IDYES)
...{
//you would present a file save dialog box here.
}
if (n == IDCANCEL)
fOkToEndSession = FALSE;
}
return(fOkToEndSession);
}
/**/ //
void xxx_OnEndSession(HWND hwnd, BOOL fEnding)
... {
if (fEnding)
...{
//if the session is really ending ,explicitly destroy the window.
DestroyWindow(hwnd);
//DestroyWindow will send WM_DESTROY and WM_NCDESTROY message.
}
}
/**/ //
void xxx_OnDestroy(HWND hwnd)
... {
//the system will automaticllyu destory the edit child window.
//the main window is being destroyed;signal the message loop to terminate
//so that the thread and process terminate.
PostQuitMessage(0);
}
/**/ //
void xxx_OnClose(HWND hwnd)
... {
// we handle WM_CLOSE the same way we would handle a logoff or shutdown.
BOOL fOkToClose = xxx_OnQueryEndSession(hwnd);
xxx_OnEndSession(hwnd,fOkToClose);
}
/**/ //