⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap09.html

📁 利用软件开发
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>第五章 使用Windows标准控件</TITLE>
<META NAME="Template" CONTENT="E:\Office95\Template\Manuscripts\16 开图书模板.dot">
</HEAD>
<BODY>

<FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P ALIGN="CENTER"><A NAME="_Toc425698468">第九章</FONT><FONT FACE="Arial" SIZE=5> </FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>图形设备接口</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">事实上,图形设备接口</FONT><FONT SIZE=3>(Graphics Device Interface</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>GDI)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是指这样的一个可执行程序,它处理来自</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的图形函数调用,然后把这些调用传递给合适的设备驱动程序,由设备驱动程序来执行与硬件相关的函数并产生最后的输出结果。</FONT><FONT SIZE=3>GDI</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可以看作是一个应用程序与输出设备之间的中介,一方面,</FONT><FONT SIZE=3>GDI</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>向应用程序提供了一个设备无关的编程环境,另一方面,它又以设备相关的格式和具体的设备打交道。</P>
<P ALIGN="JUSTIFY">经常同图形设备接口相提并论的另一个概念是设备上下文</FONT><FONT SIZE=3>(Device Context</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>DC)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。设备上下文是一种</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>数据结构,它包括了与一个设备</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>如显示器或打印机</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的绘制属性相关的信息。所有的绘制操作通过一个设备上下文对象进行,该对象封装了实现绘制线条、形状和文本的</FONT><FONT SIZE=3>Windows API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数。设备上下文可以用来向屏幕、打印机和图元文件输出结果。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">在</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序中,我们通常在绘制之前调用</FONT><FONT SIZE=3>BeginPaint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数,然后在设备上下文中进行一系列的绘制操作,最后调用</FONT><FONT SIZE=3>EndPaint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数结束绘制。</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类</FONT><FONT SIZE=3>CPaintDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>封装了这一过程。在构造</FONT><FONT SIZE=3>CPaintDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象的同时,其构造函数自动调用</FONT><FONT SIZE=3>BeginPaint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数;在消毁</FONT><FONT SIZE=3>CPaintDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象的同时,其析构函数自动调用</FONT><FONT SIZE=3>EndPaint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数。因此前面所讲述的过程可以对应于下面的三个步骤:构造一个</FONT><FONT SIZE=3>CDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象,进行绘制操作,消毁该</FONT><FONT SIZE=3>CDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象。在基于文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视结构的应用程序框架中,这个过程被进一步的简化。回忆前几章中讲述的内容,我们一般在视类的</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数中处理有关重绘的操作。通过</FONT><FONT SIZE=3>OnPrepareDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数,框架自动的向</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数传递一个类型为</FONT><FONT SIZE=3>CPaintDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的设备上下文对象。我们只需简单的通过该对象进行绘制,而不需要关心这一对象的构造和消毁。这一过程由框架自动的完成,而且,隐藏在背后的设备上下文在对</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的调用返回时由框架进行释放。</P>
<P ALIGN="JUSTIFY">除了上面的</FONT><FONT SIZE=3>CPaintDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类外,</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>还提供了其它的一些封装不同设备上下文的类。如</FONT><FONT SIZE=3>CClientDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类,它所封装的设备上下文仅代表了一个窗口的客户区。在</FONT><FONT SIZE=3>CClientDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的构造函数中调用的不是</FONT><FONT SIZE=3>BeginPaint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数,而是</FONT><FONT SIZE=3>GetDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数;相应的,</FONT><FONT SIZE=3>ReleaseDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数在类</FONT><FONT SIZE=3>CClientDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的析构函数被自动调用。与此对应的还有另一个类</FONT><FONT SIZE=3>CWindowDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,它所封装的设备上下文代表的是整个窗口,不仅包括其客户区,也同时包括窗口的边框及其它非客户区对象。</P>
<P ALIGN="JUSTIFY">所有的设备上下文类中比较特殊的是类</FONT><FONT SIZE=3>CMetaFileDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,通过</FONT><FONT SIZE=3>CMetaFileDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象所进行的绘制操作不是对一个实在的设备来进行的,这些操作都被记录到一个</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>图元文件中。不象自动传递给</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数的</FONT><FONT SIZE=3>CPaintDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象,如果要在这种情况下使用</FONT><FONT SIZE=3>CMetaFileDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象的话,我们必须自己调用</FONT><FONT SIZE=3>OnPrepareDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">所有的这些设备上下文类都以类</FONT><FONT SIZE=3>CDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>作为其基类。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">一般情况下,很多绘制操作都是在应用程序的视类的</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数中进行的,前面说到过,当视类窗口收到消息</FONT><FONT SIZE=3>WM_PAINT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>时,该消息对应的处理函数</FONT><FONT SIZE=3>OnPaint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>被调用,该处理函数构造一个</FONT><FONT SIZE=3>CPaintDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象,并将指向该对象的指针传递给</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数。这里我们考虑这样一种情况,如果我们正在编写的是一个通过鼠标在屏幕上绘图的应用程序。这时我很显然需要为鼠标的移动消息添加消息处理函数,而且,我们希望用户在移动鼠标的过程中立即就可以看到所绘制的内容,而不是等到窗口收到</FONT><FONT SIZE=3>WM_PAINT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>消息</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>即发生重绘事件</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>才调用成员函数</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>绘制窗口。在这种情况下,我们更倾向于直接在鼠标消息处理函数中进行绘制,这时,就需要创建一个设备上下文对象,然后通过该对象调用一系列的绘制方法。</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>本身是一个图形界面的操作系统,进行</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序设计随时都会同设备上下文打交道,甚至在本书前面的章节中的一些示例程序中我们也已经用到了设备上下文,只不过在当时我们回避了与设备上下文有关的很多复杂东西。本章的目的之一就是系统的讨论这些前面已经用到但没有加以阐述的概念和技巧,并补充一些尚未涉及的内容,这些内容包括:</P>

<UL>
<P ALIGN="JUSTIFY"><LI>使用设备上下文进行绘制</LI></P>
<P ALIGN="JUSTIFY"><LI>绘图对象</LI></P>
<P ALIGN="JUSTIFY"><LI>直线与曲线</LI></P>
<P ALIGN="JUSTIFY"><LI>填充形状</LI></P>
<P ALIGN="JUSTIFY"><LI>字体和文本</LI></P>
<P ALIGN="JUSTIFY"><LI>颜色</LI></P>
<P ALIGN="JUSTIFY"><LI>坐标空间及变换</LI></P></UL>

<P ALIGN="JUSTIFY">这些概念往往是交织起来的,哪怕是一个很简单的绘制操作,往往都需要用到不只一个绘图对象,因此我们很难将它们人为的分割开来进行讲述。在本章上,各节的标题只代表了本节的侧重点,而对于某一个概念的叙述或使用,则有可能分散在不只一个小节中。事实上,一个应用程序是一个整体,它常常需要很多个部件共同协调工作才可以正常工作。因此,出现这种情况是很自然的。</P>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425698469">第一节</FONT><FONT SIZE=4> </FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>设备上下文</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序中,绘制操作通常涉及三类对象,一类是输出对象,亦即设备上下文对象,包括</FONT><FONT SIZE=3>CDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>及其派生类;一类是绘制工具对象,亦即前面所说的图形对象,如果</FONT><FONT SIZE=3>CFont</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CBrush</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>CPen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>等;另一类属于</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编程中需要用到的的基本数据类型,如</FONT><FONT SIZE=3>CPoint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CSize</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>CRect</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>等。</P>
<P ALIGN="JUSTIFY">不同的设备上下文类封装了不同类型的设备上下文类对象,如表</FONT><FONT SIZE=3>9.1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">除了设备上下文以外,在</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中进行绘制通常还需要各种绘制工具,如用来绘制线条的笔、用来填充一个图形内部的刷子以及用来绘制文本的字体等。这些工具称作图形对象,它们由</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>系统提供,</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>提供的图形对象类对它们进行了封装,表</FONT><FONT SIZE=3>9.2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>给出了这些图形对象以及与它们等价的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>图形设备句柄类型。</P>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">表</FONT><FONT FACE="Arial" SIZE=1>9. 1 MFC</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1>中的设备上下文类</P></FONT>
<P ALIGN="CENTER"><CENTER><TABLE BORDER CELLSPACING=2 BORDERCOLOR="#808080" CELLPADDING=7 WIDTH=483>
<TR><TD WIDTH="20%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">设备上下文类</FONT></TD>
<TD WIDTH="80%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">描述</FONT></TD>
</TR>
<TR><TD WIDTH="20%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">CDC</FONT></TD>
<TD WIDTH="80%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">所有设备上下文类的基类。可用来直接访问整个显示器或如打印机之类的非显示设备上下文。</FONT></TD>
</TR>
<TR><TD WIDTH="20%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">CPaintDC</FONT></TD>
<TD WIDTH="80%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">在窗口的</FONT><FONT SIZE=1>OnPaint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>成员函数中使用的一种显示上下文。在其构造过程中自动调用</FONT><FONT SIZE=1>BeginPaint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>,在其析构过程中自动调用</FONT><FONT SIZE=1>EndPaint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>。</FONT></TD>
</TR>
<TR><TD WIDTH="20%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">CClientDC</FONT></TD>
<TD WIDTH="80%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">代表窗口的客户区的显示上下文。通常在需要直接在窗口客户区进行绘制时使用。</FONT></TD>
</TR>
<TR><TD WIDTH="20%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">CWindowDC</FONT></TD>
<TD WIDTH="80%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">代表整个窗口的显示上下文,包括客户区和非客户区。</FONT></TD>
</TR>
<TR><TD WIDTH="20%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">CMetaFileDC</FONT></TD>
<TD WIDTH="80%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">代表</FONT><FONT SIZE=1>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>图元文件的设备上下文。一个</FONT><FONT SIZE=1>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>图元文件包括一系列的图形设备接口命令,可以通过重放这些命令来创建图形。向</FONT><FONT SIZE=1>CMetaFileDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>对象进行的各种绘制操作可以被记录到一个图元文件中。</FONT></TD>
</TR>
</TABLE>
</CENTER></P>

<FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> </P>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">表</FONT><FONT FACE="Arial" SIZE=1>9. 2 MFC</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1>中的</FONT><FONT FACE="Arial" SIZE=1>Windows GDI</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1>对象类</P></FONT>
<P ALIGN="CENTER"><CENTER><TABLE BORDER CELLSPACING=2 BORDERCOLOR="#808080" CELLPADDING=7 WIDTH=475>
<TR><TD WIDTH="18%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">图形对象类</FONT></TD>
<TD WIDTH="21%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">等价的</FONT><FONT SIZE=1>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>图形设备句柄</FONT></TD>
<TD WIDTH="61%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">描述</FONT></TD>
</TR>
<TR><TD WIDTH="18%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">CBrush</FONT></TD>
<TD WIDTH="21%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">HBRUSH</FONT></TD>
<TD WIDTH="61%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">用来填充正在绘制的对象的内部</FONT></TD>
</TR>
<TR><TD WIDTH="18%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">CPen</FONT></TD>
<TD WIDTH="21%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">HPEN</FONT></TD>
<TD WIDTH="61%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">用来绘制对象的边线</FONT></TD>
</TR>
<TR><TD WIDTH="18%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">CFont</FONT></TD>
<TD WIDTH="21%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">HFONT</FONT></TD>
<TD WIDTH="61%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">用来绘制文本</FONT></TD>
</TR>
<TR><TD WIDTH="18%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">CBitmap</FONT></TD>
<TD WIDTH="21%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">HBITMAP</FONT></TD>
<TD WIDTH="61%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">用来提供操作位图的接口</FONT></TD>
</TR>
<TR><TD WIDTH="18%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">CPalette</FONT></TD>
<TD WIDTH="21%" VALIGN="TOP">

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -