1. 取消右键系统菜单
在PreCreateWindow函数中改变设置样式:
cs.style&=~WS_SYSMENU
CREATESTRUCT的具体结构如下:
typedef struct tagCREATESTRUCT {
LPVOID lpCreateParams;
HANDLE hInstance;//当前实例句柄
HMENU hMenu;//菜单句柄
HWND hwndParent;//父窗口
int cy;//宽度
int cx;//高度
int y;//窗口位置坐标
int x;//窗口位置坐标
LONG style;//窗口样式
LPCSTR lpszName;//标题
LPCSTR lpszClass;//窗口类名
DWORD dwExStyle;//窗口扩展样式
} CREATESTRUCT;
2.在右键系统菜单加入菜单项:
在窗口创建的时候加入
CMenu *pMenu=GetSystemMenu(FALSE);//取得系统菜单
CString StrMenuTitle="我的菜单";
pMenu->AppendMenu(MF_SEPARATOR);//增加一个项目到菜单的末尾,增加分割线
pMenu->AppendMenu(MF_STRING,IDM_MYSYSTEM,StrMenuTitle);
MSDN中的定义;
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );
NFlags:标志位,可以是, MF_OWNERDRAW, MF_STRING, MF_SEPARATOR, MF_POPUP
NIDNewItem:菜单项目的ID,如果Nflags设置为MF_POPUP,那么就是子菜单的句柄,如果是MF_SEPARATOR,就突列.
LpszNewItem:新菜单项的内容
PBmp:菜单项图像对象,指向一个Cbitmap对象
在系统菜单中增加了菜单项之后再增加消息处理函数.发送的是系统消息,在OnSysCommand函数中处理
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
if(nID==IDM_MYSYSTEM)
{
MessageBox("这是我的自定义系统菜单","信息提示",MB_OK);
}
CFrameWnd::OnSysCommand(nID, lParam);
}
3.动态的增加菜单项:
pMenu->GetSubMenu(0)->AppendMenu(MF_SEPARATOR);//增加分割线
pMenu->GetSubMenu(0)->AppendMenu(MF_STRING,ID_APP_ABOUT,"关于");//增加菜单项
4.动态的删除菜单项:
CMenu *pMenu=AfxGetMainWnd()->GetMenu()->GetSubMenu(0);
for(int i=0;i<pMenu->GetMenuItemCount();i++)
{
CString StrName;
pMenu->GetMenuString(i,StrName,MF_BYPOSITION);
if(StrName.Find("保存",0)==0)
{
pMenu->DeleteMenu(i,MF_BYPOSITION);
MessageBox("删除“文件/保存”菜单操作成功!请查看","信息提示",MB_OK);
break;
}
}
函数说明:
int GetMenuString( UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags ) const;
int GetMenuString( UINT nIDItem, CString& rString, UINT nFlags ) const;
nIDItem:由标志位确定,可以是菜单项的ID或者偏移量
lpString和rString:存放字符
nMaxCount:最大长度
nFlags;标志位,可以是MF_BYCOMMAND或MF_BYPOSITION
BOOL DeleteMenu( UINT nPosition, UINT nFlags );//删除一个菜单项
BOOL RemoveMenu( UINT nPosition, UINT nFlags );
5.如何触发系统菜单命令;
AfxGetMainWnd()->SendMessage(WM_SYSCOMMAND,SC_CLOSE);
6.如何创建一个弹出式菜单
以右击鼠标键为例:
CMenu Menu;
//创建一个弹出式菜单
Menu.CreatePopupMenu();
//添加一个菜单项
Menu.AppendMenu(0, ID_POPUP_MENU1, "菜单项&一");
//添加一个左边带复选标志的菜单项
Menu.AppendMenu(MF_CHECKED, ID_POPUP_MENU2, "菜单项&二");
//添加一个分隔条
Menu.AppendMenu(MF_SEPARATOR, 0, "");
//显示一个灰色和无效的菜单项
Menu.AppendMenu(MF_GRAYED, ID_POPUP_MENU3, "菜单项&三");
//添加一个左边带单选标志的菜单项
Menu.AppendMenu(0, ID_POPUP_MENU4, "菜单项&四");
Menu.CheckMenuRadioItem(ID_POPUP_MENU3,ID_POPUP_MENU4,ID_POPUP_MENU4,MF_BYCOMMAND);
//使菜单项为缺省菜单项,以黑体字显示,并在用户按回车时响应
::SetMenuDefaultItem(Menu.m_hMenu,ID_POPUP_MENU4,MF_BYCOMMAND);
//根据当前光标位置显示菜单
CPoint Pos;
GetCursorPos(&Pos); //取得光标位置
Menu.TrackPopupMenu(TPM_RIGHTBUTTON, Pos.x, Pos.y, this);//弹出菜单
Menu.DestroyMenu();
CView::OnRButtonDown(nFlags, point);
函数说明:
BOOL CreatePopupMenu( );//创建一个弹出式菜单
BOOL CheckMenuRadioItem( UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags );
NIDFirst:单选按钮组的第一个项的ID或命令
NIDLast:单选按钮组的最或一个项的ID或命令
NIDItem:单选标记的按钮
NFlags;标志位,MF_BYCOMMAND,MF_BYPOSITION
BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );//在指定的位置弹出菜单
NFlags:TPM_CENTERALIGN,TPM_LEFTALIGN ,TPM_RIGHTALIGN,TPM_LEFTBUTTON ,TPM_RIGHTBUTTON
PWnd:从菜单中接收WM_COMMAND消息
LpRect:包含屏幕的矩形位置,如果用户单击,就取消弹出菜单的显示,为NULL时,如果用户单击弹出菜单的其他部分,就取消显示
7.创建快捷菜单:
重载窗口的OnContextMenu函数,当鼠标右键单击时触发它,
void C。。。。View::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu Menu;
if(Menu.LoadMenu(IDR_MAINFRAME))
{
CMenu *pMenu=Menu.GetSubMenu(0);
pMenu->TrackPopupMenu(TPM_RIGHTBUTTON,point.x,point.y,AfxGetMainWnd());
}
}
8.取消应用程序的菜单;
CMenu *pMenu=GetMenu();
pMenu->DestroyMenu();
SetMenu(NULL);
9.如何在菜单中添加位图
在应用程序的视图类中添加CBitmap类的对象,取名为bm_open1和bm_open2。在视图类的构造函数中添加以下代码:
bm_open1.LoadBitmap(IDB_OPEN1);
bm_open2.LoadBitmap(IDB_OPEN2);
添加位图到菜单
CWnd*parent=GetParent();
CMenu*pmenubar=parent->GetMenu();
CMenu*pmenu=pmenubar->GetSubMenu(2);
pmenu->SetMenuItemBitmaps(1,MF_BYPOSITION,&bm_open1,&bm_open2);
函数说明:
BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );
相信看到函数原形就可以知道函数是什么意思