VC++实用教程(第4版)PPT 第6章 基本界面元素_第1页
VC++实用教程(第4版)PPT 第6章 基本界面元素_第2页
VC++实用教程(第4版)PPT 第6章 基本界面元素_第3页
VC++实用教程(第4版)PPT 第6章 基本界面元素_第4页
VC++实用教程(第4版)PPT 第6章 基本界面元素_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

第6章基本界面元素

6.1图标和光标6.2菜

单6.3工具栏6.4状态栏6.5交互对象的动态更新6.1图标和光标6.1.1图像编辑器1.创建一个新的图标或光标图6.1所示是添加一个新的图标资源后出现的图像编辑器。新设备按钮6.1.1图像编辑器对于创建的新光标,其“热点”被初始化为左上角的点,坐标为(0,0)。默认情况下,图像编辑器所支持的显示设备如表6.1所示。设

备颜色数目宽

度高

度单显模式(Monochrome)23232小设备模式(Small)161616标准模式(Standard)163232大模式(Large)25648486.1.1图像编辑器2.选用和定制显示设备在图像编辑器工作窗口的控制条上,有一个“新设备图像”(NewDeviceImage)按钮

,单击此按钮后,系统弹出相应的新设备列表,可以从中选取需要的显示设备,如图6.2所示。除了对话框列表框显示的设备外,还可以单击

按钮,在弹出的对话框中定制新的显示设备,如图6.3所示,在这里可指定新设备图像的大小和颜色。

6.1.1图像编辑器3.设置光标热点在图像编辑器的控制条上或光标属性对话框中都可以看到当前的光标“热点”位置。图6.4所示是添加一个新的光标资源后出现的图像编辑器。控制条设置热点按钮6.1.2图标1.图标的调入和清除在MFC中,当在应用程序中添加一个图标资源后,就可以使用CWinApp::LoadIcon函数将其调入并返回一个图标句柄。函数原型如下:HICONLoadIcon(LPCTSTRlpszResourceName)const;HICONLoadIcon(UINTnIDResource)const;如果不想使用新的图标资源,也可使用系统中预定义的标准图标,这时需调用CWinApp::LoadStandardIcon函数,其原型如下:HICONLoadStandardIcon(LPCTSTRlpszIconName)const;其中,lpszIconName可以是下列值之一:IDI_APPLICATION 默认的应用程序图标IDI_HAND 手形图标(用于严重警告)IDI_QUESTION 问号图标(用于提示消息)IDI_EXCLAMATION 警告消息图标(惊叹号)IDI_ASTERISK 消息图标图标装载后,可使用全局函数DestroyIcon来删除图标,并释放为图标分配的内存,其原型如下:BOOLDestroyIcon(HICONhIcon);6.1.2图标2.图标的显示图标的显示一般有两种方法:一是通过静态图片控件来显示,或在其他控件(如按钮)设置显示;二是通过函数CDC::DrawIcon将一个图标绘制在指定设备的位置处,函数原型如下:BOOLDrawIcon(intx,inty,HICONhIcon);BOOLDrawIcon(POINTpoint,HICONhIcon);6.1.2图标3.应用程序图标的改变实际上,程序中还可使用GetClassLong和SetClassLong函数重新指定应用程序窗口的图标,函数原型如下:DWORDSetClassLong(HWNDhWnd,intnIndex,LONGdwNewLong);DWORDGetClassLong(HWNDhWnd,intnIndex);其中,hWnd用来指定窗口类句柄,dwNewLong用来指定新的32位值。nIndex用来指定与WNDCLASSEX结构相关的索引,它可以是下列值之一:GCL_HBRBACKGROUND 窗口类的背景画刷句柄GCL_HCURSOR 窗口类的光标句柄GCL_HICON 窗口类的图标句柄GCL_MENUNAME 窗口类的菜单资源名称6.1.2图标【例Ex_Icon】

图标的使用(1)用MFCAppWizard(exe)创建一个默认的单文档应用程序Ex_Icon。(2)添加4个图标资源,单击“新建设备图像”按钮

,选择“小的(16×16)”设备类型,保留图标资源默认的ID(IDI_ICON1~

IDI_ICON4),制作如图6.5所示的图标。6.1.2图标(3)为CMainFrame类添加一个成员函数ChangeIcon,用来切换应用程序的图标。该函数的代码如下:voidCMainFrame::ChangeIcon(UINTnIconID){ HICONhIconNew=AfxGetApp()->LoadIcon(nIconID); HICONhIconOld=(HICON)GetClassLong(m_hWnd,GCL_HICON); if(hIconNew!=hIconOld) { DestroyIcon(hIconOld); SetClassLong(m_hWnd,GCL_HICON,(long)hIconNew); RedrawWindow(); //重绘窗口 }}6.1.2图标(4)在CMainFrame::OnCreate函数的最后添加计时器设置代码:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return-1; //…… SetTimer(1,500,NULL); return0;}6.1.2图标(5)用MFCClassWizard为CMainFrame类添加WM_TIMER的消息映射函数,并增加下列代码:voidCMainFrame::OnTimer(UINTnIDEvent){ staticinticons[]={IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4}; staticintindex=0; ChangeIcon(icons[index]); index++; if(index>3)index=0; CFrameWnd::OnTimer(nIDEvent);}6.1.2图标(6)用MFCClassWizard为CMainFrame类添加WM_DESTROY的消息映射函数,并增加下列代码:voidCMainFrame::OnDestroy(){ CFrameWnd::OnDestroy(); KillTimer(1);}(7)编译并运行。可以看到任务栏上的按钮,以及应用程序的标题栏上4个图标循环显示的动态效果,显示速度为2帧/秒。6.1.3光标1.使用系统光标Windows预定义了一些经常使用的标准光标,这些光标均可以使用函数CWinApp::LoadStandardCursor加载到程序中,其函数原型如下:HCURSORLoadStandardCursor(LPCTSTRlpszCursorName)const;其中,lpszCursorName用来指定一个标准光标名,它可以是下列宏定义:IDC_ARROW 标准箭头光标

IDC_IBEAM 标准文本输入光标IDC_WAIT 漏斗形计时等待光标

IDC_CROSS 十字形光标IDC_UPARROW 垂直箭头光标

IDC_SIZEALL 四向箭头光标IDC_SIZENWSE 向下的双向箭头光标

IDC_SIZENESW 向上的双向箭头光标IDC_SIZEWE 左右双向箭头光标

IDC_SIZENS 上下双向箭头光标6.1.3光标2.使用光标资源用编辑器创建或从外部调入的光标资源,可通过函数CWinApp::LoadCursor进行加载,其原型如下:HCURSORLoadCursor(LPCTSTRlpszResourceName)const;HCURSORLoadCursor(UINTnIDResource)const;3.更改程序中的光标更改应用程序中的光标除了可以使用GetClassLong和SetClassLong函数外,最简单的方法是用MFCClassWizard映射WM_SETCURSOR消息,该消息是当光标移动到一个窗口内并且还没有捕捉到鼠标时产生的。CWnd为此消息的映射函数定义这样的原型:afx_msgBOOLOnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage);6.1.3光标6.1.3光标(4)保留默认的ID(IDC_CURSOR1),用图像编辑器绘制光标图形,指定光标热点位置为(15,15),结果如图6.6所示。6.1.3光标(5)为CMainFrame类添加一个成员变量m_hCursor,变量类型为光标句柄HCURSOR。用MFCClassWizard为CMainFrame类添加WM_SETCURSOR的消息映射函数,并增加下列代码:BOOLCMainFrame::OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage){ BOOLbRes=CFrameWnd::OnSetCursor(pWnd,nHitTest,message); if(nHitTest==HTCAPTION) { m_hCursor=LoadCursorFromFile("c:\\windows\\cursors\\hand.ani"); SetCursor(m_hCursor); bRes=TRUE; }elseif(nHitTest==HTCLIENT) { m_hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR1); SetCursor(m_hCursor); bRes=TRUE; } returnbRes;}6.2菜

单6.2.1菜单一般规则对于菜单系统的设计还应遵循下列一些规则(参考图6.7)。顶层菜单弹出菜单6.2.2更改应用程序菜单【例Ex_MenuSDI】

更改并切换应用程序菜单(1)用MFCAppWizard(exe)创建一个默认的单文档应用程序Ex_MenuSDI。(2)将项目工作区窗口切换到ResourceView页面,展开资源节点,双击资源“Menu”节点下的IDR_MAINFRAME项,则菜单编辑器窗口出现在主界面的右边,且项目Ex_MenuSDI相应的菜单资源在菜单编辑器窗口中显示出来。6.2.2更改应用程序菜单(3)按快捷键【Ctrl+R】,弹出“插入资源”对话框,在资源类型中选中“Menu”,单击

按钮,系统就会为应用程序添加一个新的菜单资源,并自动赋给它一个默认的标识符名称(第一次为IDR_MENU1,以后依次为IDR_MENU2、IDR_MENU3……),同时自动打开这个新的菜单资源,如图6.8所示。菜单空位置菜单默认ID6.2.2更改应用程序菜单(4)在菜单的空位置上双击鼠标左键,则出现其属性对话框。通过其属性对话框为菜单ID_MENU1添加一个顶层弹出菜单项“测试(&T)”,并在该菜单下添加一个子菜单项“返回(&R)”,ID设为ID_TEST_RETURN,如图6.9所示。6.2.2更改应用程序菜单(5)打开Ex_MenuSDI程序菜单资源IDR_MAINFRAME,在“查看”菜单的最后添加一个子菜单项“显示测试菜单(&M)”,ID设为ID_VIEW_TEST。(6)将工作区切换到ClassView页面,展开类节点,右击CMainFrame类名,从弹出的快捷菜单中选择AddMemberVariable(添加成员变量),在对话框中,为CMainFrame类添加一个CMenu类型的成员变量m_NewMenu(CMenu类用来处理菜单的一个MFC类)。6.2.2更改应用程序菜单(7)按快捷键【Ctrl+W】打开MFCClassWizard对话框,切换到MessageMaps页面,从“Classname”列表中选择CMainFrame,分别为菜单项ID_VIEW_TEST和ID_TEST_RETURN添加COMMAND消息映射,使用默认的消息映射函数名,并添加下列代码:voidCMainFrame::OnViewTest(){ m_NewMenu.Detach(); //使菜单对象和菜单句柄分离 m_NewMenu.LoadMenu(IDR_MENU1); SetMenu(NULL); //清除应用程序菜单 SetMenu(&m_NewMenu); //设置应用程序菜单}voidCMainFrame::OnTestReturn(){ m_NewMenu.Detach(); m_NewMenu.LoadMenu(IDR_MAINFRAME); SetMenu(NULL); SetMenu(&m_NewMenu); }6.2.3使用键盘快捷键(1)在Ex_MenuSDI中,将项目工作区窗口切换到ResourceView页面,展开所有资源节点,双击Accelerator节点下的IDR_MAINFRAME项,出现如图6.10所示的加速键资源列表。(2)双击加速键列表最下端的空行,弹出如图6.11所示的“Accel属性”对话框,其中可设置的属性如表6.2所示。

下端的空行

6.2.3使用键盘快捷键项

目含

义ID指定资源ID的列表项,为了能和菜单联用,通常选择某菜单项的ID辅助键(Modifiers)用来确定Ctrl、Alt、Shift是否是加速键的组成部分类型(Type)用来确定该加速键的值是虚拟键(VirKey)还是ASCII键(Key)是指启动加速键的键盘按键下一个按下的键(NextKeyTyped)单击此按钮后,用户操作的任何按键都将成为此加速键的键值表6.2加速键常规(General)属性对话框的各项含义6.2.3使用键盘快捷键(3)在“Accel属性”对话框中,选择Ex_MenuSDI添加的“显示测试菜单”菜单项ID_VIEW_TEST作为要联用的加速键的ID,然后单击

按钮,并按下【Ctrl+1】作为此加速键的键值。(4)按同样的方法,为菜单项ID_TEST_RETURN添加加速键【Ctrl+2】。(5)编译运行并测试。当程序运行后,按快捷键【Ctrl+1】和【Ctrl+2】将执行相应的菜单命令。6.2.4菜单的编程控制1.创建菜单CMenu类的CreateMenu和CreatePopupMenu分别用来创建一个菜单或子菜单框架,它们的原型如下:BOOLCreateMenu(); //产生一个空菜单BOOLCreatePopupMenu(); //产生一个空的弹出式子菜单2.装入菜单资源将菜单资源装入应用程序中,需调用CMenu成员函数LoadMenu,然后用SetMenu对应用程序菜单进行重新设置。BOOLLoadMenu(LPCTSTRlpszResourceName);BOOLLoadMenu(UINTnIDResource);6.2.4菜单的编程控制3.添加菜单项当菜单创建后,用户可以调用AppendMenu或InsertMenu函数来添加一些菜单项。但每次添加时,AppendMenu是将菜单项添加在菜单的末尾处,而InsertMenu在菜单的指定位置处插入菜单项,并将后面的菜单项依次下移。BOOLAppendMenu(UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);BOOLAppendMenu(UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem=0, LPCTSTRlpszNewItem=NULL);BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);6.2.4菜单的编程控制其中,nIDNewItem表示新菜单项的资源ID,lpszNewItem表示新菜单项的内容,pBmp用于菜单项的位图指针,nPosition表示新菜单项要插入的菜单项位置。nFlags表示要增加的新菜单项的状态信息,它的值影响其他参数的含义,如表6.3所示。

nFlags值含

义nPosition值nIDNewItem值lpszNewItem值MF_BYCOMMAND菜单项以ID来标识菜单项资源IDMF_BYPOSITION菜单项以位置来标识菜单项的位置MF_POPUP菜单项有弹出式子菜单弹出式菜单句柄MF_SEPARATOR分隔线忽略忽略MF_OWNERDRAW自画菜单项自画所需的数据MF_STRING字符串标志字符串指针MF_CHECKED设置菜单项的选中标记MF_UNCHECKED取消菜单项的选中标记MF_DISABLED禁用菜单项MF_ENABLED允许使用菜单项MF_GRAYED菜单项灰显6.2.4菜单的编程控制4.删除菜单项调用DeleteMenu函数可将指定的菜单项删除,其原型如下:BOOLDeleteMenu(UINTnPosition,UINTnFlags);5.获取菜单项下面的四个CMenu成员函数分别用来获取菜单的项数、菜单项的ID、菜单项的文本内容及弹出式子菜单的句柄。UINTGetMenuItemCount()const;该函数用来获取菜单的菜单项数,调用失败后返回-1。UINTGetMenuItemID(intnPos)const;该函数用来获取由nPos指定菜单项位置(以0为基数)的菜单项的标识号,若nPos是SEPARATOR,则返回-1。intGetMenuString(UINTnIDItem,CString&rString,UINTnFlags)const;该函数用来获取由nIDItem指定菜单项位置(以0为基数)的菜单项的文本内容(字符串),并由rString参数返回,当nFlags为MF_BYPOSITION时,nPosition表示菜单项的位置(第一个菜单项位置为0)。CMenu*GetSubMenu(intnPos)const;6.2.4菜单的编程控制【例Ex_Menu】菜单项的编程控制(1)用MFCAppWizard(exe)创建一个默认的单文档应用程序Ex_Menu。(2)选择“查看”→“资源符号”(ResourceSymbols…)菜单命令,弹出如图6.12所示的“资源符号”对话框,它能对应用程序中的资源标识符进行管理。

6.2.4菜单的编程控制(3)单击

按钮,弹出如图6.13所示的“新建符号”对话框。在“名称”(Name)框中输入一个新的标识符ID_NEW_MENUITEM。在“值”(Value)框中,输入该ID的值,系统要求用户定义的ID值应大于15(0X000F)而小于61440(0XF000)。(4)关闭“资源符号”对话框,在CMainFrame::OnCreate函数中添加下列代码,该函数在框架窗口创建时自动调用。intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ //…… CMenu*pSysMenu=GetMenu(); //获得程序菜单指针 CMenu*pSubMenu=pSysMenu->GetSubMenu(1); //获得第二个子菜单的指针 CStringStrMenuItem("新的菜单项"); pSubMenu->AppendMenu(MF_SEPARATOR); //增加一个水平分隔线 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(); //更新菜单 return0;}6.2.4菜单的编程控制(5)用MFCClassWizard处理OnCommand消息并检测用户菜单的nID参数。BOOLCMainFrame::OnCommand(WPARAMwParam,LPARAMlParam){ //wParam的低字节表示菜单、控件、加速键的命令ID if(LOWORD(wParam)==ID_NEW_MENUITEM) MessageBox("你选中了新的菜单项"); returnCFrameWnd::OnCommand(wParam,lParam);}(6)编译运行并测试。这样当选择“编辑”→“新的菜单项”菜单命令后,就会弹出一个对话框,显示“你选中了新的菜单项”消息。6.2.5使用快捷菜单1.快捷菜单实现函数用资源编辑器和MFC库的CMenu::TrackPopupMenu函数可以很容易地创建快捷菜单,CMenu::TrackPopupMenu函数原型如下:BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);该函数用来显示一个浮动的弹出式菜单,其位置由各参数决定。其中,nFlags表示菜单在屏幕显示的位置及鼠标按钮标志,如表6.4所示。nFlags值含

义TPM_CENTERALIGN屏幕位置标志,表示菜单的水平中心位置由x坐标确定TPM_LEFTALIGN屏幕位置标志,表示菜单的左边位置由x坐标确定TPM_RIGHTALIGN屏幕位置标志,表示菜单的右边位置由x坐标确定TPM_LEFTBUTTON鼠标按钮标志,表示当用户单击鼠标左键时弹出菜单TPM_RIGHTBUTTON鼠标按钮标志,表示当用户单击鼠标右键时弹出菜单6.2.5使用快捷菜单2.示例【例Ex_ContextMenu】使用快捷菜单(1)创建一个默认的单文档应用程序Ex_ContextMenu。(2)用MFCClassWizard在CEx_ContextMenuView类添加WM_CONTEXTMENU消息映射,并在映射函数中添加下列代码。(3)在Ex_ContextMenuView.cpp文件的前面添加CMainFrame类的文件包含:#include"Ex_ContextMenuView.h"#include"MainFrm.h"6.2.5使用快捷菜单(4)运行并测试。在应用程序窗口的客户区右击鼠标后,会弹出如图6.14所示的快捷菜单。6.3工具栏6.3.1使用工具栏编辑器选择“文件”→“打开工作空间”菜单命令,将前面的单文档应用程序Ex_MenuSDI调入。将项目工作区窗口切换到ResourceView页面,展开资源节点,双击“Toolbar”节点中的IDR_MAINFRAME项,则工具栏编辑器出现在主界面的右边,如图6.15所示。空按钮图形工具箱颜色工具箱6.3.1使用工具栏编辑器1.创建一个新的工具栏按钮在新建的工具栏中,最右端总有一个空按钮,双击该按钮会弹出其属性对话框,在ID框中输入其标识符名称,则在其右端又出现一个新的空按钮。2.移动一个按钮在工具栏中移动一个按钮,用鼠标左键点中它并拖动至相应位置即可。3.删除一个按钮前面已提到过,将选中的按钮拖离工具栏,该按钮就消失了。4.在工具栏中插入空格(1)如果按钮前没有任何空格,拖动该按钮向右移动,并当覆盖相邻按钮的一半以上时释放鼠标键,则此按钮前出现空格。(2)如果按钮前有空格而按钮后没有空格,拖动该按钮向左移动,并当按钮的左边界接触到前面的按钮时释放鼠标键,则此按钮后将出现空格。(3)如果按钮前后均有空格,拖动该按钮向右移动并当接触到相邻按钮时,则此按钮前的空格保留,按钮后的空格消失。6.3.1使用工具栏编辑器5.工具栏按钮属性的设置双击按钮图标弹出其属性对话框,如图6.16所示。属性对话框中的各项说明见表6.5。项

目含

义ID工具栏按钮的标识符,用户既可以输入自己的标识符名称,也可从ID框的下拉列表中选取标识符名称宽度(Width)工具栏按钮的像素宽度高度(Height)工具栏按钮的像素高度提示(Prompt)工具栏按钮提示文本。若为“建立新文档\n新建”,则表示将鼠标指向该按钮时,在状态栏中显示“建立新文档”,而在弹出的提示信息中出现“新建”字样。“\n”是它们的分隔转义符6.3.2工具按钮和菜单项相结合(1)选择“文件”→“打开工作空间”菜单命令,将前面的单文档应用程序Ex_MenuSDI调入。将项目工作区窗口切换到ResourceView页面,展开资源节点,双击“Toolbar”节点中的IDR_MAINFRAME项,打开工具栏编辑器。(2)用工具栏编辑器添加并设计两个工具图标按钮,其位置和内容如图6.17所示。

6.3.2工具按钮和菜单项相结合(3)双击设计的第一个工具按钮

,弹出该工具按钮的属性对话框,将该工具按钮的ID号设为ID_TEST_RETURN,在提示框内输入“返回应用程序主菜单\n返回主菜单”。(4)双击设计的第二个工具按钮

,弹出该工具按钮的属性对话框,将该工具按钮的ID号设为ID_VEW_TEST,在提示框内输入“显示测试菜单\n显示测试菜单”。(5)编译运行并测试。当程序运行后,将鼠标移至设计的第一个工具按钮处,这时在状态栏上显示出“返回应用程序主菜单”信息,若稍等片刻,还会弹出提示小窗口,显示出“返回主菜单”字样,如图6.18所示。6.3.3多个工具栏的使用【例Ex_MultiBar】多个工具栏的使用(1)创建一个默认的单文档应用程序Ex_MultiBar。将项目工作区切换到ResourceView页面,展开“Toolbar”(工具栏)资源,用鼠标单击IDR_MAINFRAME不松开,然后按下【Ctrl】键,移动鼠标将IDR_MAINFRAME拖到Toolbar资源名称上,这样就复制了工具栏默认资源IDR_MAINFRAME,复制后的资源标识系统自动设为IDR_MAINFRAME1。(2)右击工具栏资源IDR_MAINFRAME1,从弹出的快捷菜单中选择Properties命令,弹出如图6.19所示对话框,将ID设为IDR_TOOLBAR1。6.3.3多个工具栏的使用(3)将项目工作区切换到FileView页面,展开HeadFiles(头文件)所有节点,双击MainFrm.h文件,在CMainFrame类中添加一个成员变量m_wndTestBar,变量类型为CToolBar(CToolBar类封装了工具栏的操作)。protected://controlbarembeddedmembers CStatusBarm_wndStatusBar; CToolBarm_wndToolBar; CToolBarm_wndTestBar;6.3.3多个工具栏的使用(4)在CMainFrame::OnCreate函数中添加下面的工具栏创建代码:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ if(CFrameWnd::OnCreate(lpCreateStruct)==-1) return-1; intnRes=m_wndTestBar.CreateEx(this,TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER| CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC, CRect(0,0,0,0), AFX_IDW_TOOLBAR+10); if(!nRes||!m_wndTestBar.LoadToolBar(IDR_TOOLBAR1)) { TRACE0("Failedtocreatetoolbar\n"); return-1;//failtocreate } … m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); m_wndTestBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); DockControlBar(&m_wndTestBar); … return0;}6.4状态栏6.4.1状态栏的定义图6.21列出了indicators数组元素与标准状态栏窗格的关系。6.4.2状态栏的常用操作1.增加和减少窗格状态栏中的窗格可以分为信息行窗格和指示器窗格两类。若在状态栏中增加一个信息行窗格,则只需在indicators数组中的适当位置增加一个ID_SEPARATOR即可;若在状态栏中增加一个用户指示器窗格,则在indicators数组中的适当位置增加一个在字符串表中定义过的资源ID即可,其字符串的长度表示用户指示器窗格的大小。2.在状态栏上显示文本调用CStatusBar::SetPaneText函数可以更新任何窗格(包括信息行ID_SEPARATOR窗格)中的文本。此函数原型描述如下:BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);6.4.2状态栏的常用操作【例Ex_SDIMouse】

将鼠标在客户区窗口的位置显示在状态栏上(1)用MFCAppWizard(exe)创建一个默认的单文档应用程序Ex_SDIMouse。(2)将项目工作区切换到ClassView页面,展开类节点及CMainFrame类的所有项,双击构造函数CMainFrame()节点,此时将在文档窗口中出现该函数的定义,在它的前面就是状态栏数组的定义。(3)将状态栏indicators数组的定义改为下列代码:staticUINTindicators[]={ ID_SEPARATOR, ID_SEPARATOR,};6.4.2状态栏的常用操作(4)打开MFCClassWizard对话框,为CEx_SDIMouseView类添加WM_MOUSEMOVE的消息映射,并添加下列代码:voidCEx_SDIMouseView::OnMouseMove(UINTnFlags,CPointpoint){ CStringstr; CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;//获得主窗口指针 CStatusBar*pStatus=&pFrame->m_wndStatusBar; //获得主窗口中的状态栏指针 if(pStatus) { str.Format("X=%d,Y=%d",point.x,point.y); //格式化文本 pStatus->SetPaneText(1,str); //更新第二个窗格的文本 } CView::OnMouseMove(nFlags,point);}6.4.2状态栏的常用操作(5)将项目工作区切换到FileView页面,展开HeadFiles(头文件)所有节点,双击MainFrm.h文件,找到并将保护变量m_wndStatusBar变成公共变量,即:public: CStatusBar m_wndStatusBar;protected://controlbarembeddedmembers CToolBar m_wndToolBar;(6)类似地,打开Ex_SDIMouseView.cpp文件,并在其开始处添加下列语句:#include"Ex_SDIMouseView.h"#include"MainFrm.h"(7)编译并运行,结果如图6.22所示。6.4.3改变状态栏的风格在MFC的CStatusBar类中,有两个成员函数可以改变状态栏风格,它们是:voidSetPan

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论