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

📄 chap8_2.htm

📁 非常好的应用vc++6.0进行相关网络程序开发的教程
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<html>

<head>
<title>8.2图形设备接口(GDI)</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>

<body link="#3973DE" alink="#3973DE">
<font SIZE="5"><b><div align="center"><center>

<table border="0" width="615" cellspacing="0" cellpadding="0">
  <tr>
    </b><td><div align="center"><center><table border="0" width="615" cellpadding="0" cellspacing="0" height="20">
      <tr>
        <td width="377" bgcolor="#15397D" height="20"></td>
        <td width="238" bgcolor="#000000" height="20"><p align="right"></font><span style="text-decoration: none"><a href="../../index.htm"><font color="#FFFFFF">电脑报Visual 
        C++网络教程</font></a></span></td>
      </tr>
    </table>
    </center></div><font FACE="Times New Roman" size="3"><p ALIGN="CENTER"></font><font color="#3973DE"><font FACE="Times New Roman" SIZE="4">8.2</font><font SIZE="4"> &nbsp; 
    图形设备接口(</font><font FACE="Times New Roman" SIZE="4">GDI</font><font SIZE="4">)</font></font><font FACE="Times New Roman" SIZE="4"></p>
    <p></font><font SIZE="3">图形设备接口(</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">)是一个可执行程序,它接受</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">应用程序的绘图请求(表现为</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出。</font><font FACE="Times New Roman" SIZE="4"><b></p>
    <p></b></font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">负责</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">的所有图形输出,包括屏幕上输出像素、在打印机上输出硬拷贝以及绘制</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">用户界面。</font><font FACE="Times New Roman" SIZE="3"><b></p>
    <p></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">8.2.1 </font><font SIZE="3" color="#3973DE">三种图形输出类型</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">应用程序可以使用</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">创建三种类型的图形输出:矢量输出、光栅图形输出和文本输出。<b></p>
    <p></b><font color="#3973DE">矢量图形输出</font></font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">矢量图形输出指的是创建线条和填充图形,包括点、直线、曲线、多边形、扇形和矩形的绘制。<b></p>
    <p></b><font color="#3973DE">光栅输出</font></font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">光栅图形的输出是指光栅图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出。在屏幕上表现为对若干行和列的像素的操作,在打印机上则是若干行和列的点阵的输出。 
    </font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">光栅图形输出的优点是速度很快,它是直接从内存到显存的拷贝操作。缺点是需要额外的内存空间。</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">在绘制界面时使用了大量的光栅输出。<b></p>
    <p></b><font color="#3973DE">文本输出</font></font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">与</font><font FACE="Times New Roman" SIZE="3">DOS</font><font SIZE="3">字符方式下的输出不同,</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">是按图形方式输出的。这样,在输出文本时,必须以逻辑坐标为单位计算文本的输出位置,而不是象</font><font FACE="Times New Roman" SIZE="3">DOS</font><font SIZE="3">下以文本行为单位输出文本。这比</font><font FACE="Times New Roman" SIZE="3">DOS</font><font SIZE="3">下的文本输出要难一些。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">但是,按图形方式输出文本也给文本输出带来很大的灵活性。用户可以通过调用各种</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">函数,制造出各种文本输出效果,包括加粗、斜体、设置颜色等。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>Windows</font><font SIZE="3">还提供了一种</font><font FACE="Times New Roman" SIZE="3">TrueType(</font><font SIZE="3">写真字体</font><font FACE="Times New Roman" SIZE="3">)</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3">TrueType</font><font SIZE="3">字体用一组直线和曲线命令及一些参数来描述字体的轮廓。</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">可以通过参数来调整直线的长度和曲线的形状,从而实现对字体的自由缩放。</font><font FACE="Times New Roman" SIZE="3"><b></p>
    <p></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">8.2.2 MFC</font><font color="#3973DE"><font SIZE="3">中与</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">有关的类</font></font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">为了支持</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">绘图,</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">提供了两种重要的类:设备上下文类,用于设置绘图属性和绘制图形;绘图对象类,封装了各种</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">绘图对象,包括画笔、刷子、字体、位图、调色板和区域。</font><font FACE="Times New Roman" SIZE="3"></p>
    </font><font SIZE="3"><b><p></b><font color="#3973DE">设备上下文类</font></font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">设备上下文类包括</font><font FACE="Times New Roman" SIZE="3">CDC</font><font SIZE="3">和它的派生类</font><font FACE="Times New Roman" SIZE="3">CClientDC</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">CPaintDC</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">CWindowDC</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">CMetaFileDC</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>CDC</font><font SIZE="3">是设备上下文类的基类,除了一般的窗口显示外,还用于基于桌面的全屏幕绘制和非屏幕显示的打印机输出。</font><font FACE="Times New Roman" SIZE="3">CDC</font><font SIZE="3">类封装了所有图形输出函数,包括矢量、光栅和文本输出。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">CClientDC</font><font SIZE="3">(客户区设备上下文)用于客户区的输出,它在构造函数中封装了</font><font FACE="Times New Roman" SIZE="3">GetDC()</font><font SIZE="3">,在析构函数中封装了</font><font FACE="Times New Roman" SIZE="3">ReleaseDC()</font><font SIZE="3">函数。一般在响应非窗口重画消息(如键盘输入时绘制文本、鼠标绘图)绘图时要用到它。用法是:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>CClientDC dc(this);//this</font><font SIZE="3">一般指向本窗口或当前活动视图</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>dc.TextOut(10,10,str,str.GetLength());</p>
    <p>//</font><font SIZE="3">利用</font><font FACE="Times New Roman" SIZE="3">dc</font><font SIZE="3">输出文本,如果是在</font><font FACE="Times New Roman" SIZE="3">CScrollView</font><font SIZE="3">中使用,还要注意调 </font><font FACE="Times New Roman" SIZE="3"></p>
    <p>//</font><font SIZE="3">用</font><font FACE="Times New Roman" SIZE="3">OnPrepareDC(&amp;dc)</font><font SIZE="3">调整设备上下文的坐标。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">CPaintDC</font><font SIZE="3">用于响应窗口重绘消息(</font><font FACE="Times New Roman" SIZE="3">WM_PAINT</font><font SIZE="3">)是的绘图输出。</font><font FACE="Times New Roman" SIZE="3">CPaintDC</font><font SIZE="3">在构造函数中调用</font><font FACE="Times New Roman" SIZE="3">BeginPaint()</font><font SIZE="3">取得设备上下文,在析构函数中调用</font><font FACE="Times New Roman" SIZE="3">EndPaint()</font><font SIZE="3">释放设备上下文。</font><font FACE="Times New Roman" SIZE="3">EndPaint()</font><font SIZE="3">除了释放设备上下文外,还负责从消息队列中清除</font><font FACE="Times New Roman" SIZE="3">WM_PAINT</font><font SIZE="3">消息。因此,在处理窗口重画时,必须使用</font><font FACE="Times New Roman" SIZE="3">CPaintDC</font><font SIZE="3">,否则</font><font FACE="Times New Roman" SIZE="3">WM_PAINT</font><font SIZE="3">消息无法从消息队列中清除,将引起不断的窗口重画。</font><font FACE="Times New Roman" SIZE="3">CPaintDC</font><font SIZE="3">也只能用在</font><font FACE="Times New Roman" SIZE="3">WM_PAINT</font><font SIZE="3">消息处理之中。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>CWindowDC</font><font SIZE="3">用于窗口客户区和非客户区(包括窗口边框、标题栏、控制按钮等)的绘制。除非要自己绘制窗口边框和按钮(如一些</font><font FACE="Times New Roman" SIZE="3">CD</font><font SIZE="3">播放程序等),否则一般不用它。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">CMetaFileDC</font><font SIZE="3">专门用于图元文件的绘制。图元文件记录一组</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">命令,可以通过这一组</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">命令重建图形输出。使用</font><font FACE="Times New Roman" SIZE="3">CMetaFileDC</font><font SIZE="3">时,所有的图形输出命令会自动记录到一个与</font><font FACE="Times New Roman" SIZE="3">CMetaFileDC</font><font SIZE="3">相关的图元文件中。 
    <b></p>
    <p></b><font color="#3973DE">图形对象类</font></font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">图形对象类包括</font><font FACE="Times New Roman" SIZE="3">CGdiObject</font><font SIZE="3">、画笔、刷子、字体、位图、调色板、区域等。</font><font FACE="Times New Roman" SIZE="3">CGdiObject</font><font SIZE="3">是图形对象类的基类,但该类不能直接为应用程序所使用。要使用</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">对象,必须使用它的派生类:画笔、刷子、字体、位图、区域等等。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">使用图形对象要注意两点:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>1.</font><font SIZE="3">同其他</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">对象一样,</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">对象的创建也要分为两步:第一步,是定义一个</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">绘图对象类的实例;第二步调用该对象的创建方法真正创建对象。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">2.</font><font SIZE="3">创建对象:使用该对象,首先要调用</font><font FACE="Times New Roman" SIZE="3">CDC::SelectObject()</font><font SIZE="3">将它选入到设备上下文中,同时保存原来的设置到一个</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">对象指针比如说</font><font FACE="Times New Roman" SIZE="3">pOldObject</font><font SIZE="3">中。在使用完后,再用</font><font FACE="Times New Roman" SIZE="3">SelectObject(pOldObject)</font><font SIZE="3">恢复原来的设置。但是,如果该设备上下文是用户自己创建的,则不必恢复原来设置,因为框架会在该设备上下文生存期结束时删除该设备上下文,同时也就删除了原来存放于该设备上下文中的绘图对象设置。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">下面介绍各种对象的用法:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><b><font SIZE="3">画笔</font><font FACE="Times New Roman" SIZE="3">(CPen)</font></b><font SIZE="3">:封装</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">画笔,可被选中设备上下文中当前所用得笔。画笔用于绘制对象的边框以及直线和曲线。缺省画笔画一条与一个像素等宽的黑色实线。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">要使用画笔,首先要定义一个画笔:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>CPen pen;</p>
    <p></font><font SIZE="3">然后创建画笔。创建画笔有两种方法:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">一是使用</font><font FACE="Times New Roman" SIZE="3">CPen::CreatePen(int 
    nPenStyle,int nWidth,DWORD crColor)</font><font SIZE="3">进行初始化。第一个参数是笔的风格。</font><font FACE="Times New Roman" SIZE="3">nPenStyle</font><font SIZE="3">可选值有:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>PS_SOLID </font><font SIZE="3">实线</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>PS_DOT </font><font SIZE="3">虚线</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>PS_INSIDEFRAME </font><font SIZE="3">在一个封闭形状的框架内画线,若设定的颜色不能在调色板种找到且线宽大于</font><font FACE="Times New Roman" SIZE="3">1</font><font SIZE="3">,</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">会使用一种混色。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>PS_NULL </font><font SIZE="3">空的画笔,什么也不画</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">第二个参数是线的宽度,按逻辑单位。若线宽设为</font><font FACE="Times New Roman" SIZE="3">0</font><font SIZE="3">,则不管是什么映射模式下,线宽始终为一个像素。第三个参数是线的颜色,可以选</font><font FACE="Times New Roman" SIZE="3">16</font><font SIZE="3">种</font><font FACE="Times New Roman" SIZE="3">VGA</font><font SIZE="3">颜色中的一种。颜色的设置用一个</font><font FACE="Times New Roman" SIZE="3">RGB</font><font SIZE="3">宏来指定。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>RGB</font><font SIZE="3">宏形式如下</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>COLORREF RGB(cRed,cGreen,cBlue)</p>
    <p>cRed</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">cGreen</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">cBlue</font><font SIZE="3">分别代表颜色的</font><font FACE="Times New Roman" SIZE="3">RGB</font><font SIZE="3">三个分量,它们的取值在</font><font FACE="Times New Roman" SIZE="3">0-255</font><font SIZE="3">之间。可以使用</font><font FACE="Times New Roman" SIZE="3">RGB</font><font SIZE="3">组合成各种色彩。但是,这种表示法并不是很直观,因此我们把常见的</font><font FACE="Times New Roman" SIZE="3">RGB</font><font SIZE="3">组合定义成新的宏并放在一个</font><font FACE="Times New Roman" SIZE="3">colors.h</font><font SIZE="3">中,如清单</font><font FACE="Times New Roman" SIZE="3">8.1</font><font SIZE="3">。<b></p>
    <p>清单</font><font FACE="Times New Roman" SIZE="3">8.1 </font><font SIZE="3">常见色彩定义</font></b><font FACE="Times New Roman" SIZE="3"></p>
    <p>/*COLORS.H -</font><font SIZE="3">常见色彩定义 </font><font FACE="Times New Roman" SIZE="3">*/</p>

⌨️ 快捷键说明

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