MFC中菜单各函数的用法.docx
文本预览下载声明
消息的分类
标准消息
除WM_COMMAND之外,所有以WM_开头的消息。
从CWnd派生的类,都可以接收到这类消息。
命令消息
来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。
从CCmdTarget派生的类,都可以接收到这类消息。
通告消息
由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。
从CCmdTarget派生的类,都可以接收到这类消息。
命令消息的路由:
注意:通常消息产生时,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类响应。
对菜单编程时,首先要找到菜单,然后找到子菜单,最后才是菜单项。
CWnd::GetMenu函数
函数原型:CMenu* GetMenu( ) const;
CMenu类封装了与菜单相关的操作。利用这个函数就可以返回一个隶属于CWnd的菜单指针。
CMenu:: GetSubMenu函数
函数原型:CMenu* GetSubMenu( int nPos ) const;
int nPos
菜单序号。第一个子菜单的序号是0,该函数返回一个菜单的子菜单指针
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的其中一个的位或(|)的组合。
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* pBmp
显示全部