实验7菜单、工具栏和状态栏实验目的:掌握菜单和弹出式菜单制作以及利用菜单触发应用程序的方法掌握动态改变菜单方法掌握工具栏和状态栏的制作和使用方法实验要求:7.
1使用菜单编辑器对菜单编辑,如添加主菜单项和子菜单等,并掌握使用的方法,如弹出一个对话窗口或单击菜单与处理命令中的某个类的成员函数相联系.
(例如,利用菜单选择不同宽度的笔,弹出一个颜色选择的对话窗口(利用CColorDialogClass),选择笔的颜色等)提示:利用开发平台,添加菜单及对应标识(ID),然后利用ClassWizard在应用程序窗口中响应实现某一功能.
7.
2掌握菜单的启用、禁用和复选方法,例如在单文档窗口上连击鼠标左键,将菜单中某项启动和禁用.
提示:菜单的启用、禁用和复选分别表示菜单项的使用状态,如当菜单禁用时,该项将会"变灰"用户选择时不会被响应.
7.
3利用开发平台的多文档创建,观测菜单程序的设计方法,建立起多种不同的窗口并根据窗口动态更新菜单.
(如,系统可弹出3种类型的窗口,其中一个窗口是用鼠标画线,菜单包括笔的宽度,颜色等,一个窗口是在鼠标点击处画园,菜单选择不同半径和颜色,最后一个窗口是在上画正弦波(动态),菜单包括同时有几条,并利用菜单弹出一对话框,然后输入曲线的必要参数(如周期等))提示:在创建时不使用Document/Viewarchitecturesupport.
观察系统创建的程序框架,分别创建不同功能的窗口类(包括CMDIChildWnd和CWnd类)在利用系统菜单,启动用户的不同类型窗口(包括增加菜单变量等),仔细观测菜单是否随窗口的不同而改变.
在各窗口中编写相应的程序以实现各自的功能.
7.
5创建弹出式菜单,在应用程序视图内右击鼠标时,将弹出该浮动菜单.
提示:增加右键单击时的消息处理在响应函数处增加弹出菜单:CMenumenu;Menu.
CreatePopupMenu();添加一个菜单项到该菜单:menu.
AppendMenu(0,IDC_MY_MSG1,"Wzd&1"这里IDC_MY_MSG1是定义的标识,'Wzd'是菜单显示的内容在鼠标右击处显示该弹出式菜单:CMenumenu;menu.
LoadMenu(ID_MENU_MY);CMenu*lpmenu;lpmenu=menu.
GetSubMenu(0);CPointpt;GetCursorPos(&pt);lpmenu->TrackPopupMenu(TPM_RIGHTBUTTON,pt.
x,pt.
y,this);在使用了TrackPopupMenu()命令后,必须使用DestroyMenu()销毁弹出式菜单对象.
lpmenu->DestroyMenu();7.
6掌握使用工具栏编辑器(ToolBarEditor)修改工具栏,以及创建新的工具栏的方法.
7.
7启用和禁用工具栏按钮,根据应用程序的状态,灰化和正常化工具栏按钮.
(禁用的按钮显示灰色).
7.
8为工具栏按钮添加字,在工具栏的按钮上添加文字,这样可表明按钮作用.
7.
9非标准工具栏大小讨论改变工具栏按钮大小的方法.
7.
10保持工具栏按钮按下讨论保持工具栏按钮按下的方法,以指示该功能正在使用7.
11为工具栏添加非按钮控件添加一个组合框到工具栏.
7.
12修改应用程序的状态栏用字符串表编辑器(StringTableEditor)修改应用程序的状态栏.
7.
13更新状态栏窗格使用ClassWizard创建一个类,更新显示状态窗格上的文本消息.
7.
14为状态栏添加其他控件添加一个按钮和进度指示控件到一个状态栏.
实验过程菜单栏7.
1使用菜单编辑器对菜单编辑目标:掌握使用菜单编辑器对菜单进行编辑步骤:1.
选择ResourceView选项卡,其中,节点Menu下就是菜单编辑,点击鼠标右键,可以选择InsertMenu,然后可以对菜单进行编辑.
改变菜单属性可以选中菜单名称,然后点击鼠标右键,选择Properties命令,显示"菜单属性"对话框,修改菜单属性.
2.
添加一个新的菜单项到菜单中,用鼠标拖动空白焦点矩形到新菜单项的位置,然后,双击或右击该矩形,选择properties命令打开属性对话框,在ID域定义个人的菜单ID,如果用户不输入任何ID,则系统自动创建一个ID,当单击该菜单项时,该ID成为命令ID发送到应用程序.
在Caption(标题)域输入菜单项的文本,在字符前面添加一个&号表示用户可以通过键盘访问该菜单项,该字符在菜单中显示一个下划线.
3.
修改一个已有的菜单项,只要用鼠标选取它,并打开它的属性对话框;要删除一个菜单项,用鼠标选中它,然后按键盘上的Delete键.
4.
用ClassWizard添加一个命令处理函数,菜单按钮ID_DIALOG_POPUP,添加一个消息映射函数OnDialogPopup,在sy715View.
cp文件中添加如下代码voidCSy715View::OnDialogPopup(){//TODO:AddyourcommandhandlercodehereCColorDialogdc;dc.
DoModal();}7.
2掌握菜单的启用、禁用和复选方法,例如在单文档窗口上连击鼠标左键,将菜单中某项启动和禁用.
目标:启用、禁用和复选一个菜单项步骤:给对应菜单ID_APP_ABOUT用ClassWizard选择UPDATE_COMMAND_UI创建一个用户界面处理函数,定义布尔变量m_bivalue,如果m_bivalue为TRUE,菜单将变得有效,如果是FALSE,则无效.
使用SetCheck函数控制函数的复选.
添加如下代码voidCSy715View::OnUpdateAppAbout(CCmdUI*pCmdUI){//TODO:AddyourcommandupdateUIhandlercodeherepCmdUI->Enable(m_bivalue);//启用或禁用//pCmdUI->SetCheck(m_bivalue);//复选}添加鼠标左键消息处理函数OnLButtonDown,双击启用或者禁用菜单功能,添加代码如下:voidCSy715View::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultm_bicaptured=true;if(m_bicaptured){count++;if(count%2==0&&count!
=0){m_bivalue=true;}else{m_bivalue=false;}}CView::OnLButtonDown(nFlags,point);}7.
3利用开发平台的多文档创建,观测菜单程序的设计方法,建立起多种不同的窗口并根据窗口动态更新菜单.
目标:掌握窗口动态更新菜单,实现在不同的窗口更新不同的菜单.
步骤:1.
在split3Doc.
h文件中添加六个不同类型的成员变量,添加代码:public:CPointp1,p2;COLORREFm_linecolor;intm_lineWidth,m_lineTYPE,m_circle_raidus;并且在split3Doc.
cpp文件的构造函数CSplit3Doc中进行初始化CSplit3Doc::CSplit3Doc(){//TODO:addone-timeconstructioncodeherep2=p1=CPoint(0,0);m_lineWidth=3;m_lineTYPE=PS_SOLID;m_circle_raidus=10;}2.
在split3View.
cpp文件的修改OnDraw函数,用于实现画图,voidCSplit3View::OnDraw(CDC*pDC){//TODO:Addyourspecializedcodehereand/orcallthebaseclassCSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();CPen*newpen=newCPen(pDoc->m_lineTYPE,pDoc->m_lineWidth,pDoc->m_linecolor);CPen*oldpen=pDC->SelectObject(newpen);pDC->MoveTo(pDoc->p1);pDC->LineTo(pDoc->p2);pDC->SelectObject(oldpen);}同时添加鼠标的消息响应函数OnLButtonDown和OnLButtonDown,添加代码,voidCSplit3View::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultCSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();pDoc->p1=point;CFormView::OnLButtonDown(nFlags,point);}初始点选择.
voidCSplit3View::OnLButtonUp(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultCSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();pDoc->p2=point;Invalidate();CFormView::OnLButtonUp(nFlags,point);}目的点选择.
对应在Menu下添加菜单IDR_SPLIT3TYPE,并且修改菜单line选项,添加三个功能选项LineColor,LineWidth,LineType,并且在split3View.
cpp文件添加三个消息响应函数,voidCSplit3View::OnLinePara(){CColorDialogcdig;if(cdig.
DoModal()==IDOK){CSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();pDoc->m_linecolor=cdig.
GetColor();}}voidCSplit3View::OnLineWidth(){//TODO:Addyourcommandhandlercodehere//修改CSplit3Doc的m_lineWidth变量CSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();pDoc->m_lineWidth=3+3*(rand()%3);}voidCSplit3View::OnLineType(){//TODO:Addyourcommandhandlercodehere//修改CSplit3Doc的m_lineTYPE变量具体值见MSDNCSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();pDoc->m_lineTYPE=PS_DASH;}3.
同样的方法,添加两个基于CFormView的新视图类CircleView和CSplit3View,对应的程序清单如下:#if!
defined(AFX_SINEVIEW_H__FEF0D315_F3F7_4447_9F75_C0B263FFF1D8__INCLUDED_)#defineAFX_SINEVIEW_H__FEF0D315_F3F7_4447_9F75_C0B263FFF1D8__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000//SineView.
h:headerfile//SineViewformview#ifndef__AFXEXT_H__#include#endifclassSineView:publicCFormView{protected:SineView(protectedconstructorusedbydynamiccreationDECLARE_DYNCREATE(SineView)//FormDatapublic://{{AFX_DATA(SineView)enum{IDD=IDD_SINEVIEW_FORM};//NOTE:theClassWizardwilladddatamembershere//}}AFX_DATA//Attributespublic://Operationsprivate:intm_sine_time;//Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(SineView)protected:virtualvoidDoDataExchange(CDataExchange*pDX)DDX/DDVsupportvirtualvoidOnDraw(CDC*pDC);//}}AFX_VIRTUAL//Implementationprotected:virtual~SineView();#ifdef_DEBUGvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;#endif//Generatedmessagemapfunctions//{{AFX_MSG(SineView)afx_msgvoidOnSinePara();afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);afx_msgvoidOnSineTime();//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.
#endif//!
defined(AFX_SINEVIEW_H__FEF0D315_F3F7_4447_9F75_C0B263FFF1D8__INCLUDED_)//SineView.
cpp:implementationfile#include"stdafx.
h"#include"split3.
h"#include"SineView.
h"#include"Split3DOc.
h"#include#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif//SineViewIMPLEMENT_DYNCREATE(SineView,CFormView)SineView::SineView():CFormView(SineView::IDD){//{{AFX_DATA_INIT(SineView)//NOTE:theClassWizardwilladdmemberinitializationhere//}}AFX_DATA_INITm_sine_time=6;}SineView::~SineView(){}voidSineView::DoDataExchange(CDataExchange*pDX){CFormView::DoDataExchange(pDX);//{{AFX_DATA_MAP(SineView)//NOTE:theClassWizardwilladdDDXandDDVcallshere//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(SineView,CFormView)//{{AFX_MSG_MAP(SineView)ON_COMMAND(ID_SINE_PARA,OnSinePara)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_COMMAND(ID_SINE_TIME,OnSineTime)//}}AFX_MSG_MAPEND_MESSAGE_MAP()//SineViewdiagnostics#ifdef_DEBUGvoidSineView::AssertValid()const{CFormView::AssertValid();}voidSineView::Dump(CDumpContext&dc)const{CFormView::Dump(dc);}#endif//_DEBUG//SineViewmessagehandlersvoidSineView::OnSinePara(){CColorDialogcdig;if(cdig.
DoModal()==IDOK){CSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();pDoc->m_linecolor=cdig.
GetColor();}}voidSineView::OnDraw(CDC*pDC){CSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();CPen*newpen=newCPen(pDoc->m_lineTYPE,pDoc->m_lineWidth,pDoc->m_linecolor);CPen*oldpen=pDC->SelectObject(newpen);intlen=pDoc->p1.
x-pDoc->p2.
x;intamp=pDoc->p1.
y-pDoc->p2.
y;inti,x,y;//画周期正弦,实事上有更好的差分办法for(i=0;ip1.
x-abs(len)/len*i;y=(pDoc->p1.
y+pDoc->p2.
y)/2+amp/2*sin(i*m_sine_time*6.
18/len);pDC->SetPixel(x,y,pDoc->m_linecolor);}pDC->SelectObject(oldpen);}voidSineView::OnLButtonDown(UINTnFlags,CPointpoint){CSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();pDoc->p1=point;CFormView::OnLButtonDown(nFlags,point);}voidSineView::OnLButtonUp(UINTnFlags,CPointpoint){CSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();pDoc->p2=point;Invalidate();CFormView::OnLButtonUp(nFlags,point);}voidSineView::OnSineTime(){//TODO:Addyourcommandhandlercodeherem_sine_time=(++m_sine_time)%10;//修改周期数的对话框}#if!
defined(AFX_IRCLEVIEW_H__F9D0731A_5005_4474_A822_3B408CB84C06__INCLUDED_)#defineAFX_IRCLEVIEW_H__F9D0731A_5005_4474_A822_3B408CB84C06__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000//ircleView.
h:headerfile////CircleViewformview#ifndef__AFXEXT_H__#include#endifclassCircleView:publicCFormView{protected:CircleView(protectedconstructorusedbydynamiccreationDECLARE_DYNCREATE(CircleView)//FormDatapublic://{{AFX_DATA(CircleView)enum{IDD=IDD_IRCLEVIEW_FORM};//NOTE:theClassWizardwilladddatamembershere//}}AFX_DATA//Attributespublic://Operationspublic://Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CircleView)protected:virtualvoidDoDataExchange(CDataExchange*pDX)DDX/DDVsupportvirtualvoidOnDraw(CDC*pDC);//}}AFX_VIRTUAL//Implementationprotected:virtual~CircleView();#ifdef_DEBUGvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;#endif//Generatedmessagemapfunctions//{{AFX_MSG(CircleView)afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);afx_msgvoidOnCircleColor();afx_msgvoidOnCircleRaidus();//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.
#endif//!
defined(AFX_IRCLEVIEW_H__F9D0731A_5005_4474_A822_3B408CB84C06__INCLUDED_)//ircleView.
cpp:implementationfile#include"stdafx.
h"#include"split3.
h"#include"ircleView.
h"#include"Split3doc.
h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif//CircleViewIMPLEMENT_DYNCREATE(CircleView,CFormView)CircleView::CircleView():CFormView(CircleView::IDD){//{{AFX_DATA_INIT(CircleView)//NOTE:theClassWizardwilladdmemberinitializationhere//}}AFX_DATA_INIT}CircleView::~CircleView(){}voidCircleView::DoDataExchange(CDataExchange*pDX){CFormView::DoDataExchange(pDX);//{{AFX_DATA_MAP(CircleView)//NOTE:theClassWizardwilladdDDXandDDVcallshere//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CircleView,CFormView)//{{AFX_MSG_MAP(CircleView)ON_WM_LBUTTONUP()ON_WM_LBUTTONDOWN()ON_COMMAND(ID_CIRCLE_COLOR,OnCircleColor)ON_COMMAND(ID_CIRCLE_RAIDUS,OnCircleRaidus)//}}AFX_MSG_MAPEND_MESSAGE_MAP()//CircleViewdiagnostics#ifdef_DEBUGvoidCircleView::AssertValid()const{CFormView::AssertValid();}voidCircleView::Dump(CDumpContext&dc)const{CFormView::Dump(dc);}#endif//_DEBUG//CircleViewmessagehandlersvoidCircleView::OnDraw(CDC*pDC){CSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();CPen*newpen=newCPen(pDoc->m_lineTYPE,pDoc->m_lineWidth,pDoc->m_linecolor);CPen*oldpen=pDC->SelectObject(newpen);pDC->MoveTo(pDoc->p1);pDC->Ellipse(pDoc->p1.
x-pDoc->m_circle_raidus,pDoc->p1.
y-pDoc->m_circle_raidus,pDoc->p1.
x+pDoc->m_circle_raidus,pDoc->p1.
y+pDoc->m_circle_raidus);pDC->SelectObject(oldpen);}voidCircleView::OnLButtonUp(UINTnFlags,CPointpoint){CSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();pDoc->p2=point;Invalidate();CFormView::OnLButtonUp(nFlags,point);}voidCircleView::OnLButtonDown(UINTnFlags,CPointpoint){CSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();pDoc->p1=point;CFormView::OnLButtonDown(nFlags,point);}voidCircleView::OnCircleColor(){CColorDialogcdig;if(cdig.
DoModal()==IDOK){CSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();pDoc->m_linecolor=cdig.
GetColor();}}voidCircleView::OnCircleRaidus(){//TODO:AddyourcommandhandlercodehereCSplit3Doc*pDoc=(CSplit3Doc*)GetDocument();pDoc->m_circle_raidus=10+10*(rand()%10);//把这个换成修改pDoc->m_circle_raidus的对话框}7.
5创建弹出式菜单,在应用程序视图内右击鼠标时,将弹出该浮动菜单.
1.
添加鼠标右键按下消息函数OnRButtonDown,在函数中设置对应浮动菜单的内容,voidCSy715View::OnRButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultCMenumenu;menu.
CreatePopupMenu();menu.
AppendMenu(0,IDC_WZD1_TYPE,"Wzd&1");menu.
AppendMenu(MF_CHECKED,IDC_WZD2_TYPE,"Wzd&2");menu.
AppendMenu(MF_SEPARATOR,0);menu.
AppendMenu(MF_GRAYED,IDC_WZD3_TYPE,"Wzd&3");menu.
AppendMenu(0,IDC_WZD4_TYPE,"Wzd&4");menu.
CheckMenuRadioItem(IDC_WZD3_TYPE,IDC_WZD4_TYPE,IDC_WZD4_TYPE,MF_BYCOMMAND);::SetMenuDefaultItem(menu.
m_hMenu,IDC_WZD4_TYPE,MF_BYCOMMAND);GetCursorPos(&point);menu.
TrackPopupMenu(TPM_RIGHTBUTTON,point.
x,point.
y,this);menu.
DestroyMenu();CView::OnRButtonDown(nFlags,point);}2.
添加鼠标右键释放的消息映射函数OnRButtonUp,添加如下代码,使得浮动菜单能够在视图内显示,voidCSy715View::OnRButtonUp(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultCPointPopupPoint=point;ClientToScreen(&PopupPoint);m_PopupMenu.
LoadMenu(IDR_MENU1);m_PopupMenu.
GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTBUTTON|TPM_LEFTBUTTON,PopupPoint.
x,PopupPoint.
y,AfxGetMainWnd());m_PopupMenu.
DestroyMenu();CView::OnRButtonUp(nFlags,point);}工具栏7.
6掌握使用工具栏编辑器(ToolBarEditor)修改工具栏,以及创建新的工具栏的方法.
目标:使用工具栏编辑器编辑应用程序的状态栏,或添加附加的工具栏到应用程序中.
注意:给应用程序添加的任何新的工具栏按钮,初始时显示灰色并且是无效的,直到添加一个处理该按钮的命令处理函数为止.
步骤:1.
应用DeveloperStudio创建一个新的工具栏要创建一个新的工具栏,单击DeveloperStudio的Insert/Resource菜单命令,打开Insert/Resource对话框,然后从列表中选取ToolBar,并单击New,添加新工具栏栏名称IDR_TOOLBAR1.
2.
应用工具栏编辑器编辑一个工具栏1)编辑一个已有的工具栏,在应用程序资源的工具栏文件夹中找到它的ID,并双击它,这将打开ToolBarEditor.
2)用工具栏编辑器添加一个新的按钮到工具栏,先用鼠标拖动工具栏末尾的空白工具栏按钮,放到新按钮的位置,然后用位图编辑器添加一个图像到该按钮上.
要打开该按钮的属性对话框,双击它在窗口上方的图像即可(见图7-1).
3)添加一个间隔(spacer)到该工具栏(按钮间的空白区).
首先,确定当前哪个按钮正好在放置间隔的位置处,并用鼠标抓住它;然后稍微往右拖动该按钮,并放开它,此时应该出现一个空白间隔.
要删除一个间隔,稍微拖动当前在它右边的按钮,并覆盖它.
要删除一个按钮,只要把它拖离工具栏即可.
如果出现误操作,则用DeveloperStudio的undo命令取消误操作.
4)每个按钮的属性对话框显示与菜单项的属性框相同的ID和Prompt编辑框.
尺寸编辑框(sizeeditbox)不仅允许改变该按钮的大小,而且可以改变每个按钮的大小,参见例7.
9关于创建非标准工具栏按钮.
5)为工具栏按钮添加一个命令处理函数,与添加一个菜单命令处理函数相同(参见例7.
1).
实际上,工具栏按钮是一个菜单命令的图形表示,没有相应菜单的工具栏按钮几乎不存在,尽管这是传统意义上的规定.
技术上可以添加一个没有相应菜单的工具栏按钮.
3.
添加一个新的工具栏到应用程序1)使用DeveloperStudio和工具栏编辑器创建一个新的工具栏后,在CMainFrame添加一个CToolBar派生的类m_wndToolBar1,同时必须添加下面的代码到CMainFrame类的Create()函数中,正好在添加原始工具栏的代码后面.
if(!
m_wndToolBar1.
Create(this)||!
m_wndToolBar1.
LoadToolBarEX(IDR_TOOLBAR1)){TRACE0("Failedtocreatestatusbar\n");return-1;failtocreate}//建立工具栏m_wndToolBar1.
SetBarStyle(m_wndToolBar1.
GetBarStyle()|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);//设置工具栏类型m_wndToolBar1.
EnableDocking(CBRS_ALIGN_ANY);2)新的工具栏一排接一排地垂直添加到应用程序的窗口中,如果使工具栏一个接一个水平地添加到窗口中,可以用下面的代码:DockControlBarLeftOf(&m_wndToolBar1,&m_wndToolBar);7.
7启用和禁用工具栏按钮,根据应用程序的状态,灰化和正常化工具栏按钮.
(禁用的按钮显示灰色).
目标:启用或禁用一个工具栏按钮(禁用的按钮显示灰色).
步骤:在实验7.
6基础上,给工具栏按钮添加一个用户见面函数1)打开classwizard找到对应工具栏按钮ID,选用UPDATE_COMMAND_UI添加新的函数2)添加下面的代码到新的处理函数中,如果启用工具栏按钮,则m_bWzd为TRUE.
voidCWzdView::OnUpdateWzdType(CCmdUI*pCmdUI){pCmdUI->Enable(m_bWzd);}7.
8为工具栏按钮添加字,在工具栏的按钮上添加文字,这样可表明按钮作用.
目标:熟悉在工具栏按钮上添加文字步骤:在MainFrm.
cpp文件中,OnCreate函数添加如下代码intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return-1;if(!
m_wndToolBar.
CreateEx(this,TBSTYLE_TRANSPARENT|TBSTYLE_LIST|TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC|CCS_ADJUSTABLE))//需要TBSTYLE_LIST参数{TRACE0("Failedtocreatetoolbar\n");return-1;failtocreate}m_wndToolBar.
LoadToolBar(IDR_MAINFRAME);//这样做一下intindex=m_wndToolBar.
CommandToIndex(ID_FILE_NEW);CStringstr;str="New";m_wndToolBar.
SetButtonText(index,str);//结束,在里面可以添加其他的按钮的名称if(!
m_wndStatusBar.
Create(this)||!
m_wndStatusBar.
SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failedtocreatestatusbar\n");return-1;failtocreate}//TODO:Deletethesethreelinesifyoudon'twantthetoolbarto//bedockablem_wndToolBar.
EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);return0;}7.
9非标准工具栏大小讨论改变工具栏按钮大小的方法.
目标:给工具栏添加更大的按钮(见图7-3).
步骤:1.
用工具栏编辑器改变工具栏按钮的大小1)在应用程序资源的ToolBar文件夹中,找到要编辑的工具栏ID,双击它以打开ToolBarEditor,选择DeveloperStudio的Image/GridSettings菜单命令以打开GridSetting(网格设置)对话框,在那里可以设置新工具栏按钮的位图部分的大小,本例中为25*25像素.
2)现在,拖动工具栏按钮右下角的移动框,直到它大小合适为止.
3)用工具栏编辑器把一个已有的按钮图像放大到新的大小.
首先,用剪切工具选取图像;接着,拖动移动框,直到图像足够大;然后,修饰由此产生的图像.
只是放大图像往往不能得到好的效果,因为没有足够像素自动创建一幅平滑图像,但可以从别的资源那里,剪切并粘贴一幅更大的图像到该按钮上.
4)放大图像如上所述;而对于工具栏的放大,工具栏资源会自动告诉应用程序,使工具栏按钮变大以适应该新图像的大小.
2.
用CToolbar::SetSizes()改变工具栏按钮大小有时,可能需要在运行时放大按钮,实验7.
6就是这样的一个例子.
它要求放大工具栏按钮以适应一个标题.
要在运行时放大按钮,可以用下面的代码://settoolbarsizeto32by32pixelsSIZEsizeButton,sizeImage;sizeImage.
cx=25;sizeImage.
cy=25;sizeButton.
cx=sizeImage.
cx+7;//allowforspacingaroundimagesizeButton.
cy=sizeImage.
cy+7;m_wndToolBar.
SetSizes(sizeButton,sizeImage);7.
10保持工具栏按钮按下讨论保持工具栏按钮按下的方法,以指示该功能正在使用目标:在工具栏按钮被单击后,使它保持按下状态(见图7-4).
步骤:1.
添加一个用户界面处理函数,按照例实验7.
6中的步骤,给应用程序添加一个用户界面处理函数,然后把下面的代码添加到该新处理函数中.
voidCWzdView::OnUpdateWzdButton(CCmdUI*pCmdUI){//thissamecommandchecksanymenuitemstoopCmdUI->SetCheck(m_bWzd);}2.
保持工具栏按钮组中只有一个按钮按下,以表示应用程序处于一个特定的模式(见图7-5).
1)结合第一项,给每一个按钮添加一个命令处理函数,然后把下面的代码添加到该新处理函数中.
voidCSy6to11View::OnWzd1Button(){//TODO:Addyourcommandhandlercodeherem_mode1=true;m_mode2=false;m_mode3=false;}voidCSy6to11View::OnWzd2Button(){//TODO:Addyourcommandhandlercodeherem_mode1=false;m_mode2=true;m_mode3=false;}voidCSy6to11View::OnWzd3Button(){//TODO:Addyourcommandhandlercodeherem_mode1=false;m_mode2=false;m_mode3=true;}2)为组中的每个成员添加一个用户界面处理函数voidCWzdView::OnUpdateWzd1Button(CCmdUI*pCmdUI){//thissamecommandchecksanymenuitemstoopCmdUI->SetCheck(m_mode1);}voidCWzdView::OnUpdateWzd2Button(CCmdUI*pCmdUI){//thissamecommandchecksanymenuitemstoopCmdUI->SetCheck(m_mode2);}voidCWzdView::OnUpdateWzd3Button(CCmdUI*pCmdUI){//thissamecommandchecksanymenuitemstoopCmdUI->SetCheck(m_mode3);}7.
11为工具栏添加非按钮控件添加一个组合框到工具栏.
1.
创建一个新的工具栏类,用ClassWizard创建一个从CToolBarCtrl派生的工具栏类,然后用文本编辑器(TextEditor)在创建的.
cpp和.
h文件中用CToolBar替换CToolBarCtrl.
添加一个叫做LoadToolBarEX的新函数到该类.
并且添加如下代码,BOOLCToolBarNew::LoadToolBarEX(UINTid){//loadtoolbarinfoBOOLbRet;bRet=CToolBar::LoadToolBar(IDR_TOOLBAR1);//findwhereourcomboboxwillgointpos=CommandToIndex(IDC_WZD_COMBO);//covertbuttonintoolbarintoaspacerforourcomboboxSetButtonInfo(pos,IDC_WZD_COMBO,TBBS_SEPARATOR,200);//createcomboboxCRectrect;GetItemRect(pos,&rect);rect.
bottom+=100;//howfarwillcombodropdownm_ctrlWzdCombo.
Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,rect,this,IDC_WZD_COMBO);returnbRet;}2.
在MainFrm.
h文件中定义一个类CToolBarNew的对象m_wndToolBar1,在MainFrm.
cpp文件的Oncreat函数添加如下代码:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return-1;if(!
m_wndToolBar.
CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!
m_wndToolBar.
LoadToolBar(IDR_MAINFRAME)){TRACE0("Failedtocreatetoolbar\n");return-1;failtocreate}if(!
m_wndStatusBar.
Create(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!
m_wndStatusBar.
SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failedtocreatestatusbar\n");return-1;failtocreate}//TODO:Deletethesethreelinesifyoudon'twantthetoolbarto//bedockablem_wndToolBar.
EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);//添加一个新的工具栏if(!
m_wndToolBar1.
Create(this)||!
m_wndToolBar1.
LoadToolBarEX(IDR_TOOLBAR1)){TRACE0("Failedtocreatestatusbar\n");return-1;failtocreate}//设置工具栏尺寸SIZEsizeButton,sizeImage;sizeImage.
cx=20;sizeImage.
cy=20;sizeButton.
cx=sizeImage.
cx+8;//allowforspacingaroundimagesizeButton.
cy=sizeImage.
cy+8;m_wndToolBar1.
SetSizes(sizeButton,sizeImage);return0;}这里要注意的是在MainFrm.
h和MainFrm.
cpp文件中都要不包含ToolBarNew.
h文件.
3.
定义一个类型为CComboBox的成员变量m_ctrlWzdCombo,在ToolBarNew.
cpp文件中定义一个下来框控件函数消息映射函数OnDropdownCombo(),在ToolBarNew.
h文件中添加,afx_msgvoidOnDropdownCombo();然后在ToolBarNew.
cpp文件中添加voidCToolBarNew::OnDropdownCombo(){m_ctrlWzdCombo.
ResetContent();m_ctrlWzdCombo.
AddString("Monday");m_ctrlWzdCombo.
AddString("Tuesday");m_ctrlWzdCombo.
AddString("Wednesday");m_ctrlWzdCombo.
SelectString(-1,m_sSelection);}状态栏7.
12修改应用程序的状态栏用字符串表编辑器(StringTableEditor)修改应用程序的状态栏.
目标:给应用程序的状态栏添加附加的指示器(见图7-7).
步骤:1.
用字符串表编辑器添加一个状态字符串1)单击应用程序的ResourceView标签,并StringTable文件夹中找到字符串表,双击字符串表的ID,以产生StringTableEditor.
2)要添加一个新的指示字符串到该表中,找到ID_INDICATOR_REC串,并单击Studio的Insert/NewString菜单命令.
这样,既插入一个新字符串,同时还打开它的属性对话框(见图7-8).
3)通常,还应赋予指示器ID一个类似于ID_INDICATOR_XXX的名称(这里的XXX描述指示器),然后在Caption栏输入一个文本字符串.
当状态栏窗格有效时,该字符串将在状态栏中显示,该字符串的长度决定在状态栏中显示指示器的窗格的长度.
如果在该标题的前后插入空格,则窗格将显得比文本字符串大.
单击属性对话框的关闭按钮,这一改变将被保存到表里.
2.
在MainFrame类中使用该新字符串1)把该指示器的ID添加到CMainFrame的indicators[]数组中,在MainFrm.
cpp中找到该数组,并把新的ID加到数组中,如下所示.
添加该ID的位置决定在状态栏上显示指示器的位置.
staticUINTindicators[]={ID_SEPARATOR,statuslineindicatorID_INDICATOR_WZD1,本例添加的新的状态栏指示器ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,};7.
13更新状态栏窗格使用ClassWizard创建一个类,更新显示状态窗格上的文本消息.
目标:在应用程序的状态栏中启用并改变一个窗格(见图7-9).
注意:允许应用程序更新工具栏按钮状态的机理,同样也可以用来更新状态栏窗格的状态,但效果却不同.
一个被无效化的状态栏窗格,不是显示灰色文本,而是根本不显示任何东西;被选中的窗格将从屏幕上"升起".
昨天晚上有收到VULTR服务商的邮件,如果我们有清楚的朋友应该知道VULTR对于新注册用户已经这两年的促销活动是有赠送100美元最高余额,不过这个余额有效期是30天,如果我们到期未使用完的话也会失效的。但是对于我们一般用户来说,这个活动还是不错的,只需要注册新账户充值10美金激活账户就可以。而且我们自己充值的余额还是可以继续使用且无有效期的。如果我们有需要申请的话可以参考"2021年最新可用Vul...
目前国内云计算市场竞争异常激烈,尤其是国内的腾讯云、阿里云、景安等商家促销活动一波接一波的进行,对于有需要的用户确实得到不小的实惠。但是这样给予国内的主机商确实是比较大的打击,毕竟这些商家的背景和实例强劲,即便是贴本补贴优惠,也是不怕的。前两年阿里一家各种活动促销,确实在国内市场占据主要的市场地位,腾讯云开始两年没有较大的吸引用户,不过这两年的发展还是比较稳健的。我们很多网友在之前肯定也享受到一些...
hypervmart怎么样?hypervmart是一家国外主机商,成立于2011年,提供虚拟主机、VPS等,vps基于Hyper-V 2012 R2,宣称不超售,支持linux和windows,有荷兰和英国2个数据中心,特色是1Gbps带宽、不限流量。现在配置提高,价格不变,性价比提高了很多。(数据中心不太清楚,按以前的记录,应该是欧洲),支持Paypal付款。点击进入:hypervmart官方网...