MFC中菜单的应用(注释详细)
(2011-07-13 09:41:55)
标签:
杂谈 |
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)
{
}
CFrameWnd::OnSysCommand(nID,
lParam);
}
3.动态的增加菜单项:
4.动态的删除菜单项:
函数说明:
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.如何创建一个弹出式菜单
函数说明:
BOOL CreatePopupMenu(
);//创建一个弹出式菜单
BOOL CheckMenuRadioItem( UINT
nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags );
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)
{
}
8.取消应用程序的菜单;
9.如何在菜单中添加位图
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 );
相信看到函数原形就可以知道函数是什么意思
前一篇:MFC树形控件详细分析与代码实现