MFC菜单1

来源:互联网 发布:天猫店和淘宝店的费用 编辑:程序博客网 时间:2024/05/23 14:48

 创建加载菜单有三种方式:

1*在Cwnd::Create方法中传递菜单资源的ID,

2*在CFrameWnd的LoadFrame中传递菜单资源的ID,这时经常与其它资源共享资源ID.

3*是通过编程方式利用CMenu这个类,动态创建菜单。或者与菜单资源结合使用。

    例:CMenu menu;
            menu.LoadMenu(IDR_**);
            ::SetMenu(&menu);
           ::DrawMenuBar();
            menu.detach();-------当menu为局部变量时
        或者利用CreateMenu/appendMenu的方式动态创建。
 注意当程序中有多个菜单时,只能用Cmenu的方式。
---------------------------------------
菜单处理程序有两种,一种是命令处理程序----WM_COMMAND,一种是命令更新程序(即菜单反映程序状态,与一些含有菜单的状态值有关),当发生WM_INITPOPUPMENU时由主框架调用。消息影射宏有:
            ON_COMMAND/ON_UPDATE_COMMAND_UI/ON_COMMAND_RANGE/ON_UPDATE_COMMAND_UI_Range
_______________________
键盘加速键也作为一种资源,可以令ID与菜单ID相同,从而共享命令处理程序。
也可以单独创建键盘加速键处理程序。
值得注意的是:
  CFrameWnd为我们处理了键盘加速的基础工作。
  如果我们直接继承自CWnd则需要我们在应用程序的初始化时,利用::LoadAccelerator()加载加速表资源,返回句柄付给窗口的成员 HACCEL m_hAccel;然后重写Cwnd虚函数,BOOL PreTranslateMessage(MSG *pmsg)。
在这个函数里调用BOOL ::TranslateAccelerator()来进行键盘加速消息的预先处理。注意这个函数的调用发生在
消息循环中TranslateMessage之前,专门用于转换产生键盘加速消息(WM_COMMAND),如果有键盘加速消息
,就会跳过TranslateMessage,进入下一轮消息循环。
-----一切工作都是由AFx在起作用。
*********************************************

 

  

原创粉丝点击