windows程序设计POPPAD3的关键难点详解(四)

本文详细解析了Windows消息处理机制中的WM_CLOSE与WM_QUERYENDSESSION消息处理流程,包括如何通过AskAboutSave函数弹出保存对话框及如何根据用户选择进行后续操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好了,接着往下讲,在接着讲之前先说句题外话,你们可能觉的我更新的慢,但也没办法呀,因为我没有电脑没有网络,所以更新博客只能到十多里外的网吧或是去亲戚家,所以更新的很慢,但是呢最后家里买了电脑并且连上了网,所以以后更新就要快多了

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将不会结束。

好了就讲到这里吧,明天继续
        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值