Lesson2
添加弹出菜单
1、插入一个新的菜单
2、给View类添加消息处理RButtonDown
Code
void CPopUpMenuView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMenu menu;
if (!menu.LoadMenu(IDR_MENU1))
{
MessageBox("no");
return;
}
CMenu* pPopMenu;
CPoint Mypoint;
ClientToScreen(&point);
pPopMenu=menu.GetSubMenu(1);
pPopMenu->TrackPopupMenu(TPM_TOPALIGN ,point.x,point.y,AfxGetMainWnd());
CView::OnRButtonDown(nFlags, point);
}
uFlags:一种指定功能选项的位标志。用下列标志位之一来确定函数如何水平放置快捷菜单:
TPM_CENTERALIGN:若设置此标志,函数将按参数x指定的坐标水平居中放置快捷菜单。
TPM_LEFTALIGN:若设置此标志,函数使快捷菜单的左边界与由参数X指定的坐标对齐。
TPM_RIGHTALIGN:若设置此标志,函数使快捷菜单的右边界与由参数X指定的坐标对齐。
用下列标志位之一来确定函数如何垂直放置快捷菜单:
TPM_BOTTOMALIGN:若设置此标志,函数使快捷菜单的下边界与由参数y指定的坐标对齐。
TPM_TOPALIGN:若设置此标志,函数使快捷菜单的上边界与由参数y指定的坐标对齐。
TPM_VCENTERALIGN;若设置此标志,函数将按参数y指定的坐标垂直居中放置快捷菜单
用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择:
TPM_NONOTIFY:若设置此标志,当用户单击菜单项时函数不发送通知消息。
TPM_RETURNCMD;若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。
(补充:当TrackPopupMenu的返回值大于0,就说明用户从弹出菜单中选择了一个菜单。以返回的ID号为参数wParam的值,程序给自己发送了一个WM_SYSCOMMAND消息)
用下列标志位之一来确定在快捷菜单跟踪哪一个鼠标键:
TPM_LEFTBUTTON:若设置此标志,用户只能用鼠标左键选择菜单项。
TPM_RIGHTBUTTON:若设置此标志,用户能用鼠标左、右键选择菜单项。
X:在屏幕坐标下,快捷菜单的水平位置。
Y:在屏幕坐标下,快捷菜单的垂直位置。
NReserved:保留值,必须为零。
TPM_CENTERALIGN:若设置此标志,函数将按参数x指定的坐标水平居中放置快捷菜单。
TPM_LEFTALIGN:若设置此标志,函数使快捷菜单的左边界与由参数X指定的坐标对齐。
TPM_RIGHTALIGN:若设置此标志,函数使快捷菜单的右边界与由参数X指定的坐标对齐。
用下列标志位之一来确定函数如何垂直放置快捷菜单:
TPM_BOTTOMALIGN:若设置此标志,函数使快捷菜单的下边界与由参数y指定的坐标对齐。
TPM_TOPALIGN:若设置此标志,函数使快捷菜单的上边界与由参数y指定的坐标对齐。
TPM_VCENTERALIGN;若设置此标志,函数将按参数y指定的坐标垂直居中放置快捷菜单
用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择:
TPM_NONOTIFY:若设置此标志,当用户单击菜单项时函数不发送通知消息。
TPM_RETURNCMD;若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。
(补充:当TrackPopupMenu的返回值大于0,就说明用户从弹出菜单中选择了一个菜单。以返回的ID号为参数wParam的值,程序给自己发送了一个WM_SYSCOMMAND消息)
用下列标志位之一来确定在快捷菜单跟踪哪一个鼠标键:
TPM_LEFTBUTTON:若设置此标志,用户只能用鼠标左键选择菜单项。
TPM_RIGHTBUTTON:若设置此标志,用户能用鼠标左、右键选择菜单项。
X:在屏幕坐标下,快捷菜单的水平位置。
Y:在屏幕坐标下,快捷菜单的垂直位置。
NReserved:保留值,必须为零。
----------------------------------------------------------------------------------------------------------------------------
实现:
1、插入3个bitmap图片
2、在CMainFrame中定义3个变量.
CBitmap m_bitmapGreen;
CBitmap m_bitmapRed;
CBitmap m_bitmapYellow;
3、在构造函数中写
Code
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
m_bitmapGreen.LoadBitmap(IDB_BITMAP1);
m_bitmapRed.LoadBitmap(IDB_BITMAP2);
m_bitmapYellow.LoadBitmap(IDB_BITMAP3);
}
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
m_bitmapGreen.LoadBitmap(IDB_BITMAP1);
m_bitmapRed.LoadBitmap(IDB_BITMAP2);
m_bitmapYellow.LoadBitmap(IDB_BITMAP3);
}
4、 添加CMainFrame的消息WM_INITMenu
Code
void CMainFrame::OnInitMenu(CMenu* pMenu)
{
CFrameWnd::OnInitMenu(pMenu);
// TODO: Add your message handler code here
pMenu->ModifyMenu(ID_GRENN,MF_BITMAP,ID_GRENN,&m_bitmapGreen);
pMenu->ModifyMenu(ID_RED,MF_BITMAP,ID_RED,&m_bitmapRed);
pMenu->ModifyMenu(ID_Yellow,MF_BITMAP,ID_Yellow,&m_bitmapYellow);
}
void CMainFrame::OnInitMenu(CMenu* pMenu)
{
CFrameWnd::OnInitMenu(pMenu);
// TODO: Add your message handler code here
pMenu->ModifyMenu(ID_GRENN,MF_BITMAP,ID_GRENN,&m_bitmapGreen);
pMenu->ModifyMenu(ID_RED,MF_BITMAP,ID_RED,&m_bitmapRed);
pMenu->ModifyMenu(ID_Yellow,MF_BITMAP,ID_Yellow,&m_bitmapYellow);
}
----------------------------------------------------------------------------------------------------------------------------
实现
EnableDocking 函数
· CBRS_ALIGN_TOP 允许停靠到用户区的顶部。
· CBRS_ALIGN_BOTTOM 允许停靠到用户区底部。
· CBRS_ALIGN_LEFT 允许停靠到用户区左边。
· CBRS_ALIGN_RIGHT 允许停靠到用户区右边。
· CBRS_ALIGN ANY 允许停靠到用户区任意一边。