程序设计专题实验.pdf
程序设计专题实验参考程序设计专题实验参考 西安交通大学电信学院“程序设计专题”课程组 2007 年 6 月 目 录 目 录 1 目标.1 2 基础知识.1 3 VC+集成开发环境中的程序开发.2 3.1 在 VC+集成开发环境中进行简单 C 程序的编写与运行调试.2 3.2 在 VC+集成开发环境中创建基于单文档的可视化应用程序.3 4 制作菜单与工具栏.4 4.1 制作菜单.4 4.2 制作工具栏.5 4.3 处理函数的添加.7 5 文本与图形的显示.7 5.1 Windows 客户区.8 5.2 图形设备接口.8 5.3 显示文本.9 5.4 绘制图形.10 6 显示图片.13 6.1 添加位图资源.13 6.2 显示位图资源.14 7 系统时间和定时器.14 7.1 系统时间.14 7.2 定时器.16 7.3 调用系统时间设置窗口.17 8 模式对话框.18 8.1 模式对话框创建步骤.18 8.2 模式对话框的一般使用方式.18 8.3 常用的系统对话框.18 9 VC+标准控件的使用.19 9.2 控件之间的消息传递.21 9.3 控件使用的例程与实现.21 10 VC+调试方法.24 10.1 调试环境的建立.24 10.2 调试的一般过程.24 10.3 高级调试技术.25 11 目标目标 通过本文档中给出的参考与例程,希望能够在以下几个方面有所帮助:(1)在 VC+集成开发环境中进行程序开发的一般过程;(2)掌握基于单文档的应用程序实现方法;(3)菜单的使用方法:包括菜单资源的建立、编辑方法和菜单项响应函数的创建方法。(4)工具栏的使用方法:包括工具栏资源的建立、编辑方法和工具栏条目响应函数的创建方法。(5)画图与文字显示方法。包括基本图形的绘制,画笔、画刷的设置,已绘制图形的重新显示,文本的显示等内容。(6)定时器的使用。包括定时器的设置,定时器响应函数的创建等。(7)掌握模式对话框的实现方法及 VC+标准控件的基本使用方法;(8)掌握 VC+集成开发环境中的基本调试方法。2 基础知识基础知识 Visual C+作为一种程序设计语言,它同时也是一个集成开发工具,一个在Windows 下进行 32 位应用程序开发的可视化集成开发环境,提供了软件代码自动生成和可视化的资源编辑功能。相比其他的编程工具而言,VC+在提供可视化编程方法的同时,也适用于编写直接对系统进行底层操作的程序,其生成代码的质量也较其他很多开发环境更优。在各种各样的 VC+及 Windows 编程的书籍中,经常会提及这样两个常见以缩写方式出现的词:MFC(Microsoft Foundation Class Library),即:Microsoft 基础类库,它是 VC+的核心,为编程者提供了一个应用程序框架,这个应用程序框架为编程者完成了很多 Windows 编程中的例行性工作,如管理窗口、菜单和对话框,执行基本的输入和输出、使用集合类来保存数据对象等等;API(Application Programming Interface),即:应用程序接口,它是所有Windows 应用程序的根本之所在。简单的说,API 就是一系列的例程,应用程序通过调用这些例程来请求操作系统完成一些低级服务。在 Windows 这样的图形用户界面中,应用程序的窗口、图标、菜单和对话框等就是由 API 来管理和维护的。关于这个开发环境的一些基础性的知识内容,可以在各种参考书籍中查阅。这里不再占用篇幅。2 3 VC+集成开发环境中的程序开发集成开发环境中的程序开发 3.1 在在 VC+集成开发环境中进行简单集成开发环境中进行简单 C 程序的编写与运行调试程序的编写与运行调试 在 VC+集成开发环境所提供的强大的编辑和调试环境的支持下,简单 C 语言应用程序的开发过程会变得相对容易些。但是有一点要明确:在 VC+开发环境中,对程序的调试、运行等都建立在“项目”或“工程”(Project)的基础上。因此,即使是只有一个 C 文件,也需要运行在一个工程之中。3.1.1 创建新工程:创建新工程:(1)选择 FileNew 菜单命令,在弹出的“新建”对话框中选择 Project 选项卡。(2)选择 Win32 Application,在 Project Name 编辑框中输入一个工程名,如MyProject,选择工程存放的路径 Location,单击 OK 按钮。(3)选择 An Empty Project,并单击 Finish 按钮。系统弹出一个”New Project Information”窗口,点击 OK 确定。一个空的工程就创建好了。在 WorkSpace 里查看 FileView,可以看到 MyProject树下有三个文件夹:Source Files,Header Files 和 Resource Files,但是都是空的。查看 Window 系统中相应的路径,MyProject 目录下有一个名为 Debug 的空文件夹,三个新创建的文件 Myproject.dsp,MyProject.dsw 和 MyProject.ncb 保存项目的相关信息。3.1.2 编写应用程序编写应用程序(1)点击新建一个文件,并且保存为 MyProgram.c。(2)在 WrokSpace 的 FileView 中,点击 MyProject Files 前的,展开文件树,在 Source Files 处点击右键,并选择:”Add Files to Folder.”。(3)在弹出的对话框中,选择 MyProgram.c,并点击 OK,可以看到MyProgram.c 出现在 Source Files 文件树之中。新的应用程序已经创建,并且已经包含到工程之中。双击 MyProgram.c,就可以编写应用程序了。如果希望编写 C+程序,只需在保存文件时使用.cpp 作为后缀名即可。通过 FileNew,选择 C+源文件,也可以很方便地创建应用程序文件。3.1.3 程序的编译、运行程序的编译、运行 对于 C 程序而言,其编译运行方法与普通 VC+程序的编译运行过程完全一致。编译、运行的操作都在 Build 菜单中。工具栏中的图标:分别代表:编译程序、创建应用程序、停止创建过程、执行应用程序、调试、设置断点。33.2 在在 VC+集成开发环境中创建基于单文档的可视化应用程序集成开发环境中创建基于单文档的可视化应用程序 基于单文档的项目就是用单窗口文档做为主窗口的一个程序。这样的编程工作在 VC+开发软件的帮助下会变得相对简单得多。我们可以使用 MFC,通过AppWizard 来生成应用程序框架,然后再在此框架的基础上添加特定的应用程序的功能。说明一点:说明一点:AppWizard 能够帮助我们建立起一个应用程序的框架,但绝大多数的应用程序的代码还需要我们亲自编写。明白这一点是很重要的:AppWizard 所做的,只不过是我们在程序设计过程中所需要的最没有创意的那一部分事情。对于基于单文档的应用程序来说,我们可以很容易地使用 AppWizard 来实现一个单文档界面,在整个过程中,只需要做一点点简单的选择就足够了。3.2.1 创建应用程序框架创建应用程序框架(1)选择 FileNew 菜单命令,在弹出的“新建”对话框中选择 Project 选项卡。(2)选择 MFC AppWizard(exe),在 Project Name 编辑框中输入工程名,如MyApp,单击 OK 按钮,出现 Step 1 对话框。(3)选择单文档选项,单击 Next 按钮,出现 Step 2 对话框。(4)在以后各步中接受默认设置,一直到最后点击 Finish。(5)点击 OK 确认新生成项目的信息,系统会自动生成一个基于单文档的工程。WorkSpace 中会出现三个选项卡,如图 1 所示:图 1 VC+6.0 中的 WorkSpace 窗口 在 FileView 中,可以看到向导已经为我们生成了一些基本的应用程序框架,后面的程序就是在这个框架的基础上进行添加的。3.2.2 程序的编译、运行程序的编译、运行 点击进行编译链接,生成 MyApp.exe。点击运行。这个名为“无标题“的程序就是向导为我们完成的。4 4 制作菜单与工具栏制作菜单与工具栏 4.1 制作菜单制作菜单 当创建程序框架时,AppWizard 为其自动生成了如图 2所示的菜单资源IDR_MAINFRAME。图 2 由 AppWizard 自动生成的菜单资源(1)创建菜单项 a)在 Resource View 中,单击 Menu 项左边的“+”,然后双击其子项IDR_MENUFRAME,打开菜单资源编辑器。b)选择菜单条上的新条目框(空的矩形框),双击,在弹出的属性窗口中输入菜单名称(如果不是弹出式菜单,还需要输入合适的 ID)。点击属性窗口左上角的图标,可以固定属性窗口,添加多个菜单项。例:在“查看”菜单项下添加“闹钟工具栏”菜单(ID_VIEW_RING_BAR)。(2)创建快捷菜单资源 a)在 Resource View 中的 Menu 项上点右键,选择“Insert menu”创建新菜单。b)在 Resource View 中新建的菜单上右击,选择“Properties”改变菜单ID 为 IDR_CONTEXT_MENU。c)用上面的方法加入新的菜单项,“设置颜色”-“前景色、背景色”。(3)添加消息处理函数 a)选择“View”下的“Class Wizard”菜单项。b)在弹出的对话框中选“Message Map”标签,在该标签下的“Class Name”5处选择“CMyAppView”,在“Object IDs”框中选择相应的菜单 ID,在右边的“Message”框中选择相应的事件。需要增加的菜单消息处理函数见下表:对象标识符对象标识符 消息消息 函数名函数名 所属类所属类 ID_VIEW_RING_BAR COMMAND UPDATE_COMMAND_UIOnViewRingBar OnUpdateViewRingBar CMainFrame ID_COLOR_FRAME COMMAND OnColorFrame CMyAppViewID_COLOR_TEXT COMMAND OnColorText CMyAppView。(4)快捷菜单 用户单击鼠标右键时弹出的菜单为快捷菜单,VC 中专门为快捷菜单提供了WM_CONTEXTMENU 消息,用户只需要在应用程序中添加该消息的处理函数即可。例,将刚才创建的 IDR_CONTEXT_MENU 菜单作为快捷菜单显示的程序段为:void CMyAppView:OnContextMenu(CWnd*pWnd,CPoint point)/TODO:Add your message handler code here CMenu menu;if(menu.LoadMenu(IDR_CONTEXT_MENU)CMenu*ppopup=menu.GetSubMenu(0);ppopup-TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);4.2 制作工具栏制作工具栏 当创建程序框架时,AppWizard 为其自动生成了如图 3所示的工具栏资源IDR_MAINFRAME。在应用程序中,可根据自己的需要对工具栏进行编辑,或创建新的工具栏。例在 IDR_MAINFRAME 工具栏中添加“颜色选择”项,创建新的工具栏“绘图工具栏”。图 3 由 AppWizard 自动生成的工具栏资源 (1)编辑现有工具栏 6 a)在 Resource View 中,单击 Toolbar 项左边的“+”,然后双击其子项IDR_MAINFRAME,打开工具栏资源编辑器。b)选择工具条上的新条目框(空的矩形框),双击,输入图标的 ID(如果选择与菜单项相同的 ID,则可与菜单项共用一个消息响应函数),编辑工具选项的图标。c)通过鼠标拖动项目,可以将该项放在合适的位置。例:加入工具项“设置时间”。(2)创建新的工具栏 a)在 Resource View 中的 Toolbar 项上点右键,选择“Insert toolbar”创建新工具栏。b)在 Resource View 中新建的工具栏上右击,选择“Properties”改变菜单 ID 为 IDR_RING_TOOLBAR。c)用上面的方法加入新的工具项,“设置闹钟、取消闹钟”等。(3)添加消息处理函数 添加方法如前。需要增加的工具项消息处理函数见下表:对象标识符对象标识符 消息消息 函数名函数名 所属类所属类 ID_SET_RING_ON COMMAND OnSetRingOn CMyAppView ID_SET_RING_OFF COMMAND OnSetRingOff CMyAppView。(4)将工具栏载入应用程序 要显示工具栏,必须要将它载入应用程序中。一般通过重载 CMainFrame 类中的 OnCreate 函数载入工具栏。如果应用程序中包含不同的子窗口类型,且需要为每个子框架窗口创建不同的工具栏,则可以在 CChildFrame 类的 OnCreate 函数中载入工具栏(OnCreate 函数是 WM_CREATE 消息映射的处理函数)。例如:将新建的 IDR_RING_TOOLBAR 工具栏载入应用程序的语句段为:a)在 CMainFrame 类的头文件中声明工具栏对象:CToolBar m_DrawToolBar;b)在 CMainFrame 类的实现文件 OnCreate 函数中载入工具栏对象:int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)/载入绘图工具栏 if(!m_DrawToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_ALIGN_LEFT|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|!m_DrawToolBar.LoadToolBar(IDR_RING_TOOLBAR)7 TRACE0(Failed to create toolbarn);return-1;/fail to create /使工具栏浮动 m_DrawToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_DrawToolBar);(5)工具栏的显示与隐藏 工具栏载入后,其显示与隐藏可以由应用程序中的菜单来控制。例如:利用“闹铃工具栏”(ID_VIEW_RING_BAR)来控制显示与隐藏工具栏:void CMainFrame:OnViewRingBar()/TODO:Add your command handler code here BOOL bvisible=(m_DrawToolBar.GetStyle()&WS_VISIBLE)!=0);ShowControlBar(&m_DrawToolBar,!bvisible,FALSE);RecalcLayout();void CMainFrame:OnUpdateViewRingBar(CCmdUI*pCmdUI)/TODO:Add your command update UI handler code here BOOL bvisible=(m_DrawToolBar.GetStyle()&WS_VISIBLE)!=0);pCmdUI-SetCheck(bvisible);4.3 处理函数的添加处理函数的添加 以上步骤中通过 AppWizard 添加的一系列处理函数中,除了为了显示菜单和工具栏,在一些处理函数中添加了相应的处理代码外,其他的函数并没有真正的处理过程。在这些函数中添加什么样的处理函数,就要看程序中需要它们做些什么事情了。这也正如之前所说,AppWizard 为你搭建的只是一个框架,程序的灵魂还需要自己来编写。5 文本与图形的显示文本与图形的显示 VC+中可以显示我们所期望的文字或者图形,此时,我们需要使用文本工具或者图形工具来完成这一任务。在介绍这些之前,我们应该对 Windows 的客户区域和图形设备接口(GDI)有一个初步的了解。8 5.1 Windows 客户区客户区 一个 Windows 窗口具有一个举行的“客户区域”,它包括边框、标题栏、菜单和贴边工具栏。CWnd 中的 GetClient 成员函数可以获得客户区域的大小。一般来说,一个程序的操作都是在这个客户区域以内进行的。在获取客户区大小时,常使用的方式是通过 GetClientRect()函数,把客户区的大小返回给 CRect 类型的变量 Rect。代码如下:CRect Rect;GetClientRect(&Rect);为了在这个客户区域内进行有效的显示输出,要对 Windows 的坐标体系进行初步了解。我们以显示象素作为绘图单位,我们称之为设备坐标。比如当我们要绘制一个矩形的时候,使用:pDC-Rectangle(CRect(0,0,200,200);其中的(0,0)代表矩形的左上角坐标值,(200,200)代表右下角坐标值。这和我们通常看到的直角坐标系的坐标方向有点不一样,设备坐标中,向下的方向是 y 轴的正方向。也就是说,对于一个 1024768 的窗口而言,窗口的左上角是(0,0)坐标,窗口的右下角坐标是(1024,768)。Windows 提供的还有逻辑坐标,有兴趣的话可以翻阅相关 VC+编程的书籍做进一步了解。我们的图形或文字在什么位置输出,就要根据这个客户区域的大小来设置了。比如,可以计算得到区域的中间位置:int CenterX=Rect.right/2;int CenterY=Rect.bottom/2;并在这个位置的基础上,进行相应的调整,得到我们所需要的位置。5.2 图形设备接口图形设备接口 Windows 的图形设备接口(GDI)对象类型是通过 MFC 库中的类来表示的。CGdiObject 是所有 GDI 对象类的抽象基类,它为各种 Wi ndows 的 GDI 对象,如位图、区域、画刷、画笔、调色板、字体等提供了一些基本类。我们不会直接构造一个 CGdiObject 对象,而是使用某一个派生类如 CPen 或 CBrush 创建。基本绘图对象类主要包括 CBitmap 类、CBrush 类、CFont 类、CPen 类、CRgn类和 CPallete 类:?CBitmap 位图是一种位矩阵,每一个显示象素都对应于其中的一个或多个位。我们可以利用位图来表示图象,也可以利用它来建立画刷。?CBrush 画刷定义了一种位图形式的象素,利用它可以对区域内部填充颜色;?CFont 字体是一种具有某种风格和尺寸的所有字符的完整集合,它常常被当作资源存放于磁盘中,其中有一些还依赖于某种设备。9?CPalette 调色板是一种颜色映射接口,它允许应用程序在不干扰其他应用程序的前提下,可以充分利用输出设备的颜色描绘能力。?CPen 笔是一种用来画线及绘制有形边框的工具,我们可以指定它的颜色及宽度,并可以指定它画实线、点线或虚线。?CRgn 区域是由多边形、椭圆或二者组合形成的一种范围,可以利用它来进行填充、裁剪以及鼠标点中测试。通常情况下,都使用 GDI 绘图对象类所创建的对象进行绘制各种图形。一般是先构造所需要得绘图类对象,然后将其选入设备环境(DC),即可利用 CDC 类的 SelectObject 成员函数将 GDI 对象选入设备环境中,也可利用 CDC 类的SelectStockObject 成员函数将 Windows 中预先定义好的 GDI 对象(库存 GDI 对象)选入设备环境中,使用库存 GDI 对象后无需删除它们。5.3 显示文本显示文本 5.3.1 设置文本属性设置文本属性 显示文本时,首先需要设置的是文本的属性信息。一个典型的文本设置过程如下:CFont fontText,*pOldFont;fontText.CreateFont(40,0,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,Time New Roman);pOldFont=(CFont*)pDC-SelectObject(&fontText);CreateFont()创建所需的文本属性,其函数原型为:HFONT CreateFont(int nHeight,int nWidth,int nEscapement,int nOrientation,int fnWeight,DWORD fdwltalic,DWORD fdwUnderline,DWORD fdwStrikeOut,DWORD fdwCharSet,DWORD fdwOutputPrecision,DWORD fdwClipPrecision,DWORD fdwQuality,DWORD fdwPitchAndFamily,LPCTSTR lpszFace);详细的参数设置请参阅相关手册。SelectObject()函数使用设定的文字属性来设置 pDC 画笔的属性,并把之前的属性通过函数返回值传给 pOldFont。10 5.3.2 设置文字颜色设置文字颜色 通过 pDC-SetTextColor(TextColor);设置文字颜色。其中,TextColor 定义为:COLORREF TextColor;COLORREF 是一个 32-bit 整型数值,它代表了一种颜色。可以使用 RGB 函数来初始化 COLORREF。例如:COLORREF Textcolor=RGB(0,255,0);RGB 函数接收三个 0-255 数值,分别代表红色、绿色和蓝色。(0,0,0)为黑色,(255,255,255)为白色。5.3.3 显示文字显示文字 显示文字通过 TextOut()函数完成。pDC-TextOut(XPos,YPos,strText);其中的(XPos,YPos)给出了文本输出位置的左上角坐标。在设定位置时,可能会根据输出字体本身的大小来调整输出位置。当 pDC 中设定字体之后,可以通过GetTextExtent()函数获取 CString 类型文字的尺寸,返回给 CSize 类型的变量,如:CString strText;CSize sizeText=pDC-GetTextExtent(strText,strText.GetLength();x 方向的大小可以通过 sizeText.cx 引用,y 方向的大小通过 sizeText.cy 引用。5.4 绘制图形绘制图形 在 CPen 类的帮助下,我们可以进行图形的绘制。绘制一个矩形的基本过程是:CPen Pen(PS_SOLID,20,PanColor);CPen*OldPen=pDC-SelectObject(&Pen);pDC-Rectangle(40,40,100,80);5.4.1 创建创建 CPen 对象对象 CPen 类的构造函数有三种:CPen();CPen(int nPenStyle,int nWidth,COLORREF crColor);CPen(int nPenStyle,int nWidth,const LOGBRUSH*pLogBrush,int nStyleCount=0,const DWORD*lpStyle=NULL);参数参数 nPenStyle:指定画笔的风格。在构造函数的第一个版本中,此参数可以取下列值之一:?PS_SOLID 创建一支实线画笔。?PS_DASH 创建一支虚线画笔。只有当画笔宽度为 1 或更小(以设备单位计算)时才有效。11?PS_DOT 创建一支点线画笔。只有当画笔宽度为 1 或更小(以设备单位计算)时才有效。?PS_DASHDOT 创建一支虚线和点交替的画笔。只有当画笔宽度为 1 或更小(以设备单位计算)时才有效。?PS_DASHDOTDOT 创建一支虚线和两点交替的画笔。只有当画笔宽度为 1 或更小(以设备单位计算)时才有效。?PS_NULL 创建一支空画笔。?PS_INSIDEFRAME 创建一支画笔,该画笔在 Windows GDI 输出函数所产生的封闭形状的框架内画线,此输出函数指定一个限定矩形(例如,Ellipse,Rectangle,RoundRect,Pie 和 Chord 成员函数),当此风格用于没有指定限定矩形的 WindowsGDI 输出函数(例如 LineTo 成员函数)时,此画笔的绘制区域不受框架的限制。第二种版本的 CPen 构造器指明了类型、风格、尾帽和连接等属性组合。来自每个类别的值应使用位操作符(|)组合起来,笔的风格可以是下列之一:?PS_GEOMETRIC 创建一支几何画笔。?PS_COSMETIC 创建一支装饰画笔。CPen 构造函数的第二个版本为 nPen Style 添加了下列一些画笔风格:?PS_ALTERNATE 创建一支交替设置像素的画笔(此风格只用于装饰画笔)。?PS_USERSTYLE 创建一支使用用户提供的风格数组的画笔。尾帽可以是下列值之一:?PS_ENDCAP_ROUND 尾帽是圆的。?PS_ENDCAP_SQUARE 尾帽是方的。?PS_ENDCAP_FLAT 尾帽是平面的。连接可以是下列值之一:?PS_JOIN_BEVEL 连接是斜截式的。?PS_JOIN_MITER 当连接在:SetMiterLimit 函数所设置的当前限制之内时,连接是斜接式的。如果连接超出这个限制则成为斜截式的。?PS_JOIN_ROUND 连接是圆的。参数参数 nWidth:指定画笔的宽度。对于构造函数的第一个版本来说,如果这个值是 0,则不管是什么映射方式,以设备单位计算的宽度总是一个像素。对于构造函数的第二个版本来说,如果 nPenStyle 是 PS_GEOMETRIC,则宽度以逻辑单位给出。如果 nPenStyle 是 PS_COSMETIC,则宽度必须设置为 1。参数参数 crColor:包含了画笔的 RGB 值。参 数参 数 pLogBrush:指 向 一 个 LOGBRUSH 结 构。如 果 nPenStyle 是PS_COSMETIC,则此 LOGBRUSH 结构的 lbColor 成员指定画笔的颜色,此LOGBRUSH 结构的 lbStyle 成员必须设置为 BS_SOLID。如果 nPenStyle 为PS_GEOMETRIC,则此结构的所有成员都必须用于指定画笔画刷属性。参数参数nStyleCount:指定lpStyle 数组的长度(以双字为单位)。如果nPenStyle 不是 PS_USERSTYLE,这个值必须是零。12 参数参数 lpStyle:指向一个双字值的数组。第一个值指定一个用户定义的风格中第一段虚线的长度,第二个值指定第一段空白的长度,如此等等。如果 nPenStyle不是 PS_USERSTYLE,则这个指针必须为 NULL。PS_USERSTYLE,这个值必须是零。指向一个双字值的数组。第一个值指定一个用户定义的风格中第一段虚线的长度,第二个值指定第一段空白的长度,如此等等。如果 nPenStyle 不是PS_USERSTYLE,则这个指针必须为 NULL。说明:如果你使用的是没有参数的构造函数,你就必须用 CreatePen,CreatePenIndirect 或 CreateStockObject 成员函数来初始化所生成的 CPen 对象。如果你使用的是带参数的构造函数,则不再需要进一步的初始化。如果有错误发生,则带参数的构造函数可能会出现异常,但是不带参数的构造函数则总是会成功。5.4.2 初始化初始化 CPen 对象对象 BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);BOOL CreatePen(int nPenStyle,int nWidth,const LOGBRUSH*pLogBrush,int nStyleCount=0,const DWORD*lpStyle=NULL);返回值:如果成功则返回非零值或逻辑画笔的句柄;否则返回 0。参数参数 nPenStyle:指定画笔的风格。其可能取值的列表,请参见 CPen 构造函数中的 nPenStyle 参数。参数参数 nWidth:指定画笔的宽度。?对于 CreatePen 的第一个版本来说,如果这个值为 0,则不管是什么映射模式,以设备单位表示的宽度总是一个像素。?对于 CreatePen 的第二个版本,如果 nPenStyle 是 PS_GEOMETRIC,则宽度以逻辑单位给出。如果 nPenStyle 是 PS_COSMETIC,则宽度必须设置为 1。参数参数 crColor:包含画笔的一个 R G B 颜色。说明:CreatePen 的第一个版本用指定的风格、宽度和颜色来初始化一支画笔。此画笔以后可选作为任何设备环境的当前画笔。宽度大于 1 个像素的画笔总是具有PS_NULL,PS_SOLED 或PS_INSIDEFRAME风 格。如 果 画 笔 具 有PS_INSIDEFRAME 风格和某一不匹配逻辑调色板中颜色的颜色,则此画笔用一个混合色来进行绘制。PS_SOLID 画笔风格不能用一个混合色来创建一支画笔。当画笔的宽度小于或等于 1 时,PS_INSIDEFRAME 风格等同于 PS_SOLID 风格。CreatePen 的第二个版本初始化一支具有指定的风格、宽度和刷子属性的逻辑装饰画笔或几何画笔。一支装饰画笔的宽度总是 1;几何画笔的宽度总是由世界单位指定。当应用程序创建了一支逻辑画笔之后,它可通过调用 CDC:SelectObject 函数来将此画笔选入一个设备环境中。当一支画笔被选入一个设备环境之后,它就可以用于画直线或曲线。BOOL CreatePenIndirect(LPLOGPEN lpLogPen);返回值:如果成功则返回非零值;否则返回 0。13参数参数 lpLogPen:指向 Windows LOGPEN 结构,此结构包含了此画笔的信息。说明:此函数初始化一支画笔,此画笔具有 lp L ogPen 所指向的结构中给定的风格、宽度和颜色。宽度大于 1 个像素的画笔总是具有 PS_NULL,PS_SOLID 或PS_INSIDEFRAME 风格。如果画笔具有 PS_INSIDEFRAME 风格和某种不匹配逻辑调色板中颜色的颜色,则画笔用一支混合色来绘制。如果画笔宽度小于或等于1,则 PS_INSIDEFRAME 风格等同于 PS_SOLID 风格。5.4.3 利用利用 CPen 对象绘图对象绘图 在绘制图形前,需要用 SelectObject()选定画笔,可以通过该函数的返回值对之前的画笔进行保存,如:CPen*OldPen=pDC-SelectObject(&Pen);CPen 类支持的图形绘制功能主要包括:当前位置移动到指定点 CPoint MoveTo(int x,int y);从当前点连线到指定点 BOOL LineTo(int x,int y);画弧 BOOL Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);画弧 BOOL ArcTo(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);画折线 BOOL Polyline(LPPOINT lpPoints,int nCount);画折线 BOOL PolylineTo(const POINT*lpPoints,int nCount);椭圆 BOOL Ellipse(int x1,int y1,int x2,int y2);饼图 BOOL Pie(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);矩形 BOOL Rectangle(int x1,int y1,int x2,int y2);圆角矩形 BOOL RoundRect(int x1,int y1,int x2,int y2,int x3,int y3);这些函数的具体使用方法和参数含义可以查阅相关书籍或在网上搜索,这里不再给出详细的使用方式。6 显示图片显示图片 在 VC+中,显示图片的最简单的方式是显示 BMP 位图。6.1 添加位图资源添加位图资源 在 WorkSpace 的 Resource 窗口中,点击右键,弹出“Insert Resource”对话窗口,如图 4所示:选中 Bitmap 位图资源,并通过 New 或者 Import 的方式引入位图资源。使用 New 方式时,Resource 栏中会出现 Bitmap 资源,并且自动打开位图编辑窗口。右键点击 Bitmap 资源中的位图资源,对位图重命名为 IDB_ICON。使用 Improt 方式时,通过浏览器定位到要添加的位图文件,并点击 Import 即可添加到 Resource 中。同样可以对该位图进行重命名。14 图 4 添加资源对话框 6.2 显示位图资源显示位图资源 VC+中的显示过程通常通过在 OnDraw 函数中添加相应的处理函数来实现。在 WorkSpace 的ClassView中,双击CMyAppView类下的OnDraw(CDC*pDC)函数,对该函数进行编辑。添加如下代码:void CMyAppView:OnDraw(CDC*pDC)/TODO:add draw code for native data here CBitmap bitmap;CDC dcMemory;bitmap.LoadBitmap(IDB_ICON);dcMemory.CreateCompatibleDC(pDC);dcMemory.SelectObject(&bitmap);pDC-BitBlt(100,100,50,50,&dcMemory,0,0,SRCCOPY);LoadBitmap()函数加载位图资源 IDB_ICON,BitBlt()函数在指定位置显示该位图。7 系统时间和定时器系统时间和定时器 涉及到与时间相关的编程时,经常会用到系统时间和定时器这类的资源。7.1 系统时间系统时间 在 Windows 编程中,定义时间的类是 CTime,可以通过 GetCurrentTime 函数获取系统时间,如:15 CTime time;time=CTime:GetCurrentTime();获取的时间可以通过 Format()函数转换成所需的格式,比如我们可以通过下面的方式得到当前的时间:CString strTime=time.Format(%H:%M:%S);Format()函数可以有一个或多个参数,通过%和特定的字母组合来获取相应的数据,不以%开头的字符会被直接复制到字符串中。参数格式列表如下:%a Abbreviated weekday name%A Full weekday name%b Abbreviated month name%B Full month name%c Date and time representation appropriate for locale%d Day of month as decimal number(01 31)%H Hour in 24-hour format(00 23)%I Hour in 12-hour format(01 12)%j Day of year as decimal number(001 366)%m Month as decimal number(01 12)%M