欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    MFC编程案例chapter004.pdf

    • 资源ID:70323162       资源大小:4.03MB        全文页数:24页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    MFC编程案例chapter004.pdf

    下载第4章 绘图在前面几章中,Wi n d o w s为我们做了所有的绘图工作从绘制一个窗口的非客户区到绘制通用控件。本章将讨论怎样用M F C的C D C类绘制控件和视图,我们将讨论:Wi n d o w s和M F C支持的绘图工具类型。Wi n d o w s和M F C支持的绘图模式和特性。两种存储为将来显示用的绘图命令的方法:元文件(M e t a f i l e)和路径(P a t h)。怎样在抖动色(dithered color)和未经抖动色(nondithered color)中绘图。什么时候Wi n d o w s绘制它的窗口。4.1 设备环境若自己编写一个函数在屏幕上画一条直线,将需要以下类型的调用变量:直线坐标(起点x,y,终点x,y)。线条颜色。线条粗细。若要使功能更复杂些,还必须添加:在(像素、英寸或厘米)中指定进行绘图的度量单位的能力。在打印机或一个图形文件中绘制直线的能力。为了方便,还希望将直线绘制在任何显示器或者任何打印机上,而不必考虑显示卡或打印机的类型。如果考虑所有这些属性,该函数的结构如下:DrawLine(x1,y1,x2,y2,color,width,device,limits,units)虽然相当直观,但该函数有一个隐含的费用每当画一条直线,所有这些参数将必须压入堆栈中。同时,该函数也没有保留扩展功能的余地。要添加变量,将必须对旧函数编辑任何引用。因此,怎样才能减少需要的调用变量的数目并预留扩展空间呢?一种方法是写一个包含函数所需的大多数变量的 C+类,并将该类作为一个变量进行传输。甚至可以使该类用一些合法的默认值构造自己,以便在特殊场合中使用。Wi n d o w s使用一个称为设备环境(D e v i c e Co n t e x t)的对象的方法但该对象的创建没有一个C+类,因为Wi n d o w s早于并存在于C+之外。设备环境对象用一些默认值创建,可以用它们创建默认的设备环境。应用 Wi n d o w s绘制一直线,所需的是一个设备环境对象的指针和直线坐标,设备环境对象的指针叫做设备环境句柄(H D C)。:M o v e To(HDC hdc,int x,int y);:L i n e To(HDC hdc,int x,int y);要绘制一个完整的形状,:M o v e To()函数只被调用一次。然后,:L i n e To()函数被调用,没有一个多余的变量被压进堆栈(见图 4-1)。图4-1 设备环境减少调用变量的数目并预留扩展空间注意 因为设备环境在内存中创建,而内存经常受到扰动,它的地址可能是经常变化的。因此,一个设备环境句柄不是直接指向设备环境对象,而是指向另外一个跟踪设备环境地址的指针。设备无关设备环境是设备无关的,它允许你编写软件而不必指定一个设备。这些软件必须知道的是:它是编写一个设备环境的,而不管该设备环境是屏幕还是 E p s o n打印机。之后,设备环境可以被分配给一个打印机、屏幕、位图或一个文件。4.2 在MFC环境中创建一个设备环境M F C用C D C类封装了一个设备环境对象,C D C的成员变量m _ h d c指向它所拥有的设备环境,用户可以创建四种类型的设备环境:屏幕。打印机。只有打印机的信息部分。位图。4.2.1 屏幕创建一个屏幕设备环境,可以用:CDC*pDC=GetDC();这里的GetDC()是C W n d类的成员函数,它返回一个允许用户绘制它的窗口客户区的设备环境;如果还希望绘制非客户区,则使用:CDC *pDC=GetWindowDC();如果需要绘制整个屏幕,如编写一个屏幕保护程序或游戏程序时,可能需要对整屏进行绘制,这时使用:52第一部分 基 础 知 识下载使用设备环境以后使用设备环境以前设备环境CDC *pDC=CDC:FromHandle(:GetDC(NULL);屏幕设备环境来自三种资源之一:私有设备环境、类设备环境和通用设备环境。1.私有设备环境创建窗口时,私有设备环境便创建了,并在窗口存在期间一直存在。要使窗口创建一个私有设备环境,必须在目标窗口的窗口类中设置 C S _ O W N D C标志,这时GetDC()返回一个私有设备环境的指针,而不创建一个设备环境。在窗口存在期间,为私有设备环境所作的任何变化都被保存。私有设备环境主要在以图形为中心的应用程序中使用,在那里经常地分配一个设备环境,这样会占用非常多的 C P U时间。2.类设备环境类设备环境在注册一个窗口类时创建,并在窗口类的存在期间一直存在。要使窗口类创建它自己的类设备环境,必须设置 C S _ C L A S S D C标志,GetDC()只返回指向该类设备环境的指针。此外,在窗口类的存在期间,设备环境一直保留它的值。然而,在第 1章中已提及,必须注意不要让两个由相同的窗口类创建的窗口在同一时间绘图;还应注意 M i c r o s o f t认为一个类设备环境是旧用法。3.通用设备环境在一个通用资源堆中使用 GetDC()时,一个通用设备环境便创建了。要获得一个通用设备环境,不要在窗口类中设置C S _ O W N D C或C S _ C L A S S D C。对于更早版本的Wi n d o w s,操作系统本身只有五个预分配的通用设备环境,因此取名 G e t D C()与CreateDC()相对应。必须保证在用完设备环境后释放它,否则系统将发生冲突并导致异常终止。虽然设备环境是被创建的,但内存资源还是有限的,因此在使用一个通用设备环境后,仍需用下面语句释放它:ReleaseDC(pDC);注意 私有设备环境和类设备环境不必释放。用户最有可能用通用设备环境来做绘图工作。每次释放一个通用设备环境时,为它们设置的值都被丢失。但是,可以用下面两个 C D C成员函数保存和恢复一个设备环境的设置值:S a v e D C()保存设备环境的当前状态。RestoreDC()将设备环境恢复到用SaveDC()保存的状态。4.2.2 打印机要为打印机创建一个设备环境,必须先创建一个 C D C类对象,然后使用它的 CreateDC()成员函数:CDC dc;dc.CreateDC(LPCTSTR lpszDriverName,LPCTSTR lpszDeviceName,LPCTSTR lpszOutput,const void*lpInitData)l p s z D r i v e r N a m e是打印机所用的设备驱动程序(如“H P D RV”)。l p s z D e v i c e N a m e是进行打印的打印机设备的名字(如“HP Laserjet III”),设备驱动程序可以支持多种类型设备。第4章 绘图53下载l p s z O u t p u t指定设备的串口名(如,“L P T 1:”)。l p I n i t D a t a是任何设备专用的初始化数据。使用打印机设备环境之后,必须用 C D C类的D e l e t e D C()成员函数销毁它。但是,若在堆栈中创建C D C类,则程序返回时,设备环境自动被删除。C M y C l a s s:D r a w i n g()CDC dc;d c.C r e a t e D C();/CDC object and Device Context destroyed4.2.3 内存要创建一个可以直接绘制位图的设备环境,必须先用 C D C的CreateCompatibleDC()成员函数创建一个C D C类对象。CDC dc;dc.CreateCompatibleDC(HDC hdc);CreateCompatibleDC()用设备环境的设置值初始化它所创建的设备环境对象,因此,取名兼容D C。应该从显示被创建的位图的设备(如屏幕、打印机)传递一个设备环境。要真实地绘制一个位图,还必须创建一个空位图对象,并使该设备环境与该位图相关联。CDC dc;/create CDC objectCBitmap bitmap;/create CBitmap objectd c.C r e a t e C o m p a t i b l e D C(p D C);/create Device Context objectbitmap.CreateCompatibleBitmap(pDC,ICON_WIDTH,ICON_HEIGHT);/create Bitmap objectd c.S e l e c t O b j e c t(&b i t m a p);/point memory Device Context/to this bitmap绘制位图以后,必须用下列语句删除设备环境:d cDeleteDC();有关例子参见例5 8。4.2.4 信息C D C提供的最后一种设备环境类型是打印机的信息部分。CDC dc;d c.C r e a t e I C();这里的调用变量与CreateDC()中一样。信息设备环境只包含一台打印机或其他非屏幕设备的特性,如颜色支持等。创建信息设备环境的速度比创建一个常规的打印机设备环境速度快,因为它只包含设备的特性。信息使用后应当删除,与前面描述的一样。注意正如C W n d类和它控制的窗口一样,C D C类可以用Attach()把自己捆绑到一个已有的设备环境上,并可用 Detach()解开自己。创建一个封装已有的设备环境的临时C D C对象,可以用FromHandle()。但是,当应用程序进入空闲循环时,这一临时类对象将被删除。54第一部分 基 础 知 识下载4.3 绘图例程C D C类还在它的成员函数中封装了全部 Wi n d o w s图形A P I,这些成员函数包括:画点的函数。画线的函数。画形状的函数。填充和翻转形状的函数。滚动屏幕的函数。绘制文本的函数。绘制位图和图标的函数。4.3.1 画点像素点的绘制不过是改变单个像素点的颜色。SetPixel()试图用指定的颜色画一个像素,返回绘制时使用的实际颜色SetPixelV()与上面的基本相同,但不用返回绘制时使用的实际颜色,因而速度更快4.3.2 画线画线即改变屏幕上一系列像素点的颜色。M o v e To()开始画线、弧和多边形时,把光标移动到一个初始位置L i n e To()画一条从初始位置到另一个点的直线Arc()画一段弧A r c To()画一段弧,并更新初始位置AngleArc()画一条线,然后画一段弧,并更新初始位置PolyDraw()画一系列线段和B e z i e r样条PolyLine()画一系列线段PolyPolyLine()画多个系列线条4.3.3 画形状这里的形状是一系列封闭线条。Rectangle()画一个矩形Pie()画一个饼状楔形RoundRect()画一个圆角矩形Draw3dRect()画一个三维矩形Polygon()画一个多边形DrawEdge()画一个矩形的边缘PolyPolygon()创建一个或多个多边形DrawFrameControl()画一个框架控件Ellipse()画一个椭圆4.3.4 形状填充和翻转填充和翻转改变一个形状内的所有像素点颜色。FillRect()填充一个矩形FillSolidRect()用用一单色填充一个矩形InvertRect()反转一个矩形的颜色ExtFloodFill()用用当前画刷填充一个区域,提供比FloodFill()成员函数更多的灵活性FrameRect()画一个矩形的边框第4章 绘图55下载下面三个函数包括一个区域对象,它实际上是一个线条列表,形成一个由设备环境维护的形状。有关区域的详细讨论参见 4.4.8节“剪裁属性”。FillRgn()填充一个区域InvertRgn()反转一个区域的颜色FrameRgn()画一个特定区域的边框4.3.5 滚动通过滚动,可移动屏幕周围像素颜色。ScrollDC()左、右、上、下移动屏幕图像。4.3.6 绘制文本我们可能会认为文本是打印的,不是画的;但在一个图形用户界面中,甚至一个文本字符都是由像素构成的一幅图。TextOut()在在一个指定的位置,输出一个字符串E x t TextOut()在在一个矩形区域里输出一个字符串Ta b b e d TextOut()在基于用该函数传输的一个表,在指定位置输出一个字符串,并将字符串中的任何制表符转换为空格D r a w Text()在在指定的矩形域里绘制文本,但比 TextOut()有更多的选项,如把文本居中和显示多行文本4.3.7 绘制位图和图标一个位图或图标只是大量像素的颜色阵列。通常有一个标题,用来指示在一行中有多少像素点,以便一个画图例程知道什么时候开始下一行。通常,位图绘制例程只是把像素阵列拷贝到视频内存中。图标具有透明色这一附加的能力,换句话说,当一个图标被绘制在屏幕上时,它的每一点的颜色都可被屏幕上原有的颜色代替。DrawIcon()在在指定的位置画一个图标BitBlt()在从指定的设备环境中拷贝一个位图,通常是从磁盘中装入或在内存中创建,如前面所述StretchBlt()在与BitBlt()基本相同,但它试图伸展或压缩一个位图以适应目标PatBlt()在创建一个位模式有关绘图的例子参见第11章。4.4 绘图属性前面所讨论的所有函数都使用设备环境对象来简化它们的调用变量;因为所有的绘图函数只有一个设备环境,因此,每个函数可能只使用存储在设备环境中 2 0%的属性。一个设备环境既可以自身包含一种特定的绘图属性,也可以指向另一个包含某种特定属性的对象。例如,画一条线的属性(如宽度或颜色)可存储在一个单独的P e n对象中,而由设备环境指向该对象。有关设备环境指向的其他对象,以及封装它们的 M F C类(见图4-2)。创建这些附加的图形对象,与创建一个窗口对象的方法一样,先创建 M F C类对象,然后56第一部分 基 础 知 识下载调用那个类的成员函数 Create()。附加的图形对象一旦被创建,需要告诉设备环境运用SelectObject()使用该新对象,SelectObject()只是把设备环境指向新的图形对象。图4-2 一个设备环境可以指向包含附加绘图属性的辅助设备环境对象CPen pen;/create MFC objectp e n.C r e a t e P e n();/create Pen objectCPen*pOldPen=dc.SelectObject(&pen);/points the DC to your new object/returns a pointer to old pen object虽然设备环境指向五个不同的图形对象,但只使用一个 SelectObject()。设备环境基于对象本身的一个特征字决定替换哪个指针。用新对象绘图后,必须从内存中删除该对象。因为设备环境仍指向该对象,所以,必须先把它指向另一个对象通常是原先的对象。d c.S e l e c t O b j e c t(p O l d P e n);/select another objectp e n.D e l e t e O b j e c t();/deletes Pen object(returning/destroys the CPen object)4.4.1 设备环境属性下面的绘图属性可以在设备环境和它的辅助对象中找到:画线属性控制画线函数怎样画线(如颜色和粗细)。这些属性的大部分包含在P e n对象中。填充属性控制绘制形状的函数怎样填充形状。这些属性的大多数保存在 B r u s h对象中。文本属性控制文本是怎样绘制的。字体属性保存在 F o n t对象中,颜色和对齐方式(如左或中央)保存在设备环境中。映像属性控制x、y坐标在绘图操作中表示什么。换句话说,坐标是以像素还是以英寸为单位的,以及应采取哪一种方式。没有附加映像对象,因为所有信息都保存在设备环境本身中。调色板属性可以用来控制线条和形状的颜色。图形应用程序,尤其那些视频内存有限的系统,用调色板控制颜色。所有调色板属性保存在 P a l e t t e对象中。混合属性控制线条怎样与背景互相作用。例如,是只想覆盖背景色,还是想与背景色进行X O R操作,以便以后可以用重画该线来删除它呢?剪裁属性创建一个区域,不能在该区域外绘图。这些属性保存在 R e g i o n对象中。第4章 绘图57下载CBrush类CRgn类区域对象画刷对象C B i t m a p类位图对象调色板对象C P a l e t t e类C F o n t类字体对象画笔对象C D C类C P e n类设备环境对象位图属性包含在位图绘制函数中使用的位图。4.4.2 画线属性画线属性控制怎样画线条。设备环境用一个包含大多数画线属性的H P E N句柄指向一个P e n对象。在M F C中创建一个P e n对象,必须先创建一个C P e n类对象,然后,调用C P e n的两个成员函数之一。CreatePen()用用指定的颜色、宽度和模式创建一个P e n对象,模式可以是从实线到虚线的任何一种,由用户指定长线和空格的长度CreatePenIndirect()用用L P L O G P E N结构创建一个P e n对象不必创建用户自己的P e n对象,有一些预定义的P e n对象可用,可以用S e l e c t S t o c k O b j e c t()直接把它们选进设备环境中。可以用下面这些标志识别选择了哪一个存储对象。B L A C K _ P E N用包含黑画笔的属性W H I T E _ P E N用包含白画笔的属性N U L L _ P E N用使绘图函数不能画线,例如:用一个矩形画一条线,然后填充该矩形。选择该P e n对象将不能画线。4.4.3 形状填充属性B r u s h对象控制怎样填充形状。设备环境用一个 H B R U S H句柄指向一个画刷对象。若用M F C创建一个B r u s h对象,首先要创建一个 C B r u s h类对象,然后调用下面 C B r u s h的六个成员函数之一:CreateSolidBrush()创建一个单色B r u s h对象CreateHatchBrush()创建一个指定阴影模式和颜色的画刷CreateBrushIndirect()用L O G B R U S H结构中的设置值创建C B r u s h对象CreatePatternBrush()创建一个用位图指定模式的B r u s h对象CreateDIBPatternBrush()创建一个用设备无关位图指定模式的 C B r u s h对象CreateSysColorBrush()创建一个具有默认系统颜色的B r u s h对象若不想创建用户自己的 B r u s h对象,系统有一些预定义的对象可以使用。可以用 S e l e c t-StockObject()和相应的标志值,直接把这些预定义对象选进设备环境。B L A C K _ B R U S H标标识B r u s h对象,包含用黑色填充一个形状所需的属性W H I T E _ B R U S H标包含用白色填充形状的属性D K G R AY _ B R U S H标包含用深灰色填充形状的属性G R AY _ B R U S H标包含用灰色填充形状的属性LT G R AY _ B R U S H标包含用浅灰色填充形状的属性N U L L _ B R U S H标使绘图函数不能对形状进行填充,例如,用一个矩形绘制一条线,或H O L L O W _ B R U S H然后填充矩形。选择该B r u s h对象将导致不能填充矩形4.4.4 文本绘制属性文本属性控制怎样绘制文本。有三种类型的文本属性:颜色、对齐方式和字体。1.文本颜色58第一部分 基 础 知 识下载两个成员函数为绘制文本设定前景色和背景色。S e t TextColor()设定前景色(即文本色)SetBkColor()设置输出文本处的背景色。2.文本对齐方式对齐方式属性决定文本怎样排列(如:左对齐、右对齐、中央对齐)。确切地说,TextOut()函数中的x、y变量可以表示文本的左边、右边或者底部。使用默认的对齐方式,x、y代表文本的左上角,但还有其他一些方式。要改变设备环境的文本对齐属性,可以用 S e t TextAlign()函数和下面的标志值之一:TA _ L E F T儿TextOut()中的x变量表示文本的左边。TA _ L E F T是默认设置值TA _ TO P儿TextOut()中的y变量表示文本的顶部。TA _ TO P是默认设置值TA _ R I G H T儿TextOut()中的y变量表示文本的右边。计算文本的边界矩形,用以决定从哪儿开始绘制文本TA _ C E N T E R儿TextOut()中的y变量表示文本的中部TA _ B A S E L I N E儿TextOut()中的y变量表示文本的基线TA _ B O T TO M儿TextOut()中的y变量指示文本的底部注意这些属性可以合在一起使用。例如,TA _ C E N T E R和TA _ B O T TO M表示x、y指向文本串的中部和底部。3.文本字体字体属性包括字体类型、大小和文本外观的其他方面。这些属性不是定义一个可以使用的字体,而是告诉系统需要使用什么类型的字体。然后系统在它可用字体列表中搜索与指定属性最匹配的字体并使用它。字体属性包括在 F o n t对象中,设备环境用 H F O N T句柄指向该对象。若用 M F C创建一个F o n t对象,首先创建一个C F o n t类对象,然后调用下面C F o n t的四个成员函数之一:CreateFont()儿创建一个字体对象,并指定一些需要的特性,包括点大小、粗细(正常或粗体)、斜体或非斜体CreateFontIndirect()儿基本与上面相同,但使用L O G F O N T结构CreatePointFont()儿C r e a t e F o n t()的简化版只需指定点大小和字体CreatePointFontIndirect()儿CreateFontIndirect()的简化版只需指定点大小和字体若不想创建自己的F o n t对象,则有一些预定义的对象可用,可以用 SelectStockObject()直接把它们选进设备环境。通过选择这些标志值,指定选择哪个存储对象。S Y S T E M _ F O N T这这是Wi n d o w s在窗口中绘制菜单、任务栏等时使用的默认字体S Y S T E M _ F I X E D _ F O N T这Wi n d o w s在3.0版以前使用的默认字体A N S I _ F I X E D _ F O N T这字体是非成比例间隔的C o u r i e r(每个字符在行中占据相同的空间)。特殊字符集(除A-Z外的字符)是A N S I标准A N S I _ VA R _ F O N T这字体是均匀成比例间隔的 MS Sans Serif(字母I在一条线上占据的空间比W少)。特殊字符集是A N S I标准D E V I C E _ D E FA U LT _ F O N T这设备优先选取的字体O E M _ F I X E D _ F O N T这基本与A N S I _ F I X E D _ F O N T相同,但其特殊字符集是O E M-s p e c i f i c4.4.5 映像模式Wi n d o w s有一些映像模式允许用户以像素、英寸或毫米为单位进行绘制。然而,对于大第4章 绘图59下载多数应用程序,永远也不必考虑映像模式。默认模式以像素为单位,这时的x和y为像素值。但是,若确实需要x和y为英寸值,则必须要注意逻辑单位和设备单位之间的不同。1.逻辑单位与设备单位的比较逻辑单位是传递给绘图函数的 x和y值,它们可以表示英寸或毫米;而设备单位是 x和y值在屏幕上的像素数,或者是在打印机上的点阵数。鼠标单击以设备单位返回。如果想知道用户单击在位图上的什么位置,需要将设备单位转换为逻辑单位。当以逻辑单位方式工作时,是工作在逻辑坐标系统中;而以设备单位方式工作时,则是设备坐标系统(也称为物理坐标系统或客户坐标系统)。映像模式用S e t M a p M o d e()存储在设备环境中,可以使用下面的标志值:M M _ T E X T这这是默认的映像模式,x和y值等于一个屏幕像素或打印机点阵。在屏幕或打印页中,正的y值向下递减M M _ H I E N G L I S H这X和y值相当于屏幕上或打印页上的1/1 0 0 0 i n,Wi n d o w s决定当前屏幕设备的多少个像素等同于1/1 0 0 0 i n。在屏幕或打印页中,正的y值向上递增M M _ L O E N G L I S H这X和y值相当于设备上的1/1 0 0 0 i n,并且y值向上递增M M _ H I M E T R I C这X和y值相当于设备上的1/1 0 0 m m,并且y值向上递增M M _ L O M E T R I C这X和y值相当于设备上的1/1 0 m m,并且y值向上递增M M _ T W I P S这X和y值相当于设备上的 1/1 4 4 0 i n,并且y值向上递增这通常在文本绘制中使用,一个缇(t w i p)单位相当于1/2 0点另有两个映像模式允许设置多少个逻辑单位相当于一个设备单位:M M _ A N I S O T R O P I C和M M _ I S O T R O P I C。I s o t r o p i c模式(各向同性模式)确定x方向的一个单位等同于 y方向的一个单位,而A n i s o t r o p i c模式(各向异性模式)则不同。根据自己的习惯定义两个矩形,设置从逻辑环境到设备环境的 Wi n d o w s转换。第一个矩形以逻辑单位表示进行绘制的范围大小;第二个矩形以设备单位(即像素)表示第一个矩形范围代表的设备范围大小。根据 Wi n d o w用语,第一个矩形称为窗口,而第二个矩形称为视口(见图4-3)。图4-3 设置窗口和视口矩形定义窗口怎样从逻辑环境转换到设备环境60第一部分 基 础 知 识下载设置视口到视图的客户区,并可忘记它。SetViewportOrg(0,0);SetViewportExt(100,50)把窗口的初始位置设置在想在逻辑环境中看到的地方;setWindowOrg(100,100);设置窗口范围,使它成为想在逻辑环境中看到的大小。SetWindowExt(300100,200100);要缩小图形,只要缩小窗口的范围。要扫视图形,只要增大窗口范围。要滚动图形,只要改变窗口的初始位置设备环境逻辑环境要设置窗口和视口矩形,使用下面这些 C D C的成员函数:S e t Wi n d o w O rg()设置表示逻辑环境的矩形的左上角值S e t WindowExt()设置表示逻辑环境的矩形的大小S e t Vi e w p o r t O rg()设置表示设备环境的矩形的左上角值S e t ViewportExt()设置表示设备环境的矩形的大小注意 如果用各向同性映像模式,则在设置视口值前必须设置窗口值。2.翻转(I n v e r t i n g)、缩放(Z o o m i n g)和平移(P a n n i n g)一旦工作在各向异性模式或各向同性模式,便可以获得一些强烈的图形效果。翻转只要通过翻转视口值就可以翻转在屏幕上绘制的图像(见图4-4)。p D C-S e t WindowOrg(0,0);/0,0 in logical world equalsp D C-S e t ViewportOrg(0,480);/0,480 in device worldp D C-S e t ViewportExt(640,480);/the maximum in the/device worldp D C-S e t WindowExt(640,-480);/equals this maximum/in the logical图4-4 通过翻转视口值,翻转屏幕上的图像缩放只要通过变大或变小视口值就可以放大或缩小一个图像。使用C D C:S c a l e Vi e-wportExt()进行百分比放大。平移初始绘制的整幅图像可能不适应屏幕,这时,可以在逻辑环境里创建整幅图像,但在设备环境里只有部分可见。只要通过移动视口矩形就可以移动图像在屏幕上的可视部分。第4章 绘图61下载CMyButton类对象 CMyDialog 用子分类截获该消息,查明它是一个控件通知,进而把它发送到控制该窗口的MFC类,即CMyButton CMyButton 可能有一个处理该消息的函数。如果没有,CMyDialog返回它如果CMyDialog也不处理它,则最后由对话窗口进程处理CMyDialog类对象对话窗口进程按钮窗口进程按钮窗口进程发送一个控件通知到它的父窗口,如BN_CLICKED用户创建一个CMyButton类和一个CMyDialog类,以及它们的窗口对象,并使按钮控件成为对话窗口的一个子窗口使用C D C:O ff s e t Vi e w p o r t O rg()进行帮助。注意可以用S e t Vi e w p o r t O rg()和S e t Wi n d o w O rg()在任何绘图模式下进行平移,但是,SetViewportExt()和SetWindowExt()是为各向同性和各向异性模式预留的。3.转换C D C类还提供了两个从一个环境向另一个环境转换的函数。DPtoLP()将设备单位转换为逻辑单位LPtoDP()将逻辑单位转换为设备单位4.对话框单位与像素对话框单位是有关映像模式的边缘主题,在用对话框编辑器创建的对话模板中,布满了以对话框单位表示的大小和坐标,对应于像素的大小和座标。对话框单位允许一个对话框模板按比例调整自己以适应不同的字型和字体大小。要把对话框单位转换到像素单位,可以用下面的C D i a l o g成员函数:MapDialogRect(LPRECT&rect);这里的r e c t包含一个对话框单位集,以及为该对话框实例将那些对话框单位转换到像素的函数。如果不能事先创建一个对话框实例,可以用 C D i a l o g Te m p l a t e类的一个静态函数。static void CDialogTe m p l a t e:C o n v e r t D i a l o g U n i t s ToPixels(LPCSTR typeface,int point,int x,int y,SIZE*pSize)t y p e f a c e和p o i n t是对话框当前默认的字形和字体大小,x和y以对话框单位表示,函数返回的像素值放在p S i z e中。4.4.6 调色板属性调色板属性维护应用程序要求的颜色,以便在应用程序运行时把这些颜色装载到系统的调色板中。对于大多数应用程序,将使用应用程序的调色板,因为只需使用少数由系统提供的颜色;然而在一些以图形为主的应用程序中,要求使用大量不同的纯色,这时,有必要考虑一块最多能支持2 5 6色的显卡能否满足要求。调色板属性包含在 P a l e t t e对象中,设备环境使用一个 H PA L L E T E句柄指向该对象。使用M F C创建一个P a l e t t e对象,首先创建一个C P a l e t t e类对象,然后调用CreatePalette()成员函数。若不想创建自己的P a l e t t e对象,可以使用下面的函数直接将一个预定义的 P a l e t t e对象选到设备环境中。S e l e c t S t o c k O b j e c t(D E FA U LT _ PA L E T T E).这是默认的调色板,用它初始化一个新的设备环境。该调色板的目的不是提供一个新的颜色集,而是把颜色调色板重置为初始设置。有关调色板的详细内容,参见4.6节“颜色和调色板”。4.4.7 混合属性混合属性控制绘制的线条或文本怎样与它们的背景进行相互作用。对于大多数应用程序,永远不必考虑与背景的作用,默认的混合模式只是覆盖背景上的内容。然而,对于一些需要62第一部分 基 础 知 识下载在一幅图像上面绘制另一幅图像的应用程序,则有必要考虑每个增加的图像对原图像有何影响。设备环境包含了混合所需的所有属性,不要求另外的对象。用户可以在以下两个方面改变混合的属性:线条怎样与它们的背景色进行混合。在绘制文本时,是否使用文本背景色。注意 也能改变一个位图与它的背景进行混合的属性。然而,该属性包含在它自己的绘图函数中,而不是在设备环境中。1.线条混合要设置线条与背景混合的模式,使用 C D C类的SetROP2()成员函数。R O P代表光栅操作(Raster Operation),表示该函数只作用于光栅设备,如屏幕。线条混合不能作用于打印机和任何属于矢量设备的绘图仪。可以用SetROP2()设置一些线条混合模式,下面这些模式是经常使用的:R 2 _ C O P Y P E N默认方式线条覆盖背景颜色。R 2 _ N O T最终线条的颜色是当前屏幕颜色的反转色,忽视 P e n对象颜色。R 2 _ X O R P E N最终线条的颜色是P e n对象颜色和屏幕颜色的异或。R 2 _ M E R G E P E N最终线条的颜色是P e n对象颜色和屏幕颜色的或。R 2 _ B L A C K线条总是黑色,且忽略P e n对象颜色。R 2 _ W H I T E线条总是白色,且忽略P e n对象颜色。R 2 _ X O R P E N模式经常用来使线条在物体表面上移动,而不干扰物体。有关的例子如套索或选取框,拖拉一个矩形以覆盖一些对象,并选取它们。要绘制套索,需要画一个矩形框,并使它逐步变大而不破坏它底下的图像。这时,可以通过以下方法实现,先用 R 2 _ X O R P E N模式画一个矩形,然后通过重画它擦除该矩形,这样就不会破坏它底下的图像,因为异或一个异或的颜色是原来像素的颜色。2.文本混合在绘制文本时,文本混合决定是否需要文本背景,或者只是把文本绘制在任何已有的内容上面。要设置背景模式,使用C D C的SetBkMode()成员函数,并选择下面两个标志值之一:OPA Q U E这是默认值,输出文本的区域被由 SetBkColor()函数指定的颜色覆盖T R A N S PA R E N T该模式允许在一个图像上绘制文本,而不会破坏原有图像4.4.8 剪裁属性剪裁属性在绘图区定义一个区域,在该区域以外,任何试图的绘制都被忽视。设备环境用一个H R G N句柄指向R e g i o n对象,它包含构成剪裁区域的线条列表。使用 M F C创建一个R e g i o n对象,首先创建一个C R g n类的对象,然后调用C R g n的一个成员函数。下面两个函数经常使用:CreateRectRgn()用一个矩形区域初始化一个C R g n对象CreateRectRgnIndirect()用一个R E C T结构定义的矩形区域初始化一个C R g n对象可以使用剪裁区域产生一些有趣的图形效果,例如,可以创建一个形成“S TO P”单词字第4章 绘图63下载母的剪裁区域,然后用该设备环境绘制一个位图。结果单词“S TO P”部分地被所画的位图填充。与调色板和混合属性一样,大多数的应用程序都不必考虑剪裁区域。4.4.9 位图绘制属性在设备环境中,位图属性是用一个 H B I T M A P句柄指向位图对象的一个指针。使用 M F C创建一个位图对象,首先,创建一个 C B i t m a p类对象;然后,调用它的一个成员函数。其中下面这些是常用的函数:LoadBitmap()从从应用程序资源里创建一个位图对象,该位图对象可能在位图编辑器中创建LoadOEMBitmap()从使用一个Wi n d o w s预定义的位图对象,参见M F C用户文档的有

    注意事项

    本文(MFC编程案例chapter004.pdf)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开