菜单操作的几种方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
菜单操作的几种方法.txt珍惜生活——上帝还让你活着,就肯定有他的安排。雷锋做了好事不留名,但是每一件事情都记到日记里面。菜单操作的几种方法
1.如何给系统菜单添加一个菜单项
给系统菜单添加一个菜单项需要进行下述三个步骤:
首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;
其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单项添加到菜单中。下例给系统菜单添加两个新的菜单项:
int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct) { … //Make sure system menu item is in the right range.
ASSERT (IDM_MYSYSITEM &0xFFF0)==IDM_MYSYSITEM);
ASSERT (IDM-MYSYSITEM<0xF000);
//Get pointer to system menu.
CMenu* pSysmenu=GetSystemmenu (FALSE);
ASSERT_VALID (pSysMenu);
//Add a separator and our menu item to system menu.
CString StrMenuItem (_T ("New menu item"));
pSysMenu->Appendmenu (MF_SEPARATOR);
pSysMenu->AppendMenu (MF_STRING, IDM_MYSYSITEM, strMenuitem); … } 现在,选择系统菜单项时用户应进行检测。使用ClassWizard处理WM_SYSCOMMAND消息并检测用户菜单的nID参数:
void CMainFrame:: OnSysCommand (UINT nID,LPARAM lParam) {
//Determine if our system menu item was selected.
if ( (nID & 0xFFF0)==IDM_MYSYSITEM)
{ /
/TODO-process system menu item
}
else
CMDIFrameWnd:: OnSysCommand (nID, lParam);
}
最后,一个设计良好的UI应用程序应当在系统菜单项加亮时在状态条显示一个帮助信息,这可以通过增加一个包含系统菜单基ID的串表的入口来实现。
//--------------------------------------------------------------------
2.如何确定顶层菜单所占据的菜单行数
这可以通过简单的减法和除法来实现。
首先,用户需要计算主框窗口的高度和客户区;
其次,从主框窗口的高度中减去客户区、框边界以及标题的高度;
最后,除以菜单栏的高度。
下例成员函数是一个计算主框菜单所占据的行数的代码实现。
int CMainFrame:: GetMenuRows () {
CRect rcFrame,rcClient;
GetWindowRect (rcFrame);
GetClientRect (rcClient);
return (rcFrame.Height () ->rcClient.Height ()-
:: GetSystemMetrics (SM_CYCAPTION) -
(:: getSystemMetrics (SM_CYFRAME) *2)) /
:: GetSystemMetrics (SM_CYMENU); }
//--------------------------------------------------------------------
3.当用户想自己添加不知道多少的菜单项时,可以用这种方法来进行映射消息
第一步:在头文件中加入,注意0xB没有被其它资源占用了
#define ID_TEST_MENU_BGN 0xB001
#define ID_TEST_MENU_END 0xB999
long lcount;//标注新增菜单项
第二步:用消息映射范围宏将所有的这个范围的菜单消息都对应到CTestApp::FN_TEST函数中
ON_COMMAND_RANGE(ID_TEST_MENU_BGN,ID_TEST_MENU_END,CTestApp::FN_TEST)
第三步:在添加菜单中添加代码
CMenu *mainmenu;
mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单
(mainmenu->GetSubMenu (0))->AppendMenu (MF_SEPARATOR);//添加分隔符
lcount++;
CString strTmp;
strTmp.Format("Test on &Top%d",lcount);
(mainmenu->GetSubMenu (0))->AppendMenu(MF_STRING|MF_ENABLED,ID_TEST_MENU_BGN + lcount,_T(strTmp)); //添加新的菜单项
//添加新的菜单项
DrawMenuBar(); //重画菜单