在vc中处理动态菜单消息的一种方法

在vc中处理动态菜单消息的一种方法

ID:34710974

大小:57.34 KB

页数:5页

时间:2019-03-09

在vc中处理动态菜单消息的一种方法_第1页
在vc中处理动态菜单消息的一种方法_第2页
在vc中处理动态菜单消息的一种方法_第3页
在vc中处理动态菜单消息的一种方法_第4页
在vc中处理动态菜单消息的一种方法_第5页
资源描述:

《在vc中处理动态菜单消息的一种方法》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、在VC中处理动态菜单消息的一种方法说明一个CMenu对象;用LoadMenu成员函数装入菜单资源;用TrackPopupMenu在指定位置显示菜单并发送所选菜单项的ID;用DestroyMenu销毁菜单释放资源。----在某些应用程序中,只有在程序运行时才能根据情况确定菜单项的内容和菜单项的数目。这样就无法在编程时建立菜单资源,也就不能象上面所述的那样用LoadMenu装入资源。需要用另一种方法建立菜单:说明一个CMenu对象;用CreatePopupMenu建立一个空菜单,再用InsertMenu或

2、AppendMenu加入菜单项;用TrackPopupMenu在指定位置显示菜单并发送所选菜单项的ID;用DestroyMenu销毁菜单释放资源。----虽然这种方法可以动态地建立菜单,但是能够向动态菜单中加入的菜单项被限制在一个有限的范围内,并且必须在编程时就确定它们的ID。这是因为按照MFC常规的菜单处理机制,每个菜单项都要有一个处理函数,用MFC的消息映射使每个菜单ID对应到相应的处理函数,从而建立菜单项与处理函数的对应关系。用户选中某一菜单项,就会触发相应的处理函数。这样一来,我们必须在编程时

3、就知道所有的菜单项,它们的ID与对应的处理函数,并用消息映射静态地一一建立对应关系。----在设计程序时,确实可能出现菜单项数目无法限制,菜单ID事先不能确定的情况。例如,一个应用程序有两个文档类A与B,每个文档都可以同时打开任意次。我们希望在一个动态菜单中,只列出显示A类文档的窗口标题,另一个动态菜单中只列出显示B类文档的窗口标题。当选定一个菜单项时,对应的文档窗口显示在最上面。由于我们不能限制打开的窗口数目,也不能预知窗口标题,所以就无法确定应该编写多少处理函数以及会有哪些菜单ID,当然也就无法用

4、消息映射建立对应关系。这时,我们需要一种不使用消息映射的方法。但是,不使用消息映射我们如何知道用户选中了哪一个菜单项呢?答案是CMenu类的成员函数TrackPopupMenu可以告诉我们。----我们可以从手册或联机帮助中找到关于该函数的介绍:BOOLTrackPopupMenu(UINTnFlag,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);----参数nFlag用于指定弹出式菜单的位置标志与有效鼠标键。可以取的值为下列的一个或多个:TPM_CENTERALIG

5、N,TPM_LEFTALIGN,TPM_RIGHTALIGN,TPM_LEFTBUTTON,TPM_RIGHTBUTTON----参数x,y为弹出式菜单的位置,参数pWnd为父窗口指针。----该函数在指定位置显示一个弹出式菜单,并发送以选中菜单项ID标识的消息。执行成功返回非零值,否则返回零。----这并不是关于TrackPopupMenu的全部信息。该函数至少有两个重要特性没有列入文档,而它们对于解决我们的问题是至关重要的。第一个未写入文档的特性是:该函数的第一个参数nFlag还可以取另外两个值:

6、TPM_NONOTIFY与TPM_RETURNCMD。从它们的名字可以看出来,TPM_NONOTIFY的作用是使TrackPopupMenu函数不发送菜单消息通知应用程序。TPM_RETURNCMD的作用是使函数将本该发送出去的菜单消息作为返回值返回。这时函数的返回值是UINT类型的,就是选中的菜单ID。这就是该函数第二个未写入文档的特性----下面,我们通过一个例子详细解释TrackPopupMenu的这种用法。这个例子解决了上面提到的选择两类文档窗口的问题,为了简捷,只给出了一个关键的函数Popu

7、pAMenuAndDisplay(intx,inty,CStringsDocType)。----该函数的前两个参数给出了菜单的位置,第三个参数是文档的类型名。函数根据类型名,找到所有打开的该类文档。将文档窗口标题加入弹出式菜单,同时将指向这个文档的指针加入指针数组ptrDoc。这时要动态地分配给菜单项一个ID,本函数的菜单ID从1开始,依次增加下去。注意菜单ID不能从零开始,不然当用户选择菜单的第一项与一项也未选时函数的返回值都是零。----接着是关键的一步:用函数TrackPopupMenu显示菜单

8、。根据该函数的参数设置,如果函数返回零,表示用户未选中任何菜单项。否则,函数返回选中的菜单项ID。实际上就是选中的文档窗口对应的指针在数组ptrDoc中的下标加1。剩下的事情就很简单了。函数返回值大于零时,从ptrDoc中取得选中的文档类指针。从文档类可以得到视类,再从视类得到框架类,最后激活该框架就达到了要求。----无论用户打开了多少文档窗口PopupAMenuAndDisplay都可以正确地处理。----下面就是该函数的具体实现:voidCMain

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。