加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 vc编程讲解

vc编程讲解.pdf

vc编程讲解

草堂春梦
2010-07-20 0人阅读 举报 0 0 暂无简介

简介:本文档为《vc编程讲解pdf》,可适用于IT/计算机领域

下载用VisualC和MFC创建的应用程序大多会自动生成窗口并且可以处理消息进行绘图。Microsoft在这方面做了大量的工作隐藏了内部工作使我们能够更轻松地创建一个一般的应用程序。然而当用户不能实现他们想要实现的功能时适当地了解内部工作机制对于消除编程上的困惑会有好处。更重要的是知道怎样执行任务(诸如把窗口放置到什么地方从什么地方获得一个消息和在任意地方绘图)有助于分清用户的应用程序和由VisualC和MFC自动提供的限于窗口、消息和绘图的应用程序。VisualC应用程序有四项主要基本知识:创建一个窗口、了解其他的MFC类、把消息发送到一个窗口和在一个窗口内绘图。当然还有其他一些基本知识我们也将在涉及时适当地进行讨论。不过本部分将讨论以下四项基本知识。窗口在第章中我们首先讨论在使用和不使用MFC的情况下创建一个窗口以便清楚地了解MFC是如何工作的。MFC窗口既可以由属于MFC的C类创建也可以由一个早于并存在于MFC之外的非C窗口类创建。我们将进一步观看窗口类并讨论那些由Windows操作系统提供的窗口类。最后再看看MFC应用程序中都有什么。类在第章中我们将全面地讨论MFC提供的强大的功能。大多数MFC类是从三个MFC基类(CObject、CWnd和CCmdTarget)派生来的。并讨论构成一个应用程序的MFC类、支持窗口界面的MFC类、用来绘图的类、访问文件的类、维护数据和数据库的类和访问因特网(Internet)的MFC类。消息处理在第章中我们将讨论一个MFC应用程序是怎样通过消息与外界及应用程序进行通信的。还将讨论四种消息类型并跟踪一个消息通过接收消息的类。最后将探讨该路径上的重定向消息。绘图在第章中我们将讨论在窗口中绘图的方法包括绘图工具、绘图用的颜色、在屏幕或打印机上绘图、绘制位图和图标、绘制矩形和圆、绘制动画。第一部分基础知识下载第章窗口在本章中我们将讨论MFC用户界面的基本要素:窗口。在此基础上比较API窗口和MFC窗口的异同描述如何创建一个窗口、销毁一个窗口和控制Windows操作系统与窗口的通信问题。窗口和API环境窗口是屏幕上的一个矩形区域应用程序在该区域中显示数据并等待鼠标点击。Windows应用系统的用户界面可以包含许多窗口每个窗口都有不同的特点但都是互相联系的如图所示。图Windows应用程序用户界面包括的窗口三种类型窗口在这么多窗口中基本类型只有三种:重叠(Overlapped)窗口弹出(Popup)窗口和子窗口(Child)。在它们之间并没有太多内在的差异但是使用不同的窗口风格它们的外观是不同的(见图)。重叠窗口通常用于建立应用程序主窗口。事实上有时也叫做“主”窗口或者“框架”窗口。弹出窗口通常以对话框和消息框的形式与用户对话。子窗口通常用在视图(View)中如在文本编辑器中的文本显示也用在控件中如在对话框中的OK按钮。而对那些看起来像按钮或控件的子窗口也称为“控件”窗口。重叠窗口和弹出窗口的主要区别是弹出窗口出现时可以没有标题(也称为标题栏)。子窗口与重叠窗口或弹出窗口的主要区别是子窗口只能出现在另一个窗口中并且子窗口的任何多余部分都被该窗口移去或剪切掉。另外子窗口是唯一不能有菜单条的窗口。参见图中的Windows应用程序其中包括重叠窗口、弹出窗口和子窗口。应用程序的主窗口窗口窗口窗口窗口图窗口风格可以用来区分三种不同类型的窗口图由重叠窗口、弹出窗口和子窗口组成的窗口应用程序客户区和非客户区每个窗口都有由系统绘制的“非客户区”和由应用程序绘制的“客户区”。系统可以绘制图显示的其中一个或者全部特征当然也可以把所有的特征留给你去绘制。图窗口的非客户区可以由系统选择绘制每个窗口代表内存中的一个窗口对象并由该窗口对象告诉Windows操作系统将窗口绘制在何处以及在对鼠标单击、键盘按下(假设该窗口拥有输入焦点)和时钟终止等事件作出响第章窗口下载重叠窗口弹出窗口子窗口注意:在它的最基本的窗体中系统不进行任何绘制。窗口都是客户区注意:在它的最基本的窗体中系统不进行任何绘制。窗口都是客户区注意:这都是客户区。子窗口通常自己进行绘制最基本的窗体典型的外观共同的设置注意:子窗口不能有子菜单不是一个窗口显示在子窗口中并由子窗口绘制属于桌面的重叠窗口也称为主窗口属于弹出窗口的子窗口它位于弹出窗口之中属于主窗口的子窗口属于主窗口的弹出窗口水平滚动条垂直滚动条关闭按钮最大化按钮最小化按钮任务栏应用程序图标菜单条系统菜单(单击应用程序图标时显示虚线框)客户区应时应调用什么应用程序。窗口对象自身是窗口类的一个实例它不是VisualC的类而是存在于VisualC之外并早于VisualC的MicrosoftWindows所属的类。然而就像C的类一样窗口类为每个基于它创建的窗口定义了若干特征如背景色和往何处发送消息等(见图)。图MicrosoftWindows所属的窗口类创建的窗口对象Windows操作系统提供了一个扩展的应用程序接口(API)可以用来创建和维护这些窗口对象。调用CreateWindow()函数可以创建一个窗口对象调用SetWindowLong()函数可以改变由窗口类定义的特征调用MoveWindow()函数可以移动窗口调用DestroyWindow()可以退出窗口。如此说来MFC又能做些什么呢?窗口和MFC环境MFC窗口是C和WindowsAPI调用的综合。事实上MFC窗口提供了许多(但不是全部)WindowsAPI的C封装从而减轻了编写Windows应用程序时一些乏味的工作并提供了一些新的服务。MFC窗口不对窗口对象进行直接控制而在API环境中却是可以的。如果不能在API环境中实现某项功能那么肯定也不能在MFC环境中实现。举例来说MFC库的CWnd可以创建一个窗口但它只是过去在API环境中使用的API调用的封装。微软已经把在MFC库中创建和维护一个窗口的逻辑作为真正的C封装和控制。然而这种方法虽使得MFC库万能但却是不方便的并导致了严重的冗余和更多的错误。创建MFC窗口是复杂的首先创建类CWnd的一个实例然后调用类CWnd的一个成员函数该成员函数调用API中的CreatWindow()函数。返回的窗口句柄(这只是指向窗口对象的非直接指针)保存在类CWnd的成员变量mhWnd中。注意因为窗口在内存中创建而内存经常发生变化窗口地址可能是经常变化的。因此窗口句柄并非直接指向窗口对象而是指向跟踪窗口对象地址的另一个指针。销毁窗口同样也是复杂的必须确保销毁了该窗口对象以及封装该窗口对象的CWnd实例。虽然CWnd对象知道窗口对象但是窗口对象并不知道CWnd对象(见图)。第一部分基础知识下载①使用RegisterClass()函数创建窗口类②窗口对象由CreateWindow()函数创建作为它的变量传输窗口类③窗口管理器保持一个窗口对象列表并告诉每个对象在屏幕上绘制自己窗口窗口对象窗口类图应用两个对象创建MFC窗口尽管窗口应用程序的用户界面可以由几十个、甚至几百个窗口构成但是大多数窗口还是由不到十个的窗口类创建的。即使在应用程序中有一千个窗口每个窗口也只能是三种基本类型之一:重叠窗口、弹出窗口或子窗口。怎样应用MFC创建一个窗口可以用MFC的CWnd类创建一个窗口:CWndwndBOOLb=wndCreateEx(ExStyle,ClassName,WindowName,Style,x,y,Width,Height,Parent,Menu,Param)第一行代码创建了一个CWnd类的对象第二行通过调用WindowsAPI函数CreateWindowEx()创建了真正的窗口。HWNDhwnd=::CreateWindowEx(ExStyle,ClassName,WindowName,Style,x,y,Width,Height,Parent,Menu,Instance,Param)因为CWnd类只是封装了用于创建窗口的WindowsAPI函数(CreateWindowEx())因此从本质上讲创建窗口所必须的参数在API环境和MFC环境中是相同的:■参数Style和ExStyle决定窗口的“外观”和类型(重叠、弹出、子窗口)。■参数ClassName决定在创建窗口时使用的窗口类。■参数WindowName决定窗口标题内容(如果窗口标题有内容)。■参数x,y,Width和Height决定窗口的位置和大小。■参数Parent指向拥有该窗口的窗口指针(如果有这样的窗口)。■参数Menu指向内存中的一个对象作为它的菜单使用除非创建一个子窗口如果是这样的话那么该参数是帮助父窗口识别子窗口的IDnumber。■参数Instance识别该窗口属于哪个应用程序以便发送到该窗口的消息能被发送到正确的应用程序的消息队列中。CWnd类填入Instance参数。■参数Param是在创建窗口时由窗口类使用的指针该指针是指向附加信息的非强制性结构的指针。返回的hwnd参数是指向创建的窗口对象的指针但在未创建任何窗口时该参数返回值为NULL。窗口句柄自动地保存在CWnd类的mhWnd成员变量中这在前面的图中可以看到。第章窗口下载窗口类③调用CWnd的成员函数Create()该函数自身调用图中看到的::CreateWindow()函数④::CreateWindow再次创建窗口窗口句柄保存到CWnd中⑤窗口管理器告知每个窗口对象在屏幕上绘制自己②然后在堆栈上或堆中创建一个CWnd类对象①首先用AfxRegisterClass()函数创建一个窗口类窗口窗口对象CWnd类对象现在既然已了解了有关创建窗口的基本知识那么让我们进一步来看看填写这些参数的规则。规则窗口名称参数该参数是一个零结尾的文本串用该串指明在窗口标题栏中显示的内容。如果窗口没有标题栏该参数可以为零()。然而某些通用控件也使用该参数。例如按钮控件把该参数的内容放在按钮的表面。在创建窗口标题栏后可以用类CWnd的成员函数SetWindowText()来改变窗口标题栏的名称。风格和扩展风格参数这两个是位的参数用来指定创建什么类型的窗口。可以选择多种类型如下面的例子所示:,WSCHILD|WSVISIBLE,窗口风格参数的作用包括:■用于创建三种基本窗口类型的风格用WMCHILD创建一个子窗口用WMPOPUP创建一个弹出窗口。■WMOVERLAPPED创建一个重叠窗口。如果不为窗口指定任何一种风格那么窗口风格默认为WMOVERLAPPED。■用以增添窗口的非客户区特色的风格。例如可以用WSVSCROLL为窗口添加一个垂直滚动条如图所示其他非客户区窗口风格。图非客户窗口风格用来增添窗口的特色■由每个通用控件定义的风格。例如BSFLAT按钮风格告诉按钮控件绘制一个二维按钮。■用来使窗口可视、可操作和或初始最大化的风格。■用来标识控件组起始控件的风格或者当用户敲击Tab键控制焦点在窗口中变化时用来指示哪个控件有资格获得输入焦点的风格。■想了解更多的有关窗口风格的例子请参阅附录A。在创建窗口以后可以用CWnd的成员函数ModifyStyle()和ModifyStyleEx()改变窗口风格。某些风格可能要求重画窗口这时可以给ModifyStyle()函数添加第三个参数自动激发类CWnd的成员函数SetWindowPos()做重画窗口工作。第一部分基础知识下载如果选取了最小化或最大化按钮则关闭按钮出现若在CreateWindow()中定义了菜单条则菜单条出现它不是一个子窗口(使窗口可视)(禁止窗口输入)CWndwndwndModifyStyle(,WSBORDER,SWPNOZORDER)事实上给ModifyStyle()或ModifyStyleEx()添加任何第三个参数都需要添加下面的SetWindowPos()选项:SWPNOZORDER、SWPNOMOVE、SWPNOACTIVATE和SWPSHOW。注意有时候甚至一个重画的窗口可能与新风格不相容尤其对通用控件窗口来说更是这样。因为单个窗口决定重画窗口时使用什么风格。在这种情况下唯一的办法是:在事先存储已有窗口的风格和其他参数后销毁和重建该窗口。X和Y位置参数这是两个位的参数用于以像素为单位指定窗口的位置。创建重叠窗口和弹出窗口时X和Y是相对于桌面窗口左上角的位置。而创建子窗口时X和Y是相对于父窗口客户区的左上角位置。如果把X和Y参数都设置为CWUSEDEFAULT那么系统将自动为窗口选定一个位置。系统层叠排列这些新窗口(见图)。图CWUSEDEFAULT允许系统自动设定窗口位置然而如果X和Y参数都设置为CWUSEDEFAULT那么子窗口在创建的时候总被创建在(,)的位置。创建窗口以后可以用类CWnd的成员函数MoveWindow()移动窗口。宽度和高度参数这是两个位的参数用于以像素为单位指定窗口的大小。如果将参数Width和Height都设置为CWUSEDEFAULT则系统将根据桌面窗口的大小自动选定窗口的大小。然而对于一个子窗口来说系统将创建一个长和宽均为的窗口。如果窗口的风格是WSMINIMIZE或WSMAXIMIZE那么系统将忽视用户为Width和Height设置的任何值。创建窗口以后可以用类CWnd的成员函数MoveWindow()重新设置窗口的大小。ZOrder当几个窗口占据屏幕上同一区域时ZOrder决定哪个窗口显示在哪个窗口之上。ZOrder(Z顺序)中的Z来源于坐标XYZ轴的Z轴其中Z轴垂直屏幕并由屏幕指向外面。当窗口最初被创建或选中时则窗口将出现在ZOrder的顶层。然而该窗口永远不可能出现在一个最顶层窗口的上面除非该窗口也是最顶层的窗口。“最顶层”窗口用WSEXTOPMOST窗口风格创建并显示在所有非最顶层窗口的上面而与该窗口是不是当前选中的窗口无关。创建窗口后可以用CWnd的成员函数SetWindowPos()改变窗口的Z顺序。父窗口或物主窗口参数该参数是指向类CWnd对象的指针根据创建的窗口类型标识是父窗口还是物主窗口第章窗口下载第一窗口下一个窗口第三个窗口(Owner):■如果创建的是一个子窗口那么用该参数来标识它的父窗口(该子窗口所放置的并为之所截断的窗口)。该值不能为NULL。子窗口只能出现在它的父窗口里面当父窗口被销毁时它们也被销毁并且当父窗口被隐藏或最小化时它们也被隐藏。■如果创建的是重叠窗口或弹出窗口用该参数来标识物主窗口。如果该值为NULL则桌面窗口成为物主窗口。从属窗口总是显示在它们的主窗口上面并且随着物主窗口的销毁而被销毁物主窗口最小化时则从属窗口被隐藏但当物主窗口被隐藏时从属窗口并不被隐藏。一个子窗口可能是另一个子窗口的父窗口但绝不可能是一个物主窗口。如果试图使一个子窗口成为一个物主窗口那么系统只能使那个子窗口的最顶层窗口作为物主窗口。图是这些关系的概述。图物主、父、子窗口的层次关系可以用CWnd的成员函数SetOwner()改变已有窗口的物主窗口用CWnd的成员函数SetParent()改变父窗口。菜单或控件ID参数该参数用来标识菜单(Menu)句柄或控件(Control)ID这要依赖于创建的窗口是子窗口、重叠窗口还是弹出窗口。■如果创建的是一个子窗口用该参数标识控件ID控件ID通常用来帮助父窗口识别子窗口。因为该参数寻求一个HMENU变量因此需要用HMENU类型重载变量定义控件ID。例如如果子窗口的控件ID是应该用如下方法定义它:⋯,(HMENU)⋯■如果创建的是一个重叠窗口或弹出窗口用该参数定义窗口的菜单。若该值为NULL则菜单默认为在该窗口的窗口类中定义的任何菜单如果窗口类也没有指定的菜单则该窗口在创建时没有菜单。可以用下面的方法为该参数加载一个菜单:HMENUhMenu=::LoadMenu(AfxGetInstanceHandle(),MAKEINTRESOURCE(xx))第一部分基础知识下载②子窗口对象被创建并显示在父窗口中①重叠或弹出窗口对象被创建并显示在屏幕上③弹出或重叠窗口对象被创建并显示在父窗口中这里的xx是应用程序资源里面的菜单ID(MenuID)。可以用CWnd的SetDlgCtrlID()改变已有子窗口的ID。用类CWnd的成员函数SetMenu()改变一个重叠窗口或弹出窗口的菜单。实例前面已提到CWnd类将填入该参数。CWnd通过调用AfxGetInstanceHandle()获得该实例(Instance)。一个应用程序的实例从本质上标识了哪个程序在内存里。AfxGetInstanceHandle()是由MFC库提供的静态函数。参数该位参数(Parameter)是可选的。它通常是指向一个结构或者类对象的指针而该结构或者类对象是创建某种类型的窗口时需要提供的。例如当用MDICLIENT窗口类创建窗口时需要该参数提供一个CLIENTCREATESTRUCT结构的指针。类名参数类名(ClassName)参数是一个零结尾字符串当创建一个窗口时用来标识使用那个窗口类。关于窗口类和窗口处理将在本章后面的内容中详细讨论。该参数不能为NULL在创建一个非常一般的MFC窗口时使用AfxRegisterWndClass()填入该参数。怎样使用MFC销毁一个窗口如前面所提到的一样删除一个MFC窗口可能有些烦琐必须按下面的顺序删除两个对象:pWnd>DestroyWindow()destroysWindowObjectdeletepWnddestroysCwndObject也可以只删除CWnd对象因为DestroyWindow()是从CWnd的析构函数中调用的但不提倡使用这种方法。销毁一个窗口而不先调用DestroyWindow()函数将使某些析构消息不能被任何从CWnd派生的类处理。你几乎不需自己销毁一个窗口用户或系统通常会做这项工作。如果需要在销毁窗口的同时销毁CWnd对象则应该在CWnd的派生类中添加下面的重载函数:CYourWnd::PostNcDestroy(){deletethis}PostNcDestroy()是销毁窗口前调用的最后一个成员函数。但是几乎不需对该函数进行重载因为CWnd和派生类一般是嵌在另一个类中或建立在堆栈中的。捆绑到一个已有的窗口如果一个窗口是用WindowsAPI在应用程序建立之前或外面创建的并且需要把它封装到CWnd类中可以用下面的语句实现:CWndwndwndAttach(hwnd)这里的hwnd是已有窗口的句柄。Attach()只是把CWnd的成员变量mhWnd赋给hwnd。也可以使用CWnd::FromHandle(hwnd)它查看是否有CWnd对象已经封装了该窗口句柄并返回该CWnd对象的指针。如果不存在这样的CWnd对象将创建一个临时对象。如果是临第章窗口下载时对象则不要使用该指针因为在应用程序空闲的时候该指针指向的对象将被删除。窗口类前面已提及一个窗口类不是一个C类而是早于并存在于C之外的窗口专有的类。窗口类的作用就像一个模板可以由此创建其他窗口并可共享某些特征包括下面所示的特征:类风格包括能给予窗口的一些微小的特征。类图标如果窗口有图标用它来指定在窗口的左上角处所画的图标。类菜单如果窗口有菜单用它来指定窗口中显示的菜单。类光标当光标通过窗口的客户区时用它来指定显示哪种鼠标形状。背景色定义用什么颜色来擦除窗口的背景色。窗口的客户区将显示该颜色。窗口进程定义处理任何发送到该窗口的消息时应该调用的函数。定义窗口进程可能是窗口类唯一最重要的前提。窗口进程窗口与环境的交互是通过发送和接收消息来实现的。如果系统要求窗口自己进行绘制系统给它发送一个WMPAINT消息如果系统要求窗口销毁自己则发送一个WMDESTROY消息。这些消息都由窗口的窗口进程处理该窗口进程的地址在窗口类中定义。对于发送到由相同的窗口类创建的窗口的消息系统采用完全相同的窗口进程进行处理。相同的窗口进程是怎样跟踪所有的窗口的呢?它是怎么知道窗口A画在(,)而窗口B画在(,)呢?所有这些工作的完成只需使用窗口的窗口对象。例如所有用按钮窗口类创建的窗口都使用相同的按钮窗口进程。如果一个WMPAINT消息发送到其中任何一个窗口则按钮窗口进程根据每个窗口的窗口对象指定的大小、位置和风格画出确切的按钮(见图)。图按钮窗口进程使用窗口对象指定对哪个窗口进行操纵第一部分基础知识下载⑤窗口进程也搜索窗口对象以查明在哪里绘制这些控件窗口④如果风格是“PushButton”,则窗口进程绘制一个按钮②通过发送一个WMPAINT消息到窗口进程窗口管理器告诉每个窗口绘制自己①用“BUTTON”窗口类创建的窗口③“BUTTON”的窗口进程搜索窗口对象以查明绘制什么类型的按钮如果风格是“CheckBox”则绘制一个复选框父窗口窗口对象怎样使用MFC创建一个窗口类当用户创建一个窗口类时实际上只是在三个操作系统列表之一中注册一个WNDCLASS结构。系统为每个窗口类类型维护一个列表:系统全局类(SystemGlobalClass)在系统启动时注册且必须注册对所有应用程序都有效。应用程序全局类(ApplicationGlobalClass)由应用程序注册只对应用程序及应用程序的线程有效。应用程序局部类(ApplicationLocalClass)由应用程序注册并只对注册它们的应用程序或DLL有效。当系统搜索一个窗口类时从应用程序局部类开始然后搜索应用程序全局类最后搜索系统全局类。要创建一个窗口类可以先创建WNDCLASS结构的实例然后用MFC类库的AfxRegisterClass()注册它。也可以用MFC类库的AfxRegisterWndClass()来创建一个基于调用参数的WNDCLASS对象。使用AfxRegisterWndClass()函数注册一个窗口类AfxRegisterWndClass()函数在使用上是非常自动化的一些通常需要你提供的参数都能自己填入甚至连新的窗口类的名字也能自动产生。LPCTSTRlpszClassName=AfxRegisterWndClass(UINTnClassStyle,HCURSORhCursor=,HBRUSHhbrBackground=,HICONhIcon=)这些参数的使用规则如下:类名根据传给该函数的参数为新的窗口类产生名字。如果传输的参数完全相同那么创建的窗口类也将完全相同。如果需要创建新的窗口类可以用AfxRegisterClass()。风格窗口类风格由下面选项列表中一系列标记的或(OR)运算提供:类风格描述CSOWNDC为为该窗口类创建的每个窗口分配唯一的设备环境。有关设备环境的更详尽资料见第章CSPARENTDC为从系统高速缓存中检索设备环境然后设置该设备环境的剪裁区以组合到父窗口中以便子窗口能画在父窗口上CSCLASSDC为分配一个设备环境给所有由该窗口类创建的窗口使用CSSAVEBITS为由该类创建的任何窗口的视频存储区将被保存以便窗口移动或关闭时不需要重画基础窗口这对快速机器来说作用不大CSBYTEALIGNCLIENT为当计算机的显示卡和CPU速度较慢时这两种风格有用。添加这些风格后当CSBYTEALIGNWINDOW窗口在字节边缘时显示卡更容易移动窗口CSGLOBALCLASS为如果设置该风格则该类是应用程序的全局类否则它是一个应用程序局部类CSVREDRAW为如果设置了垂直风格并且窗口的垂直大小发生了变化则整个窗口被重画。CSHREDRAW水平风格也这样CSNOCLOSE为禁用系统菜单中的关闭命令CSDBLCLKS为如果未设置该参数并且双击由该窗口类创建的窗口则传送给应用程序的将不是双击事件而是两个相继完成的单击事件第章窗口下载图标(Icon)该参数是显示在窗口左上角的图标的句柄但只适用于使用WSSYSMENU的窗口风格。应用程序主窗口的图标也显示在任务栏上。如果将该参数设置为NULL并且设置了WSSYSMENU风格则系统将提供一个默认的图标。在MFC环境中绝大部分图标已被处理过用CWnd的SetIcon()可改变已有的图标。光标(Cursor)该参数是鼠标移经应用程序窗口的客户区时将要显示的鼠标光标句柄。如果将该参数设置为NULL则显示的是箭头光标。可以用下面的语句装载一个光标:HICONhIcon=AfxGetApp()>LoadCursor(xx)这里的xx是应用程序资源中光标的名字或ID。这里指定的光标意味着是该窗口的默认光标。如果想动态地改变光标形状则应该处理该窗口的WMSETCURSOR消息并用SetCursor()来改变光标形状(见第章例)。背景色当系统创建窗口时先在显示窗口的地方画一个矩形区域以擦除该区域的背景色。该参数指定填充该矩形域时所用画刷的句柄(参见第章有关画刷的详细内容)。为窗口类创建的画刷对象在该类退出注册时被自动释放。在指定背景色时也可以不创建画刷对象而指定下面所列系统颜色之一:COLORACTIVEBORDERCOLORACTIVECAPTIONCOLORAPPWORKSPACECOLORBACKGROUNDCOLORBTNFACECOLORBTNSHADOWCOLORBTNTEXTCOLORCAPTIONTEXTCOLORGRAYTEXTCOLORHIGHLIGHTCOLORHIGHLIGHTTEXTCOLORINACTIVEBORDERCOLORINACTIVECAPTIONCOLORMENUCOLORMENUTEXTCOLORSCROLLBARCOLORWINDOWCOLORWINDOWFRAMECOLORWINDOWTEXT然而必须分配颜色到一个画刷句柄类型并加。(HBRUSH)(COLORWINDOW)设置该参数为NULL则在画一个窗口之前系统不对窗口进行擦除。在非客户区的绘制还是同平常一样但客户区将保持窗口被画前原来屏幕所显示的样子。若该参数设为NULL应确认窗口是画全部客户区还是处理WMERASEBRGND消息以擦除背景颜色。使用AfxRegisterClass()函数创建一个窗口类如果想完全控制一个新窗口类的创建如指定窗口类的名字则应该用下面的语句:第一部分基础知识下载BOOLAFXAPIAfxRegisterClass(WNDCLASS•lpWndClass)这里的WNDCLASS结构定义如下:typedefstructWNDCLASS{UINTstylestyleoftheclassWNDPROClpfnWndProcfunctioncalledbysystemwhenithasamessageforawindowcreatedwiththisclassintcbClsExtraextrabytestoaddtotheWNDCLASSstructurewhenregisteringintcbWndExtraextrabytestoaddtotheWindowObjectscreatedwiththisclassHANDLEhInstanceinstancethatownsthisclassHICONhIconicontobeusedwhenwindowdisplaysaniconHCURSORhCursorcursortousewhenmouseisoverawindowcreatedwiththisclassHBRUSHhbrBackgroundbackgroundcolortousewhenerasingthebackgroundareaunderawindowcreatedwiththisclassLPCTSTRlpszMenuNamemenunametobeusedwhencreatingamenuforawindowcreatedwiththisclassLPCTSTRlpszClassNametheclassnamethatidentifiesthisWNDCLASSforthesystem}WNDCLASS有关填入类的“风格”、“图标”、“光标”和“背景色”参数的规则参看前面部分的介绍其余参数的填入规则如下:类名类名参数是用来标识新窗口类的零结尾字符串。可以任意命名窗口类但是不要与已有的窗口类同名除非想使该类无效。正如前面所提及的系统从应用程序局部类开始在三个列表中寻找类名匹配如果在该列表中记录了一个与系统全局类同名的类则应用程序将使用新记录的类。菜单名该参数指向应用程序资源中的菜单名。在MFC环境中大多数情况下由系统载入菜单但可以在此处指定菜单名。如果使用资源ID也可以采用下面语句:MAKEINTRESOURCE(IDRMENU)这将成为该窗口的默认菜单。若指定该值为NULL系统将使用在类CWnd的CreateEx()中定义的菜单若在此处没有指定的菜单该窗口将没有菜单。该参数对子窗口可以忽略因为它们从来没有菜单。窗口进程和实例这两个参数是窗口类中最重要的参数。有关窗口进程在前面已经讨论过了而实例只是第章窗口下载用以标识哪个应用程序包含了该窗口进程。在MFC环境中默认的窗口进程为AfxWndProc()可以使用下面语句返回该进程并为该参数使用。AfxGetAfxWndProc()可以用AfxGetInstanceHandle()填入Instance参数。ClassExtra和WindowExtra参数ClassExtra和WindowExtra参数提供了一种存储数据的方法允许应用程序自身将所属的数据存储到窗口对象或注册的窗口类中。注册类时ClassExtra指定在类的末尾分配的额外字节数创建窗口对象时WindowExtra指定添加到该窗口对象尾部的额外字节数。在这两种情况下这些额外字节都被应用程序用来存储属于窗口或窗口类的消息。然而由于CWnd对象与一个窗口关联并且一个CWnd对象可以存储的信息量若不比额外字节多的话起码也与之相等因此这些额外字节参数实际上并没有多大用处可以把它们设为。怎样销毁一个MFC窗口类通过取消窗口类的注册销毁窗口类。但是如果用AfxRegisterWnd()或AfxRegisterWndClass()注册一个类的话那么在应用程序结束的时候类的注册会自动取消即使应用程序不取消窗口类的注册操作系统也会取消。厂商安装的窗口类应用程序可能运行在一个已注册若干个窗口类的环境中。其中的一些是由操作系统(WindowsNT)提供的另一些是由MFC提供的。由系统提供的控件窗口也叫做通用控件。一些重要的窗口类Windows及以上版本:类创建的窗口类创建的窗口#弹出式菜单窗口(弹出式菜#对话框单是位于弹出窗口中并完全填充弹出窗口的菜单)#桌面窗口MDIClientMDI子窗口区域一些重要的通用控件窗口类Windows及以上版本:类创建的窗口类创建的窗口BUTTON按钮控件窗口SCROLLBAR滚滚动条控件窗口STATIC静态控件窗口COMBOBOX滚组合框控件窗口EDIT编辑控件窗口ComboLBox滚列表框控件窗口(显示在组LISTBOX列表框控件窗口合框控件窗口之下的列表框)一些重要的通用控件窗口类WindowsNT及以上版本:第一部分基础知识下载类创建的窗口类创建的窗口RICHEDIT滚多信息编辑控件窗口SysTabControl选项卡控件窗口SysListView滚列表视图控件窗口SysMonthCal月历控件窗口ComboBoxEx滚扩展组合框控件窗口SysDateTimePick日期时间选项控件窗口SysAnimate滚动画控件窗口msctlshotkey热键控件窗口msctlstrackbar滚幻灯片控件窗口tooltipsclass工具提示控件窗口SysTreeView滚树型视图控件窗口msctlsstatusbar状态栏窗口msctlsupdown滚微调按钮控件窗口toolbarWindow工具栏窗口msctlsprogress滚进度指示控件窗口ReBarWindowRebar窗口SysHeader滚标题控件窗口(标题控件通常驻留在列表视图控件的顶部)一些重要的MFC窗口类类创建的窗口类创建的窗口AfxWndCWnd窗口AfxMDIFrameMDI框架窗口AfxFrameOrViewMFC框架和视窗AfxControlBarMFC控制条窗口其他类型窗口窗口有三种基本的类型重叠窗口、弹出窗口和子窗口。但在一个MFC应用程序中可以用不同的方法使用它们。除非特别提到封装这些窗口的类都从CWnd类派生。下面列出的是从使用角度分类的窗口类型:控件窗口完全把自己画得像个控件的子窗口。例如按钮、静态文本控件和列表框等。对话框一个弹出窗口使用资源文件中指定的控件填充自己并对控件作出处理。消息框应用程序用来提示用户作出反应的弹出窗口。工具栏绘制自身按钮的子窗口。对话条保持打开状态作为工具栏的对话框。状态栏一个子窗口通常位于应用程序主窗口的底部并用来显示正在使用的命令的帮助信息。框架窗口一个重叠窗口通常在应用程序中作为所有其他窗口的父窗口和物主窗口。框架窗口也可以通过应用程序对象监督用户命令这一问题将在下一章中进行详细讨论。文档视图实际上是由两个MFC类对象和一个子窗口构成的。MFC应用程序是以“文档为中心的”这意味着应用程序负责装载、查看、编辑和存储文档而不管这些文档是文本文件、图形文件还是二进制结构文件。首先创建MFC文档类对象从磁盘中读入一个文档赋予其成员变量然后创建一个或多个视图类对象以显示这些成员变量。如果创建了多个视图类对象则一个文档将有多个视图。由于MFC文档类没有关联窗口因而它不是从CWnd类派生的。文档模板实际上没有窗口而是在打开一个文档时应用程序用来确定创建什么样的MFC文档类对象和MFC视图对象。理论上讲一个应用程序可以有多个文档模板并允许一个应用程序处理多种类型的文档然而绝大多数应用程序只有一个模板。MFC文档模板不第章窗口下载是从CWnd类派生的。想更多地了解有关文档模板的内容请参看第章。桌面窗口本章中最后一个问题是桌面窗口(DesktopWindow)所有其他窗口都显示在它的上面并最终属于它。桌面窗口自身是一个弹出窗口并且是最高阶弹出窗口。最高阶窗口列表是由窗口管理器维护的因此也叫做窗口管理器列表(WindowsManagerList)。窗口管理器应用该列表维护桌面窗口如图所示:图窗口管理器通过使用窗口管理器列表维护桌面窗口桌面窗口的其他相关信息如下:■桌面窗口由#窗口类所建(不是数字“”而是字符串#)。■若要获得桌面窗口的句柄可以用::GetDesktopWindow()。■可以用带SPISETDESKWALLPAPER参数的SystemParametersInfo()在桌面上设置一幅背景图像。■ShellNotifyIcon()将图标放置到外壳盘(ShellTray)里以后在任务栏里发现的小图标集。■可以用::FindWindow()搜索桌面上的窗口。■可以用WindowFromPoint()找到当前窗口在桌面上的点坐标。■可以用::GetSystemMetrics(SMCXSCREEN)和::GetSystemMetrics(SMCYSCREEN)获得屏幕尺寸。小结在本章中我们讨论了如下内容:■使用MFC类和Microsoft的特征窗口类(不是C类)创建用户界面窗口的MFC应用程序方法。第一部分基础知识下载④告诉任何一个子窗口的子窗口以此类推子窗口对象列表子窗口对象列表框架窗口对象系统盘窗口对象程序管理器窗口对象桌面窗口对象窗口管理器列表②然后窗口管理器遍览该列表通知每个窗口进程重新绘制自己③窗口管理器也告知一个窗口的每个子窗口重新绘制自己①如果屏幕需要刷新则窗口管理器从桌面窗口获得所有最顶层窗口的列表。该列表是桌面窗口的子窗口列表也称为窗口管理器列表■用MFC创建和销毁窗口和窗口类的步骤。■系统提供的窗口类。■三种类型的窗口重叠窗口、弹出窗口和子窗口并介绍了在应用程序中创建关于它们的各种各样的窗口。■桌面窗口及其相关的几种主要功能。在下一章中我们将讨论MFC提供的类。第章窗口下载下载下载第章类到目前为止我们只讨论了MFC的CWnd类。在本章中我们将讨论MFC提供的其他重要的类这些类可以分成以下几种:■访问用户界面的类包括CWnd。■帮助绘图的类。■提供运行一个应用程序所需功能的类。■处理数组和数据列表的类。■访问数据库的类。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/49

vc编程讲解

仅供在线阅读

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利