专业课面向对象程序设计第10章_第1页
专业课面向对象程序设计第10章_第2页
专业课面向对象程序设计第10章_第3页
专业课面向对象程序设计第10章_第4页
专业课面向对象程序设计第10章_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

1第10章资源2

应用程序可以使用几种不同类型的资源,如菜单、加速键、工具栏、状态条、图标、位图、对话框和字符串等。在MFC中创建应用程序的资源,可以使用可视化的资源编辑器(ResourceEditor),在资源编辑器中,程序员可以通过鼠标的拖动来编辑可视化资源,十分方便。 在Windows的可执行文件中,资源是独立于代码的,使用单独的资源编译器进行编译,并嵌入到可执行文件中。在编程过程中,代码是可复用的,资源也是可复用的,通过资源的“导入”和“导出”功能来实现资源的复用。310.1菜单在标准的Windows应用程序中,菜单通常有三类:系统菜单、程序主菜单和快捷菜单。系统菜单提供系统对程序主窗口的管理功能,通常在程序中既不需要控制也不需要改动这种菜单,因此在此不作介绍。程序主菜单通常位于应用程序的最顶端,大家所熟悉的文件、编辑、查看等菜单就是属于程序的主菜单,其菜单项包含了程序的大部分功能。快捷菜单在大部分的Windows应用程序中是很常见的。菜单从形式上分为下拉式和弹出式两种。系统菜单、程序主菜单都是下拉式菜单,下拉式菜单由上层水平列表项以及与其相连的弹出式菜单组成,当用户选择了上层某个列表项时,与之关联的弹出式菜单就会出现,而且可以形成级联菜单。快捷菜单属于弹出式菜单,可以出现在屏幕的任何位置。

MFC类库将菜单操作封装在CMenu类中,所有关于菜单的操作都可以通过CMenu类的成员函数实现。菜单的基本属性主要包括标识符(ID)、标题(Caption)和提示(Prompt)。410.1.1创建和编辑菜单

菜单可用于单文档(SDI)、多文档(MDI)以及基于对话框的应用程序。在单文档和多文档应用程序中编辑菜单资源的步骤如下:

(1)新建立一个单文档或多文档的应用程序。

(2)在项目工作区中单击资源视图标签ResourceView,切换到资源视图。

(3)展开Menu节点,双击菜单资源标识符IDR_MAINFRAME,或右击该标识符,在弹出的快捷菜单中选择“打开”命令。在编辑区中弹出菜单编辑窗口,显示IDR_MAINFRAME标识的菜单资源。

(4)双击对应菜单的空白菜单项,添加所需菜单。例如要为“文件”添加“保存”菜单项,选择菜单栏中的“文件”命令显示下拉菜单,双击菜单底部的空白处(若添加主菜单,则双击“帮助”后的空白处),打开菜单项目属性对话框

5在其中的“ID”和“标明”里面分别输入菜单命令的ID号和标识符。例如:ID号为“ID_FILE_SAVE”,标识符为“保存([&S])\tCtrl+S”,含义是设置热键为Alt+S,加速键为Ctrl+S。

如果调整菜单位置,选中要调整位置的菜单项,按住鼠标左键拖动到合适的位置放手即可。如果删除菜单项,首先选中菜单项,按Delete键删除即可。修改菜单项的方法与创建菜单项相似,双击想要修改的菜单项,修改其属性即可。6在基于对话框的应用程序中,首先插入一个新的菜单资源,具体做法是单击资源视图标签ResourceView,切换到资源视图,然后右击Resource标识符,在快捷菜单中选择“插入”命令,在弹出的资源类型对话框中选择Menu,击新建就会进入菜单编辑器,在设计并编辑菜单后,在该对话框的“属性”选项卡中,将菜单属性设置为该菜单的ID即可。710.1.2菜单消息常用的菜单消息有4种:1.ON_COMMAND消息ON_COMMAND消息是为了响应用户点击普通菜单项的消息,需要添加对该消息进行响应的消息处理函数。2.ON_UPDATE_COMMAND_UI消息ON_UPDATE_COMMAND_UI消息也是在用户点击普通菜单项的时候产生的,在ON_COMMAND消息之前响应,用于在普通菜单项的前面加上“√”或去掉“√”。使用户可以看出菜单项的当前状态。3.ON_COMMAND_RANGE消息ON_COMMAND_RANGE是为了响应ID值连续的若干个ON_COMMAND消息而提供的,用于成组的菜单项的消息响应。ON_COMMAND_RANGE消息为处理具有连续ID的菜单项提供了方便的途径。当我们对成组的菜单项操作时,不论选中了这一组菜单项中的哪一个,MFC都发来一个ON_COMMAND_RANGE消息,我们只需要对该消息编写一个消息处理函数。(只能手工添加消息响应函数)84.ON_UPDATE_COMMAND_UI_RANGE消息ON_UPDATE_COMMAND_UI_RANGE与ON_COMMAND_RANGE的关系和ON_UPDATE_COMMAND_UI与ON_COMMAND的关系类似,实现若干连续菜单项的状态更新。用于在成组的菜单项的某一项前面加上“•”或去掉“•”,使成组的菜单项看起来会更人性化一些。对于后两种消息只能手工添加消息响应函数10.1.3菜单应用实例【例10-1】创建一个基于单文档结构的应用程序,在程序主菜单的“操作”菜单中增加三个菜单项,“显示”、“图形”和“线形”。“图形”为级联菜单,包括“直线”、“矩形”和“椭圆”三个命令选项,“线形”也是一个级联菜单,包括“虚线”、“点线”、“点划线”三个菜单项。对各菜单操作时能执行相应的命令。用MFC进行编程的具体步骤如下:(1)建立一个基于单文档的工程ex10_1。(2)在菜单上添加各菜单项并设置好属性,如表10-1所示。ID标明分隔符弹出ID_OPER_SHOW

显示\tCtrl+W

√图形√ID_LINE直线ID_RECTANGLE矩形ID_ELLIPSE椭圆线形

√ID_STYLE1虚线ID_STYLE2点线ID_STYLE3点划线(3)添加新的数据成员 菜单消息属于命令消息,命令消息的消息响应函数可以放到四个类中,本例中,菜单操作仅仅修改了用户区的内容,所以只对视图类进行修改。在项目的视图类的头文件中定义视图类的成员变量。根据要显示的内容,考虑设置如下几个变量:①整型变量m_Shape为1时画直线,为2时画矩形,为3时画椭圆。②整型变量m_Style为1、2、3时,线形分别为虚线、点线和点划线。③整型变量m_MouseDown为1时说明鼠标已经按下,鼠标移动时可以画出图形,否则不画任何图形。④COLORREF型变量m_pencolor存放当前画笔的颜色。⑤CPoint型变量m_LineOrg和m_LineEnd分别为直线、矩形和椭圆的起始点和终止点。12在ex10_1View.h中的classCEx10_1View::publicCview中的public处加入如下声明:intm_Shape;//用户可选图形intm_Style;//用户可选线形intm_MouseDown;//鼠标按下状态COLORREFm_pencolor;//画笔颜色CPointm_LineOrg;//直线、矩形和椭圆的起始点CPointm_LineEnd;//直线、矩形和椭圆的终止点13(4)在视图类的构造函数中给变量赋初值当用户建立一个基于单文档的工程就创建了一个视图类,就是窗口框架上的用户区,程序执行时,就建立了一个文档类对象,同时建立了一个视图对象,此时自动执行视图类的构造函数。在视图类构造函数初始化变量,代码如下:CEx10_1View::CEx10_1View(){ //TODO:addconstructioncodeherem_pencolor=RGB(0,0,0);m_MouseDown=0;m_Shape=1;m_Style=1;} 14(5)对4种菜单消息进行响应①首先添加“直线”、“矩形”和“椭圆”消息处理函数。添加消息响应函数可以使用类向导,也可以手工添加,使用类向导进行消息映射已经在前面介绍过了,下面介绍手工添加方法:在ex10_1View.h中添加语句如下:protected: //{{AFX_MSG(CMyResoruceView)afx_msgvoidOnLine();afx_msgvoidOnRectangle();afx_msgvoidOnEllipse(); //}}AFX_MSG15在ex10_1View.cpp文件中,添加代码如下:BEGIN_MESSAGE_MAP(CEx10_1View,CView) //{{AFX_MSG_MAP(CMyResoruceView)ON_COMMAND(ID_LINE,OnLine)ON_COMMAND(ID_RECTANGLE,OnRectangle)ON_COMMAND(ID_ELLIPSE,OnEllipse) //}}AFX_MSG_MAP ...END_MESSAGE_MAP()16不论用哪种消息映射方法,都要编写消息处理函数,如果是手工添加的消息映射,那么在ex10_1View.cpp文件中添加函数及代码,如果是使用类向导添加消息响应函数的话,此处只添加代码,三个菜单项消息处理函数及代码如下:voidCEx10_1View::OnLine()//直线菜单消息处理函数{ //TODO:Addyourcommandhandlercodeherem_Shape=1;}voidCEx10_1View::OnRectangle()//矩形菜单消息处理函数{ //TODO:Addyourcommandhandlercodeherem_Shape=2;}voidCEx10_1View::OnEllipse()//椭圆菜单消息处理函数{ //TODO:Addyourcommandhandlercodeherem_Shape=3;}

17②单击某个线形菜单项时,要使线形发生改变,可以对ON_COMMAND_RANGE消息进行响应。由于ClassWizard不支持ON_COMMAND_RANGE消息的自动映射,只能手工添加消息响应函数。在ex10_1View.h中声明消息响应函数,添加语句如下:protected: //{{AFX_MSG(CMyResoruceView)afx_msgvoidOnLine();afx_msgvoidOnRectangle();afx_msgvoidOnEllipse();afx_msgvoidOnStyleChange(WORDnID); //}}AFX_MSGON_COMMAND_RANGE消息的处理函数OnStyleChange()带一个参数nID,就是当前选中的菜单项的ID。18在ex10_1View.cpp文件中,添加代码如下:BEGIN_MESSAGE_MAP(CEx10_1View,CView) //{{AFX_MSG_MAP(CMyResoruceView)ON_COMMAND(ID_LINE,OnLine)ON_COMMAND(ID_RECTANGLE,OnRectangle)ON_COMMAND(ID_ELLIPSE,OnEllipse)ON_COMMAND_RANGE(ID_STYLE1,ID_STYLE3,OnStyleChange)

//ID范围的最小值,ID范围的最大值,消息处理函数

//}}AFX_MSG_MAP ...END_MESSAGE_MAP()在ex10_1View.cpp的最后加入消息处理函数及代码:voidCEx10_1View::OnStyleChange(WORDnID){m_Style=nID-ID_STYLE1+1;}19③为使被选中的菜单项前面标记选中状态“√”,需要给“直线”、“矩形”和“椭圆”菜单项添加UPDATE_COMMAND_Ul消息响应函数,使用类向导进行消息映射,接受默认的消息处理函数名OnUpdateLine、OnUpateRectangle和OnUpateEllipse。添加代码如下:voidCEx10_1View::OnUpateLine(CCmdUI*pCmdUI){ //TODO:AddyourcommandupdateUIhandlercodeherepCmdUI->SetCheck(m_Shape==1?1:0);}voidCEx10_1View::OnUpateRectangle(CCmdUI*pCmdUI){ //TODO:AddyourcommandupdateUIhandlercodeherepCmdUI->SetCheck(m_Shape==2?1:0);}voidCEx10_1View::OnUpateEllipse(CCmdUI*pCmdUI){ //TODO:AddyourcommandupdateUIhandlercodeherepCmdUI->SetCheck(m_Shape==3?1:0);}

20只要是UI消息,都会自动带一个指针参数,通过它可以调用CCmdUI类的方法。常用的CCmdUI类方法及说明如表10-2所示。方法功能voidEnable(BOOLbOn=TRUE)禁止或允许该菜单项,TRUE允许该菜单项;FALSE禁止该菜单项voidSetCheck(intnCheck=1)设置菜单项或工具栏按钮的check状态,显示标志为“√”,0表示无check状态;1表示check状态;voidSetRadio(BOOLbOn=TRUE)与SetCheck功能类似,显示标志为“·”voidSetText(LPCTSTRlpszText)设置菜单项的标明属性21④单击某个线形菜单项时,要使线形发生改变的同时,所选线形菜单项的前面加点。当我们对具有连续ID值的菜单项操作时,不论选中了这三个中的哪一个,MFC都发来一个ON_COMMAND_RANGE消息(后发)和ON_UPDATE_COMMAND_UI_RANGE(先发)消息。对ON_UPDATE_COMMAND_UI_RANGE消息只能手工添加消息响应函数。在ex10_1View.h中加入如下代码:afx_msgvoidOnUpdateStyleChange(CCmdUI*pCmdUI);在ex10_1View.cpp中加入如下代码:ON_UPDATE_COMMAND_UI_RANGE(ID_STYLE1,ID_STYLE3,OnUpdateStyleChange)22在ex10_1View.cpp中加入如下代码:voidCEx10_1View::OnUpdateStyleChange(CCmdUI*pCmdUI){pCmdUI->SetRadio(m_Style==(pCmdUI->m_nID-ID_STYLE1+1));}pCmdUI->m_nID是当前的菜单项IDpCmdUI->m_nID-ID_Style1是当前的菜单项的下标23(6)在CEx10_1View类中添加鼠标消息处理函数OnLButtonDown(),并添加代码如下:voidCEx10_1View::OnLButtonDown(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultm_LineEnd=m_LineOrg=point;m_MouseDown=1; CView::OnLButtonDown(nFlags,point);}24(7)在CEx10_1View类中添加鼠标消息处理函数OnButtonMove(),并添加代码如下:voidCEx10_1View::OnMouseMove(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultif(m_MouseDown){ CClientDCDC(this); CPenPen1; if(m_Style==1) { Pen1.CreatePen(PS_DASH,1,m_pencolor); } else if(m_Style==2){Pen1.CreatePen(PS_DOT,1,m_pencolor); } else{Pen1.CreatePen(PS_DASHDOT,1,m_pencolor); } DC.SelectObject(&Pen1); DC.SetROP2(R2_WHITE); 25 switch(m_Shape) { case1://绘直线

DC.MoveTo(m_LineOrg); DC.LineTo(m_LineEnd); m_LineEnd=point; DC.SetROP2(R2_COPYPEN); DC.MoveTo(m_LineOrg); DC.LineTo(m_LineEnd); break;

26 case2://绘矩形

DC.SelectStockObject(NULL_BRUSH); DC.Rectangle(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); DC.MoveTo(m_LineOrg); m_LineEnd=point; DC.SetROP2(R2_COPYPEN); DC.Rectangle(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); break;

27 case3://绘椭圆

DC.SelectStockObject(NULL_BRUSH); DC.Ellipse(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); DC.MoveTo(m_LineOrg); m_LineEnd=point; DC.SetROP2(R2_COPYPEN); DC.Ellipse(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); break; }} CView::OnMouseMove(nFlags,point);}28(8)在CEx10_1View类中添加鼠标消息处理函数OnLButtonUp(),并添加代码如下:voidCEx10_1View::OnLButtonUp(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultm_MouseDown=0;CClientDCDC(this);CPenPen2;if(m_Style==1){ Pen2.CreatePen(PS_DASH,1,m_pencolor);}else if(m_Style==2){ Pen2.CreatePen(PS_DOT,1,m_pencolor);}else{ Pen2.CreatePen(PS_DASHDOT,1,m_pencolor);}DC.SelectObject(&Pen2);DC.SetROP2(R2_WHITE);29switch(m_Shape){ case1://绘直线

DC.MoveTo(m_LineOrg); DC.LineTo(m_LineEnd); m_LineEnd=point; DC.SetROP2(R2_COPYPEN); DC.MoveTo(m_LineOrg); DC.LineTo(m_LineEnd); break;

30 case2://绘矩形

DC.SelectStockObject(NULL_BRUSH); DC.Rectangle(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); DC.MoveTo(m_LineOrg); m_LineEnd=point; DC.SetROP2(R2_COPYPEN); DC.Rectangle(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); break;

31 case3://绘椭圆

DC.SelectStockObject(NULL_BRUSH); DC.Ellipse(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); DC.MoveTo(m_LineOrg); m_LineEnd=point; DC.SetROP2(R2_COPYPEN); DC.Ellipse(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y); break; }} CView::OnLButtonUp(nFlags,point);}3210.2加速键【例10-2】在例10-1的基础上添加Ctrl+L来触发“直线”菜单项加速键的功能。首先在项目工作区选择ResourceView选项卡,单击Accelerator项前的“+”号(或双击Accelerator),展开目录后双击IDR_MAINFRAME,打开加速键编辑器,会看到一张加速键列表,所显示的是系统已定义的加速键,在列表的最后高亮区域双击,会弹出Accel属性对话框。在ID文本框中输入ID_LINE("=32771”由系统自动显示),即输入了“直线”菜单项标识符,然后单击“下一个按下的键”按钮,按下对应的加速键,这里按下Ctrl+L,则VC++自动设置好键、辅助键和类型三个属性。按Enter键则完成加速键定义。

3310.3工具栏标准的Windows应用程序,工具栏一般位于主菜单的下一行,通常工具栏上的一个按钮就对应某一个菜单项,且功能一致。10.3.1增加工具栏按钮创建MFC应用程序框架中,在MFC应用向导第四步对话框中选中“停靠工具栏”就为应用程序添加了默认工具栏。在默认工具栏上添加工具栏按钮的步骤如下:(1)打开工作区的资源视图,找到ToolBar节点展开,双击IDR_MAINFRAME标识符,打开工具栏资源编辑器对话框(2)添加工具:选中工具栏预览区最后的空白按钮,然后在该按钮的放大位图上利用绘图工具绘制所需图形。34(3)为使工具按钮和菜单命令的功能相同,在相应的工具栏按钮上双击,打开工具栏按钮属性对话框,修改ID的内容,使其与相应的菜单命令的ID一样,在提示栏中设置相关的内容,例如“打开一个现有文档\n打开”,其中“\n”前面的内容是在状态栏上显示出来的,“\n”后面的内容将是鼠标停留在该按钮上时显示的内容,通常设为该按钮的功能提示。然后关闭即可。

3510.3.2工具栏应用实例【例10-2】在例10-1中添加工具栏,工具栏中包含4个按钮,分别对应菜单的“显示”、“直线”、“矩形”和“椭圆”菜单项。该工具栏可以在窗口中任意位置停靠,而且当鼠标停留在工具栏按钮上时,将显示该按钮的功能。实现步骤如下:(1)增加工具栏资源单击插入菜单中的资源菜单项,在弹出的对话框中选择Toolbar,单击新建按钮插入新的工具栏资源。这时在资源编辑器中可以看到一个新的工具栏资源。将新加入的工具栏资源的ID重新命名为IDR_TOOLBAR_NEW。绘制4个按钮,并设置相应的ID。用户根据需要设计好自己的工具栏后,MFC会自动在资源文件(.rc)和头文件中加入相应的工具栏代码。36(2)将工具栏添加到窗口中 添加了资源后,需要把工具栏的对象加入到应用程序框架窗口中(CMainFrame)。首先需要在应用程序的CMainFrame类中加入工具栏对象m_wndToolBar。在MainFrm.h中声明一个CToolBar变量,添加如下代码:CToolBarm_wndToolBarNew;(3)在框架窗口类的OnCreate()函数中调用工具栏类的Create()或CreateEx()成员函数创建该工具栏,并调用LoadToolBar()成员函数将工具栏对象和前面创建的工具栏资源绑定在一起。37在MainFrm.cpp文件的OnCreate()函数中添加如下代码:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ if(!m_wndToolBarNew.CreateEx(this,TBSTYLE_FLAT,WS_CHILD |WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_wndToolBarNew.LoadToolBar(IDR_TOOLBAR_NEW)) { TRACE0("Failedtocreatetoolbar\n"); return-1;//failtocreate }}这段代码首先通过CreateEx()函数创建一个工具栏,然后通过LoadToolBar函数将创建的工具栏与指定的资源(也就是刚才新建的工具栏资源)绑定。38CreateEx()函数的参数比较多,第一个参数是父窗口的指针,this表示当前的CmainFrame类窗口指针;第二个参数是按钮样式,TBSTYLE_FLAT表示扁平样式;第三个参数是工具栏风格,这里可以指定基本的窗口风格和基本的工具栏风格,WS_CHILD表示该工具栏是子窗口,WS_VISIBLE表示该工具栏是可见的,通常这两个风格是必须设置的,基本的工具栏风格如表10-3所示。39标志简单描述CBRS_TOP将工具栏放在窗口顶部CBRS_BOTTOM将工具栏放在窗口底部CBRS_ALIGN_ANY工具栏放在窗口的任意位置CBRS_NOALIGN防止控制条在其父窗口改变大小时被复位CBRS_FLOAT_FLOAT工具栏在主窗口中可以浮动CBRS_TOOLTIPS鼠标光标在按钮上暂停时,显示工具提示CBRS_FLYBY鼠标光标在按钮上暂停时,显示命令描述CBRS_SIZE_DYNAMIC工具栏的大小可变CBRS_SIZE_FIXED工具栏的大小不可变CBRS_GRIPPER在工具条的左边加一个夹条CBRS_HIDE_INPLACE隐藏工具栏40为了使新增的工具栏可以在窗口中自由停靠,在MainFrm.cpp文件的OnCreate()函数中,还要增加如下代码:m_wndToolBarNew.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBarNew);

应用程序中的工具栏一般具有停靠或浮动特性,上面第一条语句调用CmainFrame类的成员函数EnableDocking(),使得m_wndToolBarNew对象可以停靠在父窗口任何一边;第二条语句允许工具栏在主框架窗口内任何一边停靠;第三条语句中DockControlBar()也是CmainFrame类的成员函数,说明工具栏在父窗口内按照前面指定的风格停靠。4110.4.2状态栏应用实例【例10-3】在应用程序例10-2的基础上,在状态栏中添加两个新的指示器用于显示鼠标在窗口中的坐标。实现步骤如下:(1)为新建窗格创建一个做为指示器标识符的命令ID。命令ID可以设置成串表也可以设置成菜单项,本例中把命令ID设置成串表。①在工程工作区中单击ResourceView,打开资源视图,在根文件夹上单击鼠标右键,在弹出的菜单中选择资源符号菜单项,弹出如图10-11所示的资源符号对话框。单击新建按钮,弹出如图10-12所示的新建符号对话框,在该对话框中,名称文本框用于指定标识符,值文本框用于指定标识符的数值。在名称文本框中输入ID_X,接受默认的标识符数值,单击确定按钮,完成X坐标指示器标识符的定义。按同样的方法建立Y坐标指示器标识符ID_Y,接受默认的标识符数值。在定义标识符时,用户完全可以自主指定标识符的数值,但要注意标识符的数值一定不能重复。42②在项目工作区选择ResourceView选项卡,单击项目名ex10_1resources前的“+”号,选择StringTable,打开字符串资源编辑器。双击字符串资源编辑器中最后的空白行,打开String属性对话框,在ID框中选择ID_X,在标题列表框中输入“横坐标X”。同样,给标识符ID_Y指定标题为“纵坐标Y”。43(2)在状态栏描述数组中添加新的命令ID。将新建的命令ID添加到状态栏描述数组中,该数组位于MainFrm.cpp文件的开始部分。对数组indicator的数组元素进行如下修改:staticUINTindicators[]={ ID_SEPARATOR,//状态栏指示符

ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,

ID_X, ID_Y,};新的命令ID在数组indicators中的位置决定新字符串在状态栏中的位置。数组中下标为0的元素在状态栏的最左端,依次从左向右排列。44(3)为该窗格创建一个命令更新处理程序。使用类向导在CEx10_1View类中为ID_X的0N_UPDATE_COMMAND_UI消息进行消息映射,接受默认的函数名OnUpdateX(),为ID_Y的0N_UPDATE_COMMAND_UI消息进行消息映射,接受默认的函数名OnUpdateY()。(有时候只能手工添加)在文件ex10_1View.cpp中手工添加消息映射宏,代码如下:ON_UPDATE_COMMAND_UI(ID_X,OnUpdateX)ON_UPDATE_COMMAND_UI(ID_Y,OnUpdateY)同时在ex10_1View.h中手工添加如下函数声明:afx_msgvoidOnUpdateX(CCmdUI*pCmdUI);afx_msgvoidOnUpdateY(CCmdUI*pCmdUI);可以理解为在视图类的所有0N_UPDATE_COMMAND_UI消息,都调用OnUpdateX()对状态栏ID_X操作,调用OnUpdateY()对状态栏ID_Y操作。45(4)添加消息响应函数的代码①在ex10_1View.h中添加整型数据成员m_MouseX和m_MouseY,用于保存鼠标的x和y坐标值,添加代码如下:intm_MouseX;//鼠标x坐标intm_MouseY;//鼠标y坐标②在视图类构造函数中对新添加的数据成员初始化,代码如下:CEx10_1View::CEx10_1View(){ //TODO:addconstructioncodeherem_MouseDown=0;m_Shape=1;m_MouseX=0;m_MouseY=0;}46③在鼠标移动消息处理函数中给表示鼠标位置坐标的数据成员赋值,代码如下:voidCEx10_1View::OnMouseMove(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultm_MouseX=point.x;m_MouseY=point.y; CView::OnMouseMove(nFlags,point);}④为函数OnUpdateX()添加代码如下:voidCEx10_1View::OnUpdateX(CCmdUI*pCmdUI){ CStringprompt; pCmdUI->Enable(); prompt.Format("X:%d",m_MouseX);//显示鼠标x坐标

pCmdUI->SetText(prompt);}47⑤为函数OnUpdateY()添加代码如下:voidCEx10_1View::OnUpdateY(CCmdUI*pCmdUI){ CStringprompt; pCmdUI->Enable(); prompt.Format("Y:%d",m_MouseY);//显示鼠标y坐标

pCmdUI->SetText(prompt);}4810.5图标资源 每个Windows应用程序在资源管理器中都有自己的图标,这个图标就是ICON资源。很多时候我们对于MFC框架应用程序的默认图标不满意,所以要把它换掉。 一种简单的方法是在工作区中选择ResourceView页,把Icon下ID为IDR_MAINFRAME的图标资源删除,再导入自己制作的图标资源,把资源ID改为IDR_MAINFRAME就可以了。 如果要在程序中写代码改变我们应用程序的图标,比如有时候我们要在程序中动态改变程序的标题栏或任务栏图标,那就要使用MFC的LoadIcon()函数。【例10-4】在例10-3的基础上通过修改光标资源,使得执行程序的图标变为红色圆形的样子。(1)在工程工作区中单击ResourceView,打开资源视图,在Icon文件夹上单击鼠标右键,在快捷菜单中选择插入,资源类型选Icon,进入图标编辑器新建一个图标资源,ID号使用默认的IDI_ICON1。也可以导入一个图标资源。

49(2)在CMainFrame::OnCreat()函数中加入代码如下:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){

HICONico; ico=AfxGetApp()->LoadIcon(IDI_ICON1); SetIcon(ico,true);

SetIcon(ico,false);//效果一样

return0;}LoadIcon()函数用来装载图标:

SetIcon(ico,true);设置大图标,指明使用大图标(32*32相素),在用户按ALT+TAB键切换窗口时,显示的就是大图标。SetIcon(ico,false);设置小图标。指明使用小图标(16*16像素),小图标就是对话框窗口标题栏上的那个图标。这两行代码就将应用程序的图标设置好了。5010.6位图资源如果需要一些精美的图片来点缀界面,可以选择位图资源来实现。位图是一种数字化的图形表示形式,基本数据结构是像素,一个像素表示一个离散点的颜色值。VC++6.0的资源编辑器只支持256色及以下的位图的编辑,而最新的VC++7.0已经支持24位真彩位图的编辑了。保存在文件中的位图可以看作是设备无关的,文件本身的数据用来描述位图的内容。【例10-5】在例10-4的基础上显示一幅256色的图片。(1)首先通过其它绘图软件将一幅图片保存为256色位图,在工作区中选择ResourceView的根目录,单击鼠标右键,在快捷菜单中选择引入,在弹出的对话框中的“打开为”选择自动,“文件类型”选择所有文件,选择一个256色的位图文件,击“引入”按钮后进入位图编辑器。可以修改其ID为IDB_BITMAP_256。51(2)在ex10_1View.cpp的OnDraw()函数中加入如下代码:voidCEx10_1View::OnDraw(CDC*pDC){ CBbDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahereCDCdcMemory;//定义并创建一个内存设备环境dcMemory.CreateCompatibleDC(pDC);CBitmapbmp1;//定义位图对象bmp1.LoadBitmap(IDB_BITMAP_256);//加载256位图BITMAPbmpInfol;//定义一个BITMAP结构的变量,存放位图尺寸bmp1.GetBitmap(&bmpInfol);//获得位图bmp1的尺寸CBitmap*pOldBitmap=dcMemory.SelectObject(&bmp1);//选择位图到内存缓冲设备中pDC->BitBlt(200,10,bmpInfol.bmWidth,bmpInfol.bmHeight,&dcMemory,0,0,SRCCOPY);//绘制到屏幕}

52对于绘图或照片一类的位图数据量一般较大,为了提高显示刷新速度,位图操作必须在内存中进行。对于位图操作的系统设备环境为内存设备环境。应用程序首先要调用函数CreateCompatibleDC()向系统申请获取内存设备环境。语句dcMemory.CreateCompatibleDC(pDC);创建与pDC格式相兼容的DC。数据结构BITMAP在位图操作中经常使用,其定义中的bmWidth和bmHeight分别是位图的宽和高。位图的最终显示是通过调用DC类的BitBlt()函数来完成的,函数原型如下:BOOLBitBlt(intXDest,intYDest,//目的设备环境(显示器设备环境)中位图基点intnWidth,intnHeitght,//目的设备环境中位图宽度和高宽HDChdcSrc,//源设备环境句柄(内存设备环境句柄)intnXSrc,intnYsrc,//源设备环境中位图基点,一般为0,0DWORDdwRop//标识位图显示方式,常用SRCCOPY,用来直接将位图复制到目的设备环境。)5310.7对话框资源对话框分为模态对话框与非模态对话框两种。模态对话框显示的时候,整个程序只有模态对话框窗口获得焦点,可以和用户交互。非模态对话框显示的时候,程序主体部分仍然可以和用户进行交互。在使用的时候是选择模态对话框还是非模态对话框要取决于程序的具体情况。10.7.1模态对话框应用程序的大部分对话框都是模态对话框。对话框的建立可分为如下几步:(1)利用对话框资源编辑器创建对话框资源。(2)把对话框资源生成对话框类。(3)给控件连接变量。(4)消息映射。(5)对话框的显示。54【例10-6】在例10-5的基础上创建一个对话框资源,对话框中设置一个颜色下拉列表框,在程序主菜单的“操作”菜单中增加一个菜单项“颜色”,当用户在菜单中选择颜色菜单项的时候,就弹出该对话框,让用户选择颜色,然后使用刚设置的颜色来画直线、椭圆或矩形。颜色选择对话框如图所示。55实现步骤如下:(1)对话框资源的创建首先要创建资源,在工程工作区中单击ResourceView,打开资源视图,在根文件夹上单击鼠标右键,在弹出的菜单中选择插入(也可以在插入菜单中选择资源菜单项),然后在资源类型对话框中选择Dialog,击新建按钮。右侧的对话框资源编辑器中便出现新创建的对话框资源。根据要求设计界面,增加一个静态文本和一个下拉列表框控件。设置好各控件的属性,把对话框的ID设置为IDD_DIALOG_NEW。添加控件的方法以及设置控件属性、调整控件的尺寸和位置的方法同第九章,给下拉列表框装载选项的方法同第九章。(2)生成对话框类在创建完对话框资源之后,需要生成一个相关的对话框类。确保当前VC++处于对话框编辑器状态,进入类向导,然后选择CreateaNewClass,单击OK按钮,弹出NewClass对话框,在Name框中输入“CInputDlg”即可。56(3)给控件连接变量给对话框中的下拉列表框控件IDC_CO

温馨提示

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

评论

0/150

提交评论