菜单操作的几种方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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(); //重画菜单

相关文档
最新文档