菜单(不完全版)

总结下这几天学习的菜单知识:(附上快捷键使用方法)

 

1.

   创建菜单方法:

这个不说了。

 

动态添加菜单:

CWnd和它的子类们有个方法SetMenu

 

函数原型:

 

BOOL SetMenu(
   CMenu* pMenu 
);
这里有CMenu类。说下它的使用方法
上代码吧:
 
切忌SetMenu后要调用CMenu的Detach方法
MSDN对它的解释:
Detaches a Windows menu from a CMenu object and returns the handle.
Remarks

The 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 原型:


   
   
int TranslateAccelerator(      

    HWND hWnd,
    HACCEL hAccTable,     LPMSG lpMsg );
这样就可以了。想用什么快捷键添加消息映射项和处理消息的函数的声明和定义即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值