




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 选单(菜单)、工具栏和状态栏一、用编辑器设计菜单菜单是一系列命令的列表,用户能够选中其中的选(菜)单项(命令)并执行相应任务。除一些简单的基于对话框的应用程序外,所有的Windows程序都提供了各自的菜单(选单)。1、竖向菜单(1)建一个SDI单文档应用程序(2)ResourceViewàMenu(双击打开)àIDR_MAINFRAMEà右面出现菜单à文件(下拉)à(想在哪儿加,可点重下边一个,按Insert键)à双击空白菜单à出现对话框à在Caption处写菜单名“窗口显示(&C)”(&为
2、快捷键标志)àID处写ID_FILE_XSà最下面的状态栏里可写点什麽à关闭对话框 (3)在Doc.h的public下加: CString str; 在Doc.cpp的构造函数里加: str=” ”;/置空 (4)将菜单ID_FILE_XS映射到View视图类中 ViewàClassWizardàMessageMapsà在Class name里置Viewà在Object IDS里找到ID_FILE_XS(你加的)à右边Messages里点黑COMMANDàAdd Functionà出现对话框,里
3、面OnFileXS点ok(对话框消失)àEdit Code进入视图文件:void View:OnFileXS() CMyDoc *pDoc=GetDocument(); ASSERT_VALID(pDoc); pDoc->str=“你成功的建立了竖向菜单”; Invalidate();(5)再在View.cpp里(往上找到) CMyView:OnDraw(CDC *Pdc) pDC->TextOut(100,100,pDoc->str); (6)运行(1)点你建的菜单,在屏幕上显示你的一行字(2)打开菜单别动,直接按C键,也出现这行字(3)将鼠标放在这个菜单上,下面
4、状态栏也出现你写的注释。 (7)若建子菜单,需在caption处写上这个菜单名后,点Pop_up便屏蔽ID,你关闭此对话框,双击出现的子菜单栏,开始建就行了。 (8)改变菜单位置 点重不放,往你想加的地方拖即可!二、横向菜单1、ResourceViewàMenuàIDR_MAINFRAMEà右面出现菜单编辑à在菜单的空位置上双击(或点重下一个,按Insert键插到哪个地方)出现对话框,你在Caption处写:“山东旅游(&S)”à点Pop_up屏蔽IDà退出。2、在下面出现的空白菜单上双击,写:烟台(&Y)à
5、Pop_upà关闭。3、旁边出现子菜单,你双击它à写”蓬莱村 Ctrl +F5”àID_SD_YT_PLàprompt处写:蓬莱仙境4、烟台下面写“青岛”à子菜单写“崂山 Ctrl +F6”àID_SD_QD_LSà注释栏 (prompt) 写:长春子丘处机,崂山道士。 5、青岛下面写:泰安à子菜单处写:泰山 Ctrl +F7àID_SD_TA_TSàprompt处写:五岳之首 6、填加速键表:(资源栏)Acceleratorà(双击)IDR_MAINFRAMEà出现加速键表
6、,你双击最下面的空白格à出现对话框àID处下拉找到ID_SD_YT_PL置好àkey处下拉,找到VK_F5置好(或置好ID后,单击Next Key Typed,按下Ctrl+5键也可)7、按第6步,将青岛崂山、泰安泰山分别置好VK_F6 ,VK_F7.8、向工具栏中加新按钮:使鼠标放在这个按钮上,就出现个小方框和菜单注释栏中的蓬莱仙境一样字样。(1)ResoureViewàToolbaràIDR_MAINFRAMEà点一下最后的空白按钮,用红刷将中间大块涂红色。(2)双击你涂好的红色按钮,出现对话框,你在ID栏下拉,找到ID_SD_Y
7、T_PL点黑置好(和烟台蓬莱菜单共用一个ID)Prompt处写:蓬莱仙境n蓬莱仙境。(如果你不想与蓬莱仙境一起显示,就写自己的工具栏ID号,自己在注释栏写东西n-à将ID映射到View中,设变量,运行后点工具栏就出现你写的东西)。 9、使菜单变灰(不被激活,不起作用) ViewàClassWizardàClassname选Viewà在ObjectTDS里找到你想屏蔽的菜单,点黑ID_SD_TA_TS,右边选UPDATE COMMAND UIàAddFoutionàEdit Codeà在此函数里写:pCmdUI->Ena
8、ble(false);(CCmdUI类是用来设置菜单的等,5.0书128页,教材257页) 10、核对菜单项,使这个菜单字的前面加个“”号,和前面一样用ClassWizard,View里连接UPDATE COMMAND UI,是哪个要被核对,就将哪个ID映射到View里,这里是ID_SD_QD_LS,并加代码: pCmdUI->Enable(true); pCmdUI->SetCheck(1);/如果括弧里写0是删除核对符 11、建立显示字符串的过程(1)在View.h里的public:写 CString str; 在View.cpp的构造函数里写: str=“ ”; (2)分别将
9、烟台蓬莱ID_SD_YT_PL、青岛崂山ID_SD_QD_LS、泰安泰山ID_SD_TA_TS映射到视图类View里,即:ViewàClassWizardà在LassName处置Viewà在ObjectIDs里分别找到以上的各个ID并点黑à点黑COMMANDàAdd Functionà各个加完后àEdit Codeà分别加代码:(青岛崂山映射函数:) str=“青岛崂山”;Invalidate();(烟台蓬莱映射函数:) str=“八仙过海”;Invalidate();(泰安泰山映射函数:) str=“五岳之首”;
10、Invalidate();(3)在OnDraw()函数里写:pDC->TextOut(50,50,str);下面回到书241页一、菜单 见241页说明1、 用编辑器设计菜单(1) 建一个单文档应用程序(2) ResourceViewà双击Menu项中的IDR_MAINFRAMEà右边最后一个空位置双击à出现属性对话框à改ID号为ID_SCORE_INàCaption处写:成绩输入à关闭。见242页:表6.1选单General属性对话框的各项含义例:241、242、243、244页(3) 以上为作业,上机完成。(先建单文档,建菜单
11、ID_SCORE_IN 成绩输入(&S),加消息映射 将ID_SCORE_IN用COMMAND加到主框架CMainFrame里)。加代码:void CMainFrame:OnScoreIn() AfxMessageBox(“现在就输入成绩吗?“);试一下Alt+s组合键,必须好用。 解释AfxMessageBox(LPCTSTR lpszText,UINT nType=MB_OK,UINT nIDHelp=0);是全程函数,可以用在任何地方。参数:lpszText表示在消息对话框中显示的字符串文本。 nType表示消息对话框的图标类型以及所包含的按钮类型。 nIDHelp表示消息的上下
12、文帮助ID号。MessageBox(LPCTSTR lpszText,LPCTSTR lpszCaption=NULL,UINT nType=MB_OK) 该函数只能用于控件、对话框、窗口等一些窗口类中。(4)使用键盘快捷键(加速键)A、打开此例的项目工作区窗口中的Accelerator的资源项,双击IDR_MAINFRAME,出现加速键表。B、你双击最下面的空行,弹出书245页图6.10,其中可设置属性如:书245页ID处下拉找到ID_SCORE_IN,Key处下拉找到VK_F5置好(单击Next Key Typed,按下Ctrl+F5键也可),(在对话框属性名字处后面加:Ctrl +F5)
13、。 C、运行程序 按Ctrl +F5将弹出对话框。2、菜单的编程控制 在交互式软件的设计中,菜单有时会随着用户操作的改变而改变,这时的菜单就需要在程序中进行控制。菜单的基本操作MFC提供的菜单类CMenu可在程序运行时,处理有关菜单的操作:如: 创建菜单、装入菜单、删除菜单、获取菜单或设置菜单的状态等。a) 创建菜单BOOL CreateMenu(); 产生一个空菜单BOOL CreatePopupMenu();产生一个空的弹出式子菜单b) 装入菜单(将菜单从资源装入应用程序)BOOL LoadMenu(LPCTSTR lpszResourceName);菜单资源名称BOOL LoadMenu
14、(UINT nIDResource);菜单资源ID号c) 添加菜单项BOOL AppendMenu(UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL); BOOL AppendMenu(UINT nFlags,UINT nIDNewItem,const CBitmap *pBmp); BOOL InSertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem=0, LPCTSTR lpszNewItem=NULL); BOOL InSertMenu(UINT nPosition,UINT nF
15、lags,UINT nIDNewItem, const CBitmap *pBmp);其中:nIDNewItem 表示新菜单项的资源ID号 lpszNewItem表示新菜单项的内容 pBmp 用于菜单项的位图指针 nPosition 表示新菜单项要插入的菜单项位置 nFlags表示要增加的新菜单项的状态信息(见246页表)d) 删除菜单项BOOL DeleteMenu(UINT nPosition,UINT nFlags);其中:nPosition表示要删除的菜单项位置 当:Flags为MF_BYCOMMAND时,nPosition表示菜单项ID号 当:Flags为MF_BYPOSITION时
16、,nPosition表示菜单项的位置(第一个菜单项为0)e) 获取菜单项UINT GetMenuItemCount()const;获得菜单项的项数,调用失败返回-1.UINT GetMenuItemID(int nPos)const;获得由nPos指定菜单项位置(以0为基数)的菜单项的标识号,若nPos是SEPARATOR则返回-1. CMenu *GetSubMenu(int nPos)const; 获得指定菜单的弹出式菜单的菜单句柄,该弹出式菜单由参数nPos指定,开始位置为0,若选单不存在,则创建一个临时的菜单指针。3、 给系统菜单添加一个菜单项(书247页)例:a)打开前面的程序或新建
17、一个单文档(SDI)应用程序b)ViewàResourceSymbols弹出书247页图6.11的对话框c)接书247页(3)往下作 - 按书上步骤作。书(4)在int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) CMenu *pSysMenu=GetMenu();/获得主选单句柄 CMenu *pSubMenu=pSysMenu->GetSubMenu(1);/获得第二个子选单句柄 CString StrMenuItem(“新的选单项”); pSubMenu->AppendMenu(MF_SEPARATOR);/
18、增加一水平分割线 pSubMenu->AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem); /在子选单中增加一选单项,允许使用ON_UPDATE_COMMAND_UI或 /ON_COMMAND的选单项 m_bAutoMenuEnable=FALSE;/使添加的选单处于允许状态默认为灰显 pSysMenu->EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND| MF_ENABLED); DrawMenuBar();/更新选单 return 0;书(5)使用ClassWizard处理OnCommand消
19、息并检测用户选单的nID参数 View->ClassWizard->在Class name处下拉置CMainFrame ->Messages处找到OnCommand消息映射到CMainFrame里并添代码: BOOL CMainFrame:OnCommand(WPARAM wParam,LPARAM lParam) /wParam的低字节表示选单、控件、加速键的命令IDif(LOWORD(wParam)=ID_NEW_MENUITEM) MessageBox(“你选中了新的选单项”);书(6)编译运行并测试。编辑->新的选单项;弹出对话框,显示“你选中了新的选单项” 4
20、、 使用快捷菜单快捷菜单是一种浮动的弹出式菜单,它是一种新的用户界面,当用户按下鼠标右键时,就会相应地弹出一个浮动菜单。用资源编辑器和MFC库的如下函数: CMenu:TrackPopupMenu() 其原形如下: BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd *pWnd, LPCRECT lpRect=NULL); nFlags表示菜单在屏幕显示的位置以及鼠标按钮标志,见248页。 x,y表示菜单的水平坐标和菜单的顶端的垂直坐标。 pWnd表示弹出菜单的窗口,此窗口将收到菜单的全部WM_COMMAND消息。 lpRect是一个RECT结构或
21、CRect对象指针,它表示一个矩形区域,用户单击这个区域时,弹出菜单不消失,当lpRect为NULL时,若用户在菜单外面单击,菜单立刻消失。例:创建弹出式菜单( 快捷菜单)(按书249页步骤作) 1、打开上一个应用程序或创建一个单文档应用程序 2、InsertàResourceà点黑MenuàNewà便在Menu资源下出现一个新菜单资源(默认的ID号为IDR_MENU1) 3、双击这个菜单资源,文档区出现一个空白菜单项,你为它起个名叫“弹出式菜单”,关闭à点开下面的子菜单,按书上249页表6.5置好ID号等并按书上的操作步骤作完。书(5)voi
22、d CMainFrame:OnMenuScorein() AfxMessageBox(“现在就输入成绩吗?”); 书(6)在CMainFrame类(或其它类)加入WM_CONTEXTMENU消息处理函数,添加代码:void CMainFrame:OnContextMenu(CWnd *pWnd,CPoint point) CMenu menu; menu.LoadMenu(IDR_MYFLOATMENU);/刚才加上的菜单资源 menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN| TPM_RIGHTBUTTON,point.x,point.y
23、,this); 书(7)运行并测试,你在出现的应用程序窗口中,单击右键会出现书249页的图(快捷选单)你再按成绩输入会出现已写好的“现在就输入成绩吗?”; 注意:若按“成绩输入”有信息在窗口显示则: 在View.h里写:CString str; 将ID_MENU_SCOREIN映射到View中,在此函数中加: str=“你按了成绩输入”; 在OnDraw()里:pDC->TextOut(0,0,str);5、工具栏 工具栏是一系列工具按钮的组合,借助它们可以提高用户的工作效率。(1)打开上个程序或新创建一个SDI单文档应用程序。(2)ResourceViewàToobar
24、24;IDR_MAINFRAMEà点最后一个空的工具栏à涂红色后à再双击出现属性对话框,ID处找到:ID_SCORE_IN置好à在prompt框内键入“向系统输入学生成绩n成绩输入”(3)编译运行(在状态拦上出现上面的字,鼠标放在工具拦上就出现一个成绩输入框)(4)如果不和菜单一起用:1、第二步写ID_FILE_NEW后2、将ID_FILE_NEW映射到View里,并添代码:View.h里:CString str;View.cpp构造函数里写:str=” “;在映射函数里写:str=“工具栏”;Invalidate(); OnDrew()里写:pDC-&
25、gt;TextOut(0,0,str);6、状态栏 状态栏是一条水平长条,位于应用程序的主窗口的底部,它可以分割成几个窗格,用来显示多组信息。 1)状态栏的定义 在AppWizard创建的SDI或MDI应用程序框架的MainFrm.cpp文件中有一个静态数组INDICATOR数组,它被MFC用做状态栏的定义。打开主框架.cpp程序:这个数组中的元素是一些标识常量或是字符串资源的ID号,默认的indicator数组包含了4个元素: 见书253页图2)状态栏的常用操作 MFC的CStatusBar类封装了状态栏的大部分操作 如:增加窗格,在状态栏中显示文本,改变状态栏的风格和大小等。* 增加和减少
26、窗格状态栏的窗格可分为信息行窗格和指示器窗格2类:a、 若增加一个信息行窗格,则在indicators数组中的适当位置增加一个: ID_SEPARATORb、 若在状态栏中增加一个用户指示器窗格,则在indicators数组中的适当位置增加一个在字符串表中定义过的资源ID,其字符串的长度表示用户指示器窗格的大小。c、 若减少,其操作与增加类似,只需减少indicators数组元素。例:在状态栏的最右边两个窗格中显示出当前鼠标在窗口客户区的位置。 (按 书253页步骤作)书第(5)afx_msg void OnUpdateXY(CCmdUI *pCmdUI);CCmdUI 类:其数据成员:m_n
27、ID用户界面元素对象的ID,m_nIndex用户界面书第(6)ON_UPDATE_COMMAND_UI(ID_LEFT,OnUpdateXY) ON_UPDATE_COMMAND_UI(ID_RIGHT,OnUpdateXY)书第(7)void CMyView:OnUpdateXY(CCmdUI *pCmdUI) /(整个函数,包括此条都用手写) pCmdUI->Enable(TRUE);/使窗格文本能被更新 书第(8)void CMyView:OnMouseMove(UINT nFlags,CPoint point) CString str; CMainFrame *pFrame=(C
28、MainFrame*)AfxGetApp()->m_pMainWnd; /获得主窗口指针 CStatusBar *pStatus=&pFrame->m_wndStatusBar; /获得主窗口中的状态栏指针 if(pStatus) str.Format(“X=%d”,point.x);/格式化文本 pStatus->SetPaneText(2,str);/更新第三个窗格的文本 str.Format(“Y=%d”,point.y); pStatus->SetPaneText(3,str);/更新第四个窗格的文本 书256页:pStatus->SetPaneStyle(2,SBPS_POPOUT);/见256页上面表 pStatus->SetPaneStyle(3,SBPS_POPOUT);/说明7、交互对象的动态更新用户交互对象是指可由用户操作而产生命令消息的对象,如:选单项、工具条中的按钮和加速键,每个用户交互对象都有一个ID号,在发送消息时,该ID号被包含在WM_COMMAND消息中。特别是:菜单项可以有灰色显示,选中和未选中三种状态,而工具栏按钮则可以有禁止和选中状态等。例:菜单项和工具按钮的更新(按书257页-258页作)PC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论