1 将菜单设为空
SetMenu(NULL);
2 给MainFrame添加自己写的菜单
CMenu menu; //new menu
menu.LoadMenu(IDR_MENU1); //load menu, para is ID of the Menu
SetMenu(&menu); //set menu
menu.Detach(); // menu为局部变量,为了不 让menu对象析构时在在程序里看不见该 // 菜单
3 添加消息函数
①在类声明中添加成员函数原型: afx_msg void Function(para1, ...); // void 返回值仅仅是示例
②在cpp中添加消息映射: ON_COMMAND(ID_xx, Function) //函数名无括号,后面无号
③在cpp中定义函数
4 给菜单项添加图标
BOOL SetMenuItemBitmaps(UINT nPosition,UINT nFlags,const CBitmap* pBmpUnchecked, constCBitmap* pBmpChecked);
eg.
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBitmap bitmap2;
bitmap2.LoadBitmap(IDB_BITMAP2);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0, MF_BYPOSITION, &bitmap, &bitmap2);
bitmap.Detach();
bitmap2.Detach(); //这里bitmap bitmap2是局部变量,析构时图片会消失,加上这句就好了
5 获取系统信息
Platform SDK: Windows System Information
int GetSystemMetrics( int nIndex // system metric or configuration setting);
参数为要获取哪方面的系统信息 详见MSDN
6 菜单可用/不可用
UINT EnableMenuItem(UINT nIDEnableItem,UINT nEnable);
NOTE:在MFC中提供了一种供菜单是否可用的更新机制,如果要自己改变菜单可用不可用,要在MAINFRAM类构造函数中将m_bAutoMenuEnable = FALSE;
eg.
GetMenu()->GetSubMenu(0)->EnableMenuItem(1, MF_BYPOSITION | MF_GRAYED | MF_DISABLED); //使菜单不可用, 其中MF_DISABLED菜单变灰色并不是必须的 但要加上。
7 追加菜单
BOOL AppendMenu(UINT nFlags,UINT nIDNewItem = 0,LPCTSTR lpszNewItem = NULL);
BOOL AppendMenu(UINT nFlags,UINT nIDNewItem,const CBitmap*pBmp);
①追加弹出式菜单 也就是顶级菜单
CMenu popup; //弹出式菜单
popup.CreatePopupMenu();
GetMenu()->AppendMenu(MF_STRING | MF_POPUP, (UINT)popup.m_hMenu, "编辑(&E)"); //MF_POPUP是还必须的
②菜单栏中插入顶级菜单(而非在最后,而是在几个顶级菜单之间插入)
BOOL InsertMenu(UINT nPosition,UINTnFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL);
BOOL InsertMenu(UINT nPosition,UINTnFlags,UINT nIDNewItem,const CBitmap* pBmp);
eg.
CMenu popup2;
popup2.CreatePopupMenu();
GetMenu()->InsertMenu(1, MF_STRING | MF_BYPOSITION | MF_POPUP, (UINT)popup2.m_hMenu, "HAHA");
popup2.Detach();
③在已有菜单中追加菜单项
eg.
GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING | MF_ENABLED, 300 /* ID */, "HELLO");
④在已有菜单中某位置插入菜单项
eg.
GetMenu()->GetSubMenu(1)->InsertMenu(MF_STRING | MF_ENABLED, IDM_XXX /* ID */, "MOTO");
8 为了让菜单项中和工具栏中的按钮对应,即能响应同一段代码,就要把该菜单项和该工具按钮的ID写成一样的即可。
9 弹出菜单
BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd *pWnd,LPCRECT lpRect=NULL);
10 转换坐标:客户区坐标到屏幕坐标
void ClientToScreen(LPPOINT lpPoint)const;
void ClientToScreen(LPRECT lpRect)const;
11 窗口重绘
CWnd::Invalidate(bool bErase = TRUE)
12 LOWORD 宏
WORD LOWORD(DWORD dwValue); //dwValue is 32-bit
选取低字节, 相似的如同WORD HIWORD(DWORD dwValue)
13 CStingArray 类
class Members: GetSize(), GetAt(int index), 详见MSDN
14 CMainFrame::GetActiveView() 函数
获得当前View类指针