MFC中菜单各函数的用法.docx_第1页
MFC中菜单各函数的用法.docx_第2页
MFC中菜单各函数的用法.docx_第3页
MFC中菜单各函数的用法.docx_第4页
MFC中菜单各函数的用法.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 消息的分类标准消息除WM_COMMAND之外,所有以WM_开头的消息。从CWnd派生的类,都可以接收到这类消息。命令消息来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接收到这类消息。通告消息由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。从CCmdTarget派生的类,都可以接收到这类消息。 2、 命令消息的路由:注意:通常消息产生时,MFC在后台将窗口过程函数替换为了AfxWndProc(可参考MFC源代码),AfxWndProc函数会调用AfxCallWndProc函数,AfxCallWndProc函数又会调用WindowPro函数,WindowPro函数是CWnd的成员函数,接下来WindowPro函数会调用OnWndMsg函数,OnWndMsg函数会判断消息类型,是标准消息则交由CWnd类处理;是命令消息则交由OnCommand函数处理;是通告消息则交由OnNotify函数处理。最后OnCommand和OnNotify函数都会调用OnCmdMsg函数来进行处理。OnCommand函数会完成命令消息的路由,路由过程:首先消息由CMainFrame交给它的子窗口类CView,如果类中有消息响应函数则响应,否则会转而交给CDoc类处理,如果CDoc类也没有消息响应函数,则CDoc类会将消息交还给CView类,继而交还给CMainFrame类,如果CMainFrame类中也没有消息响应函数,则消息最后由CWndApp类响应。3、 对菜单编程时,首先要找到菜单,然后找到子菜单,最后才是菜单项。4、 CWnd:GetMenu函数函数原型:CMenu* GetMenu( ) const;CMenu类封装了与菜单相关的操作。利用这个函数就可以返回一个隶属于CWnd的菜单指针。5、 CMenu: GetSubMenu函数函数原型:CMenu* GetSubMenu( int nPos ) const;int nPos菜单序号。第一个子菜单的序号是0,该函数返回一个菜单的子菜单指针6、 CMenu:CheckMenuItem该函数可以设置标记菜单(即菜单项前打勾)函数原型:UINT CheckMenuItem( UINT nIDCheckItem, UINT nCheck );UINT nIDCheckItem指示要被标记的菜单项,其取值的含义由第二个参数决定UINT nCheck如果该参数取值为:MF_BYCOMMAND,那么第一个参数要按菜单项的ID号取值;如果该参数取值为:MF_BYPOSITION,那么第一个参数要按菜单项的索引号取值(从0开始);当然第二个参数取值需要是MF_BYPOSITION 或 MF_BYCOMMAND的其中一个和MF_BYCOMMAND或MF_BYPOSITION的其中一个的位或(|)的组合。7、 CMenu:SetDefaultItem该函数设置一个菜单项为缺省菜单项(菜单项会粗体显示)函数原型:BOOL SetDefaultItem( UINT uItem, BOOL fByPos = FALSE );UINT uItem该参数的含义由第二个参数决定。如果fByPos值为FALSE,该参数按照菜单项的ID号取值,否则按菜单项的索引取值。BOOL fByPos = FALSE该参数用来决定uItem参数的含义注意:1、当按照索引访问菜单项的时候,分隔符也要计算在内!2、一个子菜单中只能有一个缺省菜单8、CMenu:SetMenuItemBitmaps该函数设置一个图形标记菜单函数原型:BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );UINT nPosition该参数含义由第二个参数决定UINT nFlags该参数决定第一个参数的取值。如果该参数取值为:MF_BYCOMMAND,那么第一个参数要按菜单项的ID号取值;如果该参数取值为:MF_BYPOSITION,那么第一个参数要按菜单项的索引号取值(从0开始)const CBitmap* pBmpUnchecked菜单项没有被选中时,需要设置的菜单项的位图指针const CBitmap* pBmpChecked菜单项被选中时,需要设置的菜单项的位图指针注意:图形菜单的位图资源不能太大(系统限制为1313),要获得位图的限制大小,可以使用下面的函数:9、GetSystemMetrics该函数获取系统的一些信息函数原型:int GetSystemMetrics(int nIndex)int nIndex该参数设置需要获取的系统信息,具体值可参考MSDN10、CMenu:EnableMenuItem 该函数用以屏蔽菜单项或显示菜单项函数原型:UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable );UINT nIDEnableItem该参数由第二个参数决定其含义。UINT nEnable该参数决定第一个参数的取值。如果该参数取值为:MF_BYCOMMAND,那么第一个参数要按菜单项的ID号取值;如果该参数取值为:MF_BYPOSITION,那么第一个参数要按菜单项的索引号取值(从0开始)。该参数同时可以取值为:MF_DISABLED(菜单项不能使用)MF_ENABLED(菜单项可以使用)MF_GRAYED(菜单项变灰)。习惯上如果一个菜单项不能使用,同时将其设置为MF_DISABLED和MF_GRAYED。注意:若需要手动设置菜单项的使用与否,除了需要按照上面的函数设置外,还需要在CMainFrame类的构造函数中将m_bAutoMenuEnable参数手动设置为FALSE,以屏蔽命令更新的机制11、CWnd:SetMenu该函数可以将当前的菜单设置为指定的菜单,或者移除当前菜单函数原型:BOOL SetMenu( CMenu* pMenu );CMenu* pMenu指定新的菜单的指针,如果设置成NULL,则当前菜单会被移除12、CMenu:DetachHMENU Detach( );当CMenu类构造一个局部对象时,接着调用CWnd:SetMenu,紧接着就要调用Detach函数以断开局部变量与菜单的关联,这样即使局部对象生命周期结束了,菜单也不会销毁,而当CWnd窗口销毁时,菜单也会自动销毁了。MFC的命令更新机制:菜单项状态的维护是依赖于CN_UPDATE_COMMAND_UI消息,谁捕获CN_UPDATE_COMMAND_UI消息,MFC就在其中创建一个CCmdUI对象。我们可以通过手工或利用ClassWizard在消息映射中添加ON_UPDATE_COMMAND_UI宏来捕获CN_UPDATE_COMMAND_UI消息。在后台所做的工作是:操作系统发出WM_INITMENUPOPUP消息,然后由MFC的基类如CFrameWnd接管。它创建一个CCmdUI对象,并与第一个菜单项相关联,调用对象的一个成员函数DoUpdate()。这个函数发出CN_UPDATE_COMMAND_UI消息,这条消息带有指向CCmdUI对象的指针。同一个CCmdUI对象就设置为与第二个菜单项相关联,这样顺序进行,直到完成所有菜单项。更新命令UI处理程序仅应用于弹出式菜单项上的项目,不能应用于永久显示的顶级菜单项目可以使用这种方式来设置菜单项的属性,如加标记、屏蔽等,具体用法参考MSDN。注意:当使用ID号来对菜单项进行设置时,工具栏上的相关按钮也会同步进行相应的设置,但当使用索引号进行操作时,则工具栏不同步,所以如果想让工具栏与菜单同步,推荐使用ID号对菜单进行相应的操作。13、CMenu:TrackPopupMenu 该函数可以创建右键弹出菜单函数原型:BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );UINT nFlags该参数指示了弹出菜单与鼠标的相对位置,可以为以下值:TPM_CENTERALIGN、TPM_LEFTALIGN、TPM_RIGHTALIGN、TPM_LEFTBUTTON、TPM_RIGHTBUTTON,具体可参考MSDNint x指示了弹出菜单左上角的X坐标int y指示了弹出菜单左上角的Y坐标CWnd* pWnd指示哪一个窗口拥有该弹出菜单LPCRECT lpRect = NULL设置弹出菜单的显示区域,如果该参数为NULL,则当鼠标在除弹出菜单之外的空白处点击时,弹出菜单小时,如果不为空,并且设置区域矩形后,当鼠标在该区域点击时,弹出菜单不会消失注意:这里的x、y都是指的屏幕坐标,而不是客户区的坐标,需要将客户区坐标转换为屏幕坐标,否则弹出菜单的位置会有偏差,可利用下面函数来完成:14、CWnd:ClientToScreen函数原型:void ClientToScreen( LPPOINT lpPoint ) const;void ClientToScreen( LPRECT lpRect ) const;该函数可以将一个点或者一个矩形区域由客户端坐标转换为屏幕坐标15、CMenu:AppendMenu 函数原型:BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );该函数可以动态的将一个菜单项添加到菜单的末尾UINT nFlags该参数可以取多个值,其取值可以参考MSDN,这里不再赘述UINT nIDNewItem = 0如果nFlags参数设置为MF_POPUP,则该参数要设置为弹出菜单的句柄,如果nFlags参数设置为MF_SEPARATOR,则该参数被忽略(不需要)LPCTSTR lpszNewItem = NULL该参数指定了要添加的菜单内容16、CMenu:CreatePopupMenu 该函数可以创建一个空的弹出菜单函数原型:BOOL CreatePopupMenu( );17、CMenu:InsertMenu 该函数可以在原有的菜单中动态插入一个菜单函数原型:BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );UINT nPosition该参数的定义取决于第二个参数UINT nFlags该参数决定第一个参数的取值。如果该参数取值为:MF_BYCOMMAND,那么第一个参数要按菜单项的ID号取值;如果该参数取值为:MF_BYPOSITION,那么第一个参数要按菜单项的索引号取值(从0开始)UINT nIDNewItem = 0如果nFlags参数设置为MF_POPUP,则该参数要设置为弹出菜单的句柄,如果nFlags参数设置为MF_SEPARATOR,则该参数被忽略(不需要)LPCTSTR lpszNewItem = NULL该参数指定了要添加的菜单内容18、CMenu:DeleteMenu 该函数可以删除指定的菜单项或删除一个弹出菜单函数原型:BOOL DeleteMenu( UINT nPosition, UINT nFlags );UINT nPosition该参数的定义取决于第二个参数UINT nFlags该参数决定第一个参数的取值。如果该参数取值为:MF_BYCOMMAND,那么第一个参数要按菜单项的ID号取值;如果该参数取值为:MF_BYPOSITION,那么第一个参数要按菜单项的索引号取值(从0开始)19、手动添加菜单命令响应函数(适用于动态添加菜单项)1、首先在resource.h头文件中使用#define宏定义ID号:例如:#define IDM_FUNC 111注意不要与其中ID号重复2、在头文件中添加命令响应函数的原型(声明):例如:protected:afx_msg void OnFunc();3、在源文件中添加消息映射:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ONCOMMAND(IDM_FUNC, OnFunc)END_MESSAGE_MAP()4、在源文件中添加命令响应函数的实现(定义):void CMainFrame:OnFunc()MessageBox(“Func函数运行!”);注意:一般使用向导添加的消息响应,都放在注释宏之间,以方便其向导的管理;如果手动添加,可以再注释宏之外添加。如果想要使用向导添加的消息响应而又有做其他用途的话,一定要将其放到注释宏之外,否则在程序运行时,向导会自动将不存在资源的消息映射删除20、CWnd:DrawMenuBar该函数可以在菜单栏被Windows窗口动态创建之后重绘菜单栏,以重绘被改变过的菜单栏(Redraws the menu bar. If a menu bar is changed after Windows has created the window, call this function to draw the changed menu bar.)函数原型:void DrawMenuBar( );注意:该函数要被菜单栏所在的类调用,否则达不到效果21、CWnd:Invalidate该函数可以使整个客户端区域无效,当客户端区域无效时,在下一个WM_PAINT消息产生时,客户端区域会随之更新函数原型:void Invalidate( BOOL bErase = TRUE );BOOL bErase该参数可以控制当客户端区域更新时是否擦除原客户端中的内容,当bErase为TRUE时,会擦除原客户端内容,否则不擦除22、CStringArrayCStringArray类支持CString对象数组。 CStringArray的成员函数类似于CObArray类的成员函数。由于具有这些相似性

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论