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

本文详细解释了在Windows程序设计中,如何处理控件发出的WM_COMMAND消息,特别是针对EDITID控件的EN_UPDATE和EN_MAXTEXT通知。文章通过代码示例说明了当编辑控件内容更改或超出空间时的处理逻辑,并概述了菜单选项如IDM_FILE_NEW的响应代码。

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

好了继续往下讲,再往下就是下面一段代码(为表示区别就叫它代码一吧):

case   WM_COMMAND:
 if (lParam && LOWORD (wParam) == EDITID)
 {

switch (HIWORD (wParam))
 {

case   EN_UPDATE :
 bNeedSave = TRUE ;
 return 0 ;
 case   EN_ERRSPACE :
case   EN_MAXTEXT :
MessageBox (hwnd, TEXT ("Edit control out of space."),
szAppName, MB_OK | MB_ICONSTOP) ;
return 0 ;
 }

这一段代码也很绕人,首先看if (lParam && LOWORD (wParam) == EDITID),它是在WM_COMMAND后面的,一提出WM_COMMAND,就有人想到是点击了菜单,然后再看到那个” EDITID“,很多人就以为这是点击了菜单栏上的确Edit选项,这么想就大错特错了,想想呀,如果是菜单发出的WM_COMMAND信号,那么其lParam是为0的,这时的if (lParam && LOWORD (wParam) == EDITID)就相当于if(0),那它后面的代码将不会被执行,也就不用看了,可能吗?人家会写一堆不会执行的代码?

其实呀,这里的WM_COMMAND并不是菜单发生的,而是控制发出的,别忘了WM_COMMAND也可以是点击了控件发出的呀?EDITID更不是什么Edit菜单项,而是一个用于输入的控件,再前面讲过,就是在子窗口控件中的POPPAD1程序中讲过,也在那一章的“编辑控件通知”中说过,编辑控件给父窗口消息处理程序发送WM_COMMAND消息,对按钮控件来说,LOWORD (wParam) 为子窗口ID,HIWORD (wParam)为通知码,lParam为子窗口句柄,然后还有通知码的介绍:

EN_SETFOCUS

EN_KILLFOCUS

EN_CHANGE

EN_UPDATE

EN_ERRSPACE

EN_MAXTEXT

EN_HSCROLL

EN_VSCROLL

编辑控件已经获得输入焦点

编辑控件已经失去输入焦点

编辑控件的内容将改变

编辑控件的内容已经改变

编辑控件执行已经超出中间

编辑控件在插入时执行超出空间

编辑控件的水平滚动条已经被按下

编辑控件的垂直滚动条已经被按下


说到这里上面那段代码什么意思估计不用我说,你们也应该知道了,就是case   EN_UPDATE :当编辑控件的内容已经改变时将bNeedSave 设为TRUE ;当编辑控件执行已经超出中间和编辑控件在插入时执行超出空间时,弹出“Edit control out of space.”消息框。

再往下看(为表示区别就叫它代码二吧):

switch (LOWORD (wParam))
        
                 {
        
                                  // Messages from File menu
        
                  case   IDM_FILE_NEW:
        
                                        if (bNeedSave && IDCANCEL == AskAboutSave (hwnd, szTitleName))
        
                                                         return 0 ;
        
            
        
                                         SetWindowText (hwndEdit, TEXT ("\0")) ;
        
                                         szFileName[0]  = '\0' ;
        
                                         szTitleName[0] = '\0' ;
        
                                         DoCaption (hwnd, szTitleName) ;
        
                                         bNeedSave = FALSE ;
        
                                        return 0 ;
        
             
        
                .......
        
   case   IDM_HELP:
        
                          OkMessage (hwnd,      TEXT ("Help not yet implemented!"),
        
                   TEXT ("\0")) ;
        
                          return 0 ;
        
            。。。。
        
           case   IDM_APP_ABOUT:
        
                          DialogBox (hInst, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;
        
                          return 0 ;

上面那一段中的“。。。。”表示省去了好多,因为太多了且都差不多,就省去了,这样一目了然。这一段跟上上面那一段也就是代码一是并列的,都是WM_COMMAND下的情况,当WM_COMMAND来自控件时,就执行代码一,来自菜单时,就执行代码二,这个代码二虽然长,但很清楚,就是执行那些菜单选项的代码,比如case  IDM_FILE_NEW:后的代码是点新建菜单后的执行代码, case   IDM_FILE_OPEN:后的代码是点菜单打开选项后的代码,我就不一一说了,自己去看吧。毕竟不难,而且我就算做讲解,那内容会很长,你也不一定有时间看,也不一定愿意看,甚至一看那么长就吓跑了。

好了,这次就到这讲到这里了,下次再见!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值