好了继续往下讲,再往下就是下面一段代码(为表示区别就叫它代码一吧):
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:后的代码是点菜单打开选项后的代码,我就不一一说了,自己去看吧。毕竟不难,而且我就算做讲解,那内容会很长,你也不一定有时间看,也不一定愿意看,甚至一看那么长就吓跑了。
好了,这次就到这讲到这里了,下次再见!