版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章菜单、工具栏和状态栏设计8.1菜单设计8.1.1菜单资源设计
(1)在工作区的ResourceView选项卡中,用鼠标右键单击某个节点,将弹出一个快捷菜单,如图8.1所示。图8.1弹出菜单
(2)在弹出的快捷菜单中选择Insert菜单项,打开InsertResource窗口,如图8.2所示。图8.2插入资源对话框
(3)在Resourcetype列表框中选择Menu节点,单击“New”按钮,创建一个菜单,如图8.3所示。图8.3菜单设计窗口1
(4)在菜单设计窗口中,按〈Enter〉键打开属性窗口,设计菜单标题,如图8.4所示。图8.4菜单项属性窗口1
(5)按〈Enter〉键保存设置,返回到菜单设计窗口,如图8.5所示。图8.5菜单设计窗口2
(6)如果用户需要设计子菜单,可以选中下方的虚边框,按〈Enter〉键打开菜单项属性窗口,在属性窗口中设置菜单项标题和菜单ID,如图8.6所示。图8.6菜单项属性窗口2
(7)按〈Enter〉键保存设置,返回到菜单设计窗口,如图8.7所示。图8.7菜单设计窗口3
(8)如果用户想要设计一个级联菜单,可以在菜单项的属性窗口中选中Pop-up复选框,这样,在菜单项的右侧将显示一个箭头,效果如图8.8所示。图8.8级联菜单8.1.2菜单项的命令处理
(1)单击菜单栏中的“View”/“ClassWizard…”命令,打开MFCClassWizard窗口,并选择MessageMaps选项卡,在ObjectIDs列表框中选择一个菜单项,如图8.20所示。图8.20类向导
(2)在该窗口的Messages列表框中双击COMMAND,将打开“添加成员函数”窗口,如图8.21所示。图8.21添加成员函数窗口
(3)单击OK按钮即可编写命令消息处理
代码,代码编辑器中将显示消息处理函数,如图8.22所示。图8.22代码编辑器
(4)运行程序时,当用户单击菜单项时,将执行其命令消息处理函数。8.1.3菜单项的更新机制
在使用类向导为菜单添加命令处理函数时,发现菜单除了COMMAND消息外,还有一个UPDATE_COMMAND_UI消息,该消息是“更新命令用户接口消息”。
(1)打开一个基于单文档的应用程序,运行程序后发现“编辑”菜单下的菜单项都不可用,如图8.23所示。图8.23运行结果
(2)如果要使“编辑”菜单下的菜单项都可用,就要为相应的菜单项处理UPDATE_COMMAND_
UI消息,以“撤销”菜单项为例,打开类向导,选择MessageMaps选项卡,在Classname下拉列表中选择CMainFrame类。
在ObjectIDs列表框中选择“撤销”菜单项ID_EDIT_UNDO;在Messages列表框中选择UPDATE_COMMAND_UI项,如图8.24所示。图8.24类向导
(3)单击AddFunction…按钮即可创建该消息的处理函数。
(4)单击EditCode按钮即可定位到新建的消息处理函数,在函数中添加代码使“撤销”菜单项可用。代码如下:voidCMainFrame::OnUpdateEditUndo(CCmdUI*pCmdUI){
pCmdUI->Enable();//使菜单项可用}(5)运行程序,效果如图8.25所示。图8.25菜单项的更新机制8.1.4菜单类介绍(1)Attach方法Attach方法用于将句柄关联到菜单对象上。语法:BOOLAttach(HMENUhMenu);(2)Detach方法Detach方法从菜单对象上分离菜单句柄,方法返回分离的菜单句柄。语法:HMENUDetach();(3)FromHandle方法
FromHandle方法根据菜单句柄返回一个菜单对象指针。语法:staticCMenu*PASCALFromHandle(HMENUhMenu);(4)CreateMenu方法
CreateMenu方法用于创建一个菜单窗口,并将其关联到菜单对象上。语法:BOOLCreateMenu();(5)CreatePopupMenu方法
CreatePopupMenu方法用于创建一个弹出式菜单窗口,并将其关联到菜单对象上。语法:BOOLCreatePopupMenu();(6)LoadMenu方法
LoadMenu方法从应用程序的可执行文件中加载一个菜单资源,将其关联到菜单对象上。语法:BOOLLoadMenu(LPCTSTRlpszResourceName);BOOLLoadMenu(UINTnIDResource);(7)DestroyMenu方法
DestroyMenu方法用于释放菜单窗口,当菜单窗口被释放前,它将从菜单对象上分离出来。语法:BOOLDestroyMenu();
(8)DeleteMenu方法
DeleteMenu方法用于从菜单中删除一个菜单项。语法:BOOLDeleteMenu(UINTnPosition,UINTnFlags);(9)TrackPopupMenu方法
TrackPopupMenu方法用于显示一个弹出式菜单。语法:BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);(10)AppendMenu方法
AppendMenu方法在菜单项的末尾添加一个新菜单。语法:BOOLAppendMenu(UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);BOOLAppendMenu(UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);(11)CheckMenuItem方法
CheckMenuItem方法用于在弹出的菜单项中放置或删除标记。语法:UINTCheckMenuItem(UINTnIDCheckItem,UINTnCheck);(12)CheckMenuRadioItem方法
CheckMenuRadioItem方法用于将
单选按钮放置在菜单项之前,或从组中所有的其他菜单项中删除单选按钮。语法:BOOLCheckMenuRadioItem(UINTnIDFirst,UINTnIDLast,UINTnIDItem,UINTnFlags);(13)EnableMenuItem方法
EnableMenuItem方法用于设置菜单项有效、无效或变灰。语法:UINTEnableMenuItem(UINTnIDEnableItem,UINTnEnable);(14)GetMenuItemCount方法
GetMenuItemCount用于返回弹出式菜单或顶层菜单的菜单数。语法:UINTGetMenuItemCount()const;(15)GetMenuItemID方法
GetMenuItemID方法根据菜单项的位置返回菜单ID,如果菜单项是一个弹出式菜单,则返回值为-1,如果菜单项是一个分隔条,则返回值为0。语法:UINTGetMenuItemID(int
nPos)const;(16)GetMenuState方法
GetMenuState方法用于返回指定菜单项的状态或弹出菜单的项数。语法:UINTGetMenuState(UINTnID,UINTnFlags)const;(17)GetMenuString方法
GetMenuString方法用于获取菜单项的文本。语法:int
GetMenuString(UINTnIDItem,LPTSTRlpString,int
nMaxCount,UINTnFlags)const;int
GetMenuString(UINTnIDItem,CString&rString,UINTnFlags)const;(18)GetSubMenu方法
GetSubMenu方法用于获取弹出式菜单中的一个菜单项。语法:CMenu*GetSubMenu(int
nPos)const;(19)InsertMenu方法
InsertMenu方法用于向菜单中指定位置插入菜单项。语法:BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem
=NULL);BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);(20)ModifyMenu方法
ModifyMenu方法用于修改菜单项信息。语法:BOOLModifyMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem
=NULL);BOOLModifyMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);(21)RemoveMenu方法
RemoveMenu方法用于移除一个菜单项。语法:BOOLRemoveMenu(UINTnPosition,UINTnFlags);(22)DrawItem方法
DrawItem方法是一个虚方法,用户可以改写该方法实现菜单的绘制。语法:virtualvoidDrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct);8.1.5使用菜单类创建菜单
首先需要创建一个菜单,步骤如下。
(1)在对话框类中定义一个菜单对象,调用CreateMenu方法创建菜单资源。
(2)调用AppendMenu或InsertMenu方法创建菜单项,设置菜单文本和命令ID。
然后为菜单项关联命令消息处理函数,步骤如下。
(1)在对话框类中添加一个消息处理函数。
(2)在对话框类的消息映射部分添加ON_COMMAND消息映射宏,将菜单
项的命令ID与消息处理函数关联。
程序设计具体步骤如下。(1)创建一个基于对话框的应用程序。(2)在主窗口中定义一个菜单成员变量。
CMenu
m_Menu;
(3)在对话框的源文件中定义两个菜单的命令消息。//定义菜单资源命令ID#defineID_MENUADD35610#defineID_MENUUPDATE35611
(4)在主窗口的头文件中添加消息处理函数,代码如下:afx_msgvoidAddInfo();
(5)在主窗口的源文件中编写消息处理函数AddInfo的实现代码。voidCDynamiMenuDlg::AddInfo(){MessageBox("基础信息添加!","提示");}
(6)在主对话框的消息映射部分添加命令消息映射宏,将菜单项的命令ID与消息处理函数关联。BEGIN_MESSAGE_MAP(CDynamiMenuDlg,CDialog)//{{AFX_MSG_MAP(CDynamiMenuDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_COMMAND(ID_MENUADD,AddInfo)//}}AFX_MSG_MAPEND_MESSAGE_MAP()
(7)在主窗口的OnInitDialog方法中编写代码,创建菜单项。//创建空的菜单资源m_Menu.CreateMenu();
//创建父菜单m_Menu.AppendMenu(MF_STRING,-1,"系统");//创建子菜单CMenu
subMenu;subMenu.CreatePopupMenu();subMenu.AppendMenu(MF_STRING,ID_MENUADD,"信息添加");subMenu.AppendMenu(MF_STRING,ID_MENUUPDATE,"信息修改");//创建一个父菜单,将子菜单作为父菜单的级联菜单m_Menu.AppendMenu(MF_POPUP,(UINT)subMenu.m_hMenu,"基础信息");
//创建父菜单m_Menu.AppendMenu(MF_STRING,-1,"库存管理");//将菜单对象与菜单资源分离subMenu.Detach();//将菜单关联到对话框资源上SetMenu(&m_Menu);(8)运行程序,效果如图8.26所示。图8.26使用菜单类创建菜单8.2工具栏设计8.2.1工具栏资源设计
(1)在工作区的ResourceView选项卡中,鼠标右键单击根节点,在弹出的快捷菜单中
选择“Insert”菜单项,打开InsertResource窗口,如图8.27所示。图8.27插入资源窗口
(2)选择Toolbar选项,单击New按钮创建工具栏窗口,如图8.28所示。图8.28工具栏窗口
(3)在工具栏窗口中绘制工具栏按钮。当用户在按钮上绘制图像后,工具栏窗口会创建一个新的工具栏按钮,如图8.29所示。图8.29绘制工具栏按钮
(4)如果用户想要删除工具栏窗口中的某个按钮,可以先选中该按钮,然后按住鼠标左键,将其拖出工具栏即可。
(5)在设计完工具栏按钮后,需要为工具栏按钮设置命令ID,如果不指定,系统会为每个工具栏按钮设置一个默认的ID。选中工具栏按钮,按〈Enter〉键打开属性对话框,通过属性对话框可以设置工具栏按钮ID,如图8.30所示。图8.30属性窗口8.2.2工具栏的命令处理
(1)单击菜单栏中的“View”/“ClassWizard…”命令,打开MFCClassWizard窗口,并选择MessageMaps选项卡,在ObjectIDs列表框中选择一个菜单项,如图8.31所示。图8.31类向导窗口
(2)在该窗口的Messages列表中双击COMMAND选项,打开添加成员函数窗
口,如图8.32所示。图8.32添加成员函数
(3)单击OK按钮,代码编辑器中将显示添加的消息处理函数,如图8.33所示。图8.33代码编辑器8.2.3工具栏类(CToolBar)介绍(1)Create方法Create方法用于创建工具栏窗口。语法:BOOLCreate(CWnd*pParentWnd,DWORDdwStyle=WS_CHILD|WS_VISIBLE|CBRS_TOP,UINTnID=AFX_IDW_TOOLBAR);(2)CreateEx方法
CreateEx方法与Create方法类似,用于创建工具栏窗口,只是该方法支持工具栏的扩展风格。语法:BOOLCreateEx(CWnd*pParentWnd,DWORDdwCtrlStyle=TBSTYLE_FLAT,DWORDdwStyle=WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP,CRect
rcBorders=CRect(0,0,0,0),(3)SetSizes方法
SetSizes方法用于设置按钮和位图的大小。语法:voidSetSizes(SIZEsizeButton,SIZEsizeImage);(4)SetHeight方法
SetHeight方法用于设置工具栏的高度。语法:voidSetHeight(int
cyHeight);(5)LoadToolBar方法
LoadToolBar方法用于加载工具栏资源。语法:BOOLLoadToolBar(LPCTSTRlpszResourceName);BOOLLoadToolBar(UINTnIDResource);(6)LoadBitmap方法
LoadBitmap方法用于加载一个位图资源,位图中包含了每个工具栏按钮的图像。语法:BOOLLoadBitmap(LPCTSTRlpszResourceName);BOOLLoadBitmap(UINTnIDResource);(7)SetBitmap方法
SetBitmap方法用于设置工具栏按钮位图。语法:BOOLSetBitmap(HBITMAPhbmImageWell);(8)SetButtons方法
SetButtons方法用于向工具栏中添加按钮,并设置按钮的ID和图像索引。语法:BOOLSetButtons(constUINT*lpIDArray,int
nIDCount);(9)CommandToIndex方法
CommandToIndex方法根据工具栏
按钮ID返回按钮索引,如果按钮ID没有对应的按钮,返回值为-1。语法:int
CommandToIndex(UINTnIDFind);(10)GetItemID方法
GetItemID方法根据按钮索引返回按钮ID。语法:UINTGetItemID(int
nIndex)const;(11)GetItemRect方法
GetItemRect方法根据按钮索引获取工具栏按钮的显示区域。语法:virtualvoidGetItemRect(int
nIndex,LPRECTlpRect);(12)GetButtonStyle方法
GetButtonStyle方法用于获得按钮的风格。语法:UINTGetButtonStyle(int
nIndex)const(13)SetButtonStyle方法
SetButtonStyle方法用于设置某个按钮风格。语法:voidSetButtonStyle(int
nIndex,UINTnStyle);(14)GetButtonInfo方法
GetButtonInfo方法用于获取按钮信息。语法:voidGetButtonInfo(int
nIndex,UINT&nID,UINT&nStyle,int&iImage)const;(15)SetButtonInfo方法
该方法用于设置按钮的信息。语法:voidSetButtonInfo(int
nIndex,UINTnID,UINTnStyle,int
iImage);(16)GetButtonText方法
GetButtonText方法用于获取工具栏按钮文本。语法:CString
GetButtonText(int
nIndex)const;voidGetButtonText(int
nIndex,CString&rString)const;(17)SetButtonText方法
GetButtonText方法用于设置按钮文本。语法:BOOLSetButtonText(int
nIndex,LPCTSTRlpszText);(18)GetToolBarCtrl方法
GetToolBarCtrl方法用于访问底层的工具栏按钮通用控件。
函数返回一个CToolBarCtrl类对象。语法:CToolBarCtrl&GetToolBarCtrl()const;8.2.4使用工具栏类创建工具栏
(1)创建一个基于对话框的应用程序。
(2)按照8.2.1节介绍的方法设计一个工具栏资源,资源ID为IDR_MAINFRAME。
(3)在对话框类中定义一个工具栏对象m_Toolbar。
(4)在对话框的OnInitDialog方法中创
建工具栏窗口,加载工具栏资源。BOOLCDesignToolDlg::OnInitDialog(){
CDialog::OnInitDialog();ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){CStringstrAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}
m_Toolbar.Create(this);
m_Toolbar.LoadToolBar(IDR_MAINFRAME);RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
SetIcon(m_hIcon,TRUE);
SetIcon(m_hIcon,FALSE);returnTRUE;}(5)运行程序,效果如图8.34所示。图8.34使用工具栏类创建工具栏窗口8.3状态栏设计8.3.1状态栏类(CStatusBar)介绍(1)Create方法Create方法用于创建状态栏窗口。语法:BOOLCreate(CWnd*pParentWnd,DWORDdwStyle=WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,UINTnID=AFX_IDW_STATUS_BAR);(2)CreateEx方法
CreateEx方法与Create方法类似,用于创建状态栏窗口,只是该方法支持扩展风格。语法:BOOLCreateEx(CWnd*pParentWnd,DWORDdwCtrlStyle=0,DWORDdwStyle=WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,UINTnID=AFX_IDW_STATUS_BAR);(3)SetIndicators方法
SetIndicators方法用于向状态栏中添加面板,并设置面板ID。语法:BOOLSetIndicators(constUINT*lpIDArray,int
nIDCount);(4)CommandToIndex方法
CommandToIndex方法用于根据面板ID返回面板索引。语法:int
CommandToIndex(UINTnIDFind)const;(5)GetItemID方法
GetItemID方法与CommandToIndex方法是相对的,根据面板索引返回面板ID。语法:UINTGetItemID(int
nIndex)const;(6)GetItemRect方法
GetItemRect方法用于获取某个面板的显示区域。语法:voidGetItemRect(int
nIndex,LPRECTlpRect)const;(7)GetPaneInfo方法
GetPaneInfo方法用于获取面板信息。语法:voidGetPaneInfo(int
nIndex,UINT&nID,UINT&nStyle,int&cxWidth)const;(8)GetPaneStyle方法
GetPaneStyle方法用于获取面板风格。语法:UINTGetPaneStyle(int
nIndex)const;(9)GetPaneText方法
GetPaneText方法用于获取面板文本。语法:CString
GetPaneText(int
nIndex)const;voidGetP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏省知识产权知识竞赛考试试题与答案
- 2026年湖北随州市(党建基础知识)专业技术职务水平能力测试模拟试题及答案
- 2026春人教版一年级下册数学期末易错题专项训练试卷及答案
- 护理教师教学研究方法课件下载
- 云南省昆明市盘龙区2025-2026学年九年级上学期期末语文试题(解析版)
- 急性肺水肿的护理研究与发展趋势
- 甘肃省靖远县2025-2026学年下学期高一期中地理试卷(答案不全)
- 护理人才需求分析与发展趋势
- 慢性胃炎的护理措施
- 护理课件教学难度评价
- 2025年甘肃庆阳市地理生物会考真题试卷(+答案)
- 北京市西城区2026年中考二模英语试题(含答案)
- (三模)济南市2026届高三5月针对性训练生物试卷(含答案)
- 2026宁夏电投永利能源有限公司招聘21人考试备考题库及答案解析
- 金牛区驷马桥等街道2026年公开招聘社区专职工作人员(26人)笔试备考试题及答案详解
- 2026中国报废汽车拆解行业盈利动态与需求趋势预测报告
- 2026年无损检涡流检二级考核模拟题库附参考答案详解【考试直接用】
- 2026年春教科版(新教材)小学科学三年级下册第三单元《只有一个地球》知识点清单
- 西安交通大学同等学力人员申请硕士学位资格审查表
- PCB常见不良品图片及改善措施汇总
- 苏教版八年级(上)期末文言文复习《活板》
评论
0/150
提交评论