总结下这几天学习的菜单知识:(附上快捷键使用方法)
1.
创建菜单方法:
这个不说了。
动态添加菜单:
CWnd和它的子类们有个方法SetMenu
函数原型:
BOOL SetMenu(
CMenu* pMenu
);
这里有CMenu类。说下它的使用方法
上代码吧:
切忌SetMenu后要调用CMenu的Detach方法
MSDN对它的解释:
Detaches a Windows menu from a CMenu object and returns the handle.
RemarksThe m_hMenu data member is set to NULL.
2.
pop-up menu(皖译:弹出式菜单) 的创建
要用到CMenu的一个方法:GetSubMenu
这个比较好理解。直接给函数原型:
CMenu* GetSubMenu( int nPos //Specifies the position of the pop-up menu contained in the menu. Position values start at 0 for the first menu item. ) const
右键会接受到一个通知:
WM_CONTEXTMENU
MSDN解释:
The WM_CONTEXTMENU message notifies a window that the user clicked the right mouse button (right-clicked) in the window.
呵呵。就是在右键窗口时通知的...
在处理这个通知时创建pop-up menu即可。
用刚GetSubMenu返回的一个CMenu *调用方法TrackPopupMenu
函数原型:
BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = 0 );
¥¥VS2008小技巧一个:因为MSDN并没有CWnd里对应的那个函数文档,所以需要到CWnd的头文件里查找(函数名为:OnContextMenu)
快捷键使用方法:
资源里添加先。
因为CWnd没有添加对快捷键的支持(CFrameWnd支持),所以如果我们自己定义的窗口类继承于CWnd,需要
自己添加快捷键支持;
步骤:
1.在类中添加一个类型为HACCEL 的数据成员。
2.用API函数LoadAccelerators 返回值对它进行初始化或者复制。
3.重写一个虚函数PreTranslateMessage。返回值为TranslateAccelerator 的返回值;
TranslateAccelerator 原型:
HACCEL hAccTable, LPMSG lpMsg );int TranslateAccelerator(
HWND hWnd,
这样就可以了。想用什么快捷键添加消息映射项和处理消息的函数的声明和定义即可。