第8章 菜单、工具栏和状态栏设计_第1页
第8章 菜单、工具栏和状态栏设计_第2页
第8章 菜单、工具栏和状态栏设计_第3页
第8章 菜单、工具栏和状态栏设计_第4页
第8章 菜单、工具栏和状态栏设计_第5页
已阅读5页,还剩128页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论