好了,接着往下讲,在接着讲之前先说句题外话,你们可能觉的我更新的慢,但也没办法呀,因为我没有电脑没有网络,所以更新博客只能到十多里外的网吧或是去亲戚家,所以更新的很慢,但是呢最后家里买了电脑并且连上了网,所以以后更新就要快多了
case WM_CLOSE:
if (!bNeedSave || IDCANCEL != AskAboutSave (hwnd, szTitleName))
DestroyWindow (hwnd) ;
return 0 ;
本着尽量语言描述清晰简单废话少的原则讲,当收到WM_CLOSE消息时,判断bNeedSave变量真假,默认的是FALSE(代码里找,回调函数开头),此时!bNeedSave为TRUE,当你编辑时,bNeedSave为TRUE,!bNeedSave为FALSE,AskAboutSave在关闭时弹出对话框,就是这个:
说到这里,先说说AskAboutSave,它是前面定义的,内容如下:
short AskAboutSave (HWND hwnd, TCHAR * szTitleName)
{
TCHAR szBuffer[64 + MAX_PATH] ;
int iReturn ;
wsprintf (szBuffer, TEXT ("Save current changes in %s?"),szTitleName[0] ? szTitleName : UNTITLED) ;
iReturn = MessageBox (hwnd, szBuffer, szAppName,MB_YESNOCANCEL | MB_ICONQUESTION) ;
if (iReturn == IDYES)
if (!SendMessage (hwnd, WM_COMMAND, IDM_FILE_SAVE, 0))
iReturn = IDCANCEL ;
return iReturn ;
}
上面那个对话框就是其中的 MessageBox (hwnd, szBuffer, szAppName,MB_YESNOCANCEL | MB_ICONQUESTION) 这个函数显示出来的,当你点了上面的“是”,这个函数返回IDYES,点了“否”,则返回IDNO,点了取消返回IDCANCEL。然后再判断iReturn是不是IDYES(就是那句if (iReturn == IDYES)),就是问你点的是不是“是”,然后最让人弄不明白的一句出现了, if (!SendMessage (hwnd, WM_COMMAND, IDM_FILE_SAVE, 0)) iReturn = IDCANCEL ;很多人看到这里就觉的卡住了,然后网上搜也真搜不到有用的消息,好吧,我就简单的讲讲
当点了那个“是”之后,会弹出一个对话框:
而当你点了菜单里的那个Save选项后,
也会弹出这样一个对话框,所以呀,不管是你点了那个“是”,还是点了那个Save选项,之所以能弹那个对话框,都是因为调用了SendMessage (hwnd, WM_COMMAND, IDM_FILE_SAVE, 0),不信你可以再往回看看代码,是不是有个
case IDM_FILE_SAVE:
if (szFileName[0])
{
if (PopFileWrite (hwndEdit, szFileName))
{
bNeedSave = FALSE ;
return 1 ;
}
else
{
OkMessage (hwnd, TEXT ("Could not write file %s"),
szTitleName) ;
return 0 ;
}
}
也就是说不管你直接调用SendMessage (hwnd, WM_COMMAND, IDM_FILE_SAVE, 0),还是点菜单上的Save选项,最终都会调用上面的那段代码,其实你点了菜单上的Save选项不过相当于系统自己调用了SendMessage (hwnd, WM_COMMAND, IDM_FILE_SAVE, 0)而已,最终还是要跑到上面的那段代码的,至于上面那段代码后面讲,然后:
好了这段代码的全部意思就出来了,if (!bNeedSave || IDCANCEL != AskAboutSave (hwnd, szTitleName)),当你没有编辑那个窗口,就是没在那个EDITID控件中输入东西,则此时bNeedSave为FALSE,!bNeedSave为TRUE,则此时if语句为TRUE,因为||是逻辑或,则后边的就不用看了,只要有一个真就行,然后直接运行后面的DestroyWindow (hwnd) 销毁窗口,如果你在EDITID控件中输入东西,则此时bNeedSave为TRUE,!bNeedSave为FALSE,则还要看后那的那个,AskAboutSave 用一个MessageBox弹出对话框,这个对话框问是否保存,点了“否”的话,返回IDNO,然后IDCANCEL != AskAboutSave (hwnd, szTitleName)成立,销毁窗口,点“取消”,返回IDCANCEL,IDCANCEL != AskAboutSave (hwnd, szTitleName)成立不成立,不销窗口,点了“是”并且保存成功后,则。。。。。。(省略了,太麻烦,自己去想吧,很简单)
然后接着往下看:
case
WM_QUERYENDSESSION :
if (!bNeedSave || IDCANCEL != AskAboutSave (hwnd, szTitleName))
return 1 ;
return 0 ;
当使用者要关闭Windows时,Windows开始向每个窗口消息处理程序发送一个WM_QUERYENDSESSION消息。如果有任何一个窗口消息处理程序处理这个消息后传回0,那么Windows将不会结束。
好了就讲到这里吧,明天继续