MFC学习笔记(4)

菜单响应顺序 : view类 文档类 框架类 应用程序类
消息分类
标准消息
      除WM_COMMAND之外,所有以WM_开头的消息。
      从CWnd派生的类,都可以接收到这类消息。
命令消息
      来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。
 从CCmdTarget派生的类,都可以接收到这类消息。
通告消息
      由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。
 从CCmdTarget派生的类,都可以接收到这类消息。


标记菜单
1.
GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);
2.
GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);

图形标记菜单
m_bitmap.LoadBitmapW(IDB_BITMAP1);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);

str.Format(L"x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));

缺省菜单
1.
GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);
2.
GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_NEW);


*菜单分隔符是占索引 位置的 


菜单项禁用
首先在CMainFrame构造函数中设置m_bAutoMenuEnabl=FALSE
GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);

一般的方法是利用命令更新机制 给菜单选项添加 UPDATE_COMMAND_UI事件
然后用CCmdUI的成员函数Enble来控制

*要注意局部变量生命周期问题


SetMenu(NULL); //删除整个菜单
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);  //添加菜单
SetMenu(&menu);
menu.Detach();

右键菜单添加
建立一个MENU资源IDR_MENU1  ID为IDR_POPMENU
在OnRButtonDown函数下实现
CMenu menu;
    menu.LoadMenu(IDR_MENU1);
    CMenu*pPopup=menu.GetSubMenu(0);

    ClientToScreen(&point);
    pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y,GetParent()); //GetParent()可以让CmainFrame响应


动态添加删除菜单
 CMenu menu;
 menu.CreatePopupMenu();  //创建弹出菜单
 GetMenu()->AppendMenuW(MF_POPUP,(UINT)menu.m_hMenu,L"枫江");
 GetMenu()->InsertMenuW(2,MF_BYPOSITION|MF_POPUP,(UINT)menu.m_hMenu,L"枫江");
 menu.AppendMenuW(MF_STRING,IDM_HELLO,L"hello");
 menu.AppendMenuW(MF_STRING,112,L"li");
 menu.AppendMenuW(MF_STRING,113,L"wei");
 menu.Detach();      //使局部变量menu创建的菜单不随着它被析构而销毁
 GetMenu()->GetSubMenu(0)->InsertMenuW(ID_FILE_OPEN,MF_BYCOMMAND|MF_STRING,115,L"落月");
 GetMenu()->DeleteMenu(1,MF_BYPOSITION); //删除子菜单
 GetMenu()->GetSubMenu(0)->DeleteMenu(2,MF_BYPOSITION);//删除菜单项

手动添加 菜单项事件响应
1.在Resource.h中添加菜单项ID
2.在所在类头文件中写响应函数原型
例:afx_msg void onHello();
3.消息映射
对于命令消息 通过ON_COMMAND宏来完成

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
 ON_WM_CREATE()
END_MESSAGE_MAP()
中间加入ON_COMMAND(IDM_HELLO,onHello)

然后在下面写响应函数实现  

*菜单属于框架类 不属于view类  在view类中GetParent()->GetMenu()->...

GetParent()->DrawMenuBar();是在view类里进行菜单的重绘  

*CString::Find()  类似与C语言中strchr

*GetActiveView获取当前view类指针
在CMainFrame中调用view类中的成员用到了这个函数
这时候要在前面include上view类的头文件

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章