📄 g03.htm
字号:
图3.10正在运行DEM3_3.EXE<br> 这里唯一需要注意的两个文件是资源文件和头文件:DEMO3_3RES.H和DEMO3_3.RC。<br> DEMO3_3RES.H的内容:<br> // defines for the top level menu FILE<br> #define MENU_FILE_ID_OPEN 1000<br> #define MENU_FILE_ID_CLOSE 1001<br> #define MENU_FILE_ID_SAVE 1002<br> #define MENU_FILE_ID_EXIT 1003</p> <p> // defines for the top level menu HELP<br> #define MENU_HELP_ABOUT 2000</p> <p> DEMO3_3.RC的内容:<br> #include "DEMO3_3RES.H"</p> <p> MainMenu MENU DISCARDABLE<br> {<br> POPUP "File"<br> {<br> MENUITEM "Open", MENU_FILE_ID_OPEN<br> MENUITEM "Close", MENU_FILE_ID_CLOSE<br> MENUITEM "Save", MENU_FILE_ID_SAVE<br> MENUITEM "Exit", MENU_FILE_ID_EXIT<br> } // end popup</p> <p> POPUP "Help"<br> {<br> MENUITEM "About", MENU_HELP_ABOUT<br> } // end popup</p> <p> } // end top level menu</p> <p> 要编译自己的DEMO3_3.CPP可执行文件,一定要确认包含下面文件:<br> DEMO3_3.CPP——主要源程序。<br> DEMO3_3RES.H——符号头文件源程序。<br> DEMO3_3.RC——资源脚本程序。<br> 尝试运行DEMO3_3.EXE和相关源程序。改变菜单项,通过向.RC文件中添加更多POPUP块来添加更多的菜单。并且尝试创建一个层叠式的菜单树。(提示:对于创建菜单的MENUITEM来说,只是用一个POPUP块来替换MENUITEM)。</p> <p><b>对菜单事件消息的响应</b></p> <p> DEMO3_3.EXE的唯一问题是它不能做任何事情。的确,其中主要问题就是不知道如何侦测菜单项选择和操作产生的消息。本节将主要讨论这个主题。<br> 当滑过一级菜单项时,Windows菜单系统产生大量的消息(如图3.11所示)。<br> 图3.11 Windows菜单选择消息流<br> 我们感兴趣的是在选中一个菜单项后放开鼠标时的消息传递。这指的是一个选择过程。选择过程将一个WM_COMMAND消息传递到该菜单连接的窗口WinProc()函数中,指定的菜单项标识符和其他各种数据存储在该消息的wparam和lparam中,如下所示:<br> msg——WM_COMMAND。<br> lparam——传递消息的窗口句柄。<br> wparam——选中的菜单项标识符。<br> 提示:从技术角度上讲,应当从wparam中提取低位的WORD,以保证LOWORD()宏安全。该宏是标准包括中的一部分。因此必须要阅读该内容。<br> 因此你只需要调用函数switch()来处理wparam的参数值,菜单中定义的另一种MENUITEM标识符,就是你的工作了。例如,使用DEMO3_3.RC文件中定义的菜单,还应当添加WM_COMMAND消息句柄,WinProc()以下面方式结束:</p> <p> LRESULT CALLBACK WindowProc(HWND hwnd, <br> UINT msg, <br> WPARAM wparam, <br> LPARAM lparam)<br> {<br> // this is the main message handler of the system<br> PAINTSTRUCT ps; // used in WM_PAINT<br> HDC hdc; // handle to a device context</p> <p> // what is the message <br> switch(msg)<br> { <br> case WM_CREATE: <br> {<br> // do initialization stuff here</p> <p> // return success<br> return(0);<br> } break;<br> <b> case WM_COMMAND:<br> {<br> switch(LOWORD(wparam))<br> {<br> //handle the FILE menu<br> case MENU_FILE_ID_OPEN:<br> {<br> //do work here <br> }//break;<br> case MENU_FILE_ID_CLOSE:<br> {<br> //do work here <br> }//break;<br> case MENU_FILE_ID_SAVE:<br> {<br> //do work here <br> }//break;<br> case MENU_FILE_ID_EXIT:<br> {<br> //do work here <br> }//break;<br> //handle the HELP menu<br> case MENU_HELP_ABOUT:<br> {<br> //do work here <br> }//break;<br> default:break; <br> }//end switch wparam<br> }break;//end WM_COMMAND</b></p> <p> case WM_PAINT: <br> {<br> // simply validate the window<br> hdc = BeginPaint(hwnd,&ps); <br> // you would do all your painting here<br> EndPaint(hwnd,&ps);</p> <p> // return success<br> return(0);<br> } break;</p> <p> case WM_DESTROY: <br> {<br> // kill the application, this sends a WM_QUIT message <br> PostQuitMessage(0);</p> <p> // return success<br> return(0);<br> } break;</p> <p> default:break;</p> <p> } // end switch</p> <p> // process any messages that we didn't take care of <br> return (DefWindowProc(hwnd, msg, wparam, lparam));</p> <p> } // end WinProc<br> 就是如此简单,但这其实是非法的!当然还有其他的操作一级菜单和菜单项本身的消息,可以阅读Win32 SDK帮助来获得更多的信息。(我几乎无需了解除一个菜单项是否被单击以外的信息。) <br> 作为菜单工作内容的现实例子,我已经创建了一个很不错的声音演示程序,可以允许通过主菜单来结束一个程序,演示四种不同端声音效果中的一个,最后通过“Help”菜单弹出一个Help对话框。并且.RC文件中包含声音、图表和光标资源。该程序就是DEMO3_4.CPP,让我们首先看一下其资源脚本程序和头文件。<br> DEMO3_4RES.H的内容:<br> </p> <p> </p> <p> </p> <p> </p> <p> 图形设备接口GDI介绍<br> 处理重要事件<br> 将消息传递给自己<br> 总结</p> <p> </p> <p>[<a href="index.html">目录</a>][<a href="g02.htm">上一页</a>][<a href="g04.htm">下一页</a>] </p> </td> </tr> </tbody> </table> </td> </tr></tbody></table><script language="javascript">bottomprint()</script></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -