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

📄 chap11_3.htm

📁 VC++编程实例。非常详细
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<html>

<head>
<title>11.3 依赖于设备的位图(DDB)</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<link rel="stylesheet" href="../../../cpcw.css"></head>

<body link="#3973DE" alink="#3973DE" background="../../bg.gif">
<div align="center"><center>
    <table width="85%" border="0">
      <tr bgcolor="#FFFFFF"> 
        <td> 
          <div align="center">
            <center>
            </center>
          </div>
          <p align="CENTER"><b><font color="red" face="Times New Roman">11.3 </font><font color="red">依赖于设备的位图</font><font color="red" face="Times New Roman">(DDB)</font></b></p>
          <p align="JUSTIFY">DDB(Device-dependent bitmap)依赖于具体设备,这主要体现在以下两个方面:</p>
          <ul>
            <li>
              <p align="JUSTIFY">DDB的颜色模式必需与输出设备相一致。例如,如果当前的显示设备是256色模式,那么DDB必然也是256色的,即一个像素用一个字节表示。</p>
            </li>
            <li>
              <p align="JUSTIFY">在256色以下的位图中存储的像素值是系统调色板的索引,其颜色依赖于系统调色板。</p>
            </li>
          </ul>
          <p> </p>
          <p align="JUSTIFY">由于DDB高度依赖输出设备,所以DDB只能存在于内存中,它要么在视频内存中,要么在系统内存中。</p>
          <b> 
          <p align="JUSTIFY"> </p>
          </b>
          <p align="JUSTIFY"><b></b><font color="#3973DE" face="Times New Roman" size="3">11.3.1 
            DDB</font><font size="3" color="#3973DE">的创建</font></p>
          <p align="JUSTIFY">MFC的CBitmap类封装了DDB。该类提供了几个函数用来创建DDB:</p>
          <blockquote> 
            <blockquote> 
              <p align="JUSTIFY">BOOL LoadBitmap( LPCTSTR lpszResourceName );<br>
                BOOL LoadBitmap( UINT nIDResource );<br>
                该函数从资源中载入一幅位图,若载入成功则返回TRUE。资源位图实际上是一个DIB,该函数在载入时把它转换成了DDB。</p>
              <p align="JUSTIFY">BOOL CreateBitmap( int nWidth, int nHeight, UINT 
                nPlanes, UINT nBitcount, const void* lpBits );<br>
                该函数用来创建一幅空白的DDB。参数nWidth和nHeight以像素为单位说明了位图的宽度和高度。nPlanes是DDB的色平面数,nBitcount是每个色平面的颜色位数。一般来说,nPlanes为1,而nBitcount代表DDB中每个像素值所占的位数,但在创建16色DDB时,nPlanes为4,而nBitcount为1。参数lpBits指向存储像素阵列的数组,该数组应该逐行存储位图的每个像素值。注意,数组中每行像素的数目必需是偶数个字节,如果是奇数,则应该用0补足。若创建成功函数返回TRUE。</p>
              <p align="JUSTIFY">BOOL CreateCompatibleBitmap( CDC* pDC, int nWidth, 
                int nHeight );<br>
                该函数创建一个与指定设备上下文兼容的DDB。参数pDC指向一个设备上下文,nWidth和nHeight是DDB的尺寸。若创建成功函数返回TRUE。</p>
            </blockquote>
          </blockquote>
          <p> </p>
          <p align="JUSTIFY">可以调用CBitmap的成员函数GetBitmap来查询DDB的各种属性(如尺寸):</p>
          <blockquote> 
            <blockquote> 
              <p align="JUSTIFY">int GetBitmap( BITMAP* pBitMap );<br>
                该函数用来获得与DDB有关的信息,参数pBitMap指向一个BITMAP结构。BITMAP结构的定义为:</p>
              <blockquote> 
                <p align="JUSTIFY">typedef struct tagBITMAP { </p>
                <p align="JUSTIFY">LONG bmType; //必需为0</p>
                <p align="JUSTIFY">LONG bmWidth; //位图的宽度(以像素为单位)</p>
                <p align="JUSTIFY">LONG bmHeight; //位图的高度(以像素为单位)</p>
                <p align="JUSTIFY">LONG bmWidthBytes; //每一扫描行所需的字节数,应是偶数</p>
                <p align="JUSTIFY">WORD bmPlanes; //色平面数</p>
                <p align="JUSTIFY">WORD bmBitsPixel; //色平面的颜色位数</p>
                <p align="JUSTIFY">LPVOID bmBits; //指向存储像素阵列的数组</p>
                <p align="JUSTIFY">} BITMAP;</p>
              </blockquote>
            </blockquote>
          </blockquote>
          <p><b> </b></p>
          <p align="JUSTIFY"> <b></b><font color="#3973DE" face="Times New Roman" size="3">11.3.2 
            DDB</font><font size="3" color="#3973DE">的用途</font></p>
          <p align="JUSTIFY">  DDB的主要用途是保存位图。要保存的位图可以来自资源位图,也可以是一个绘图的结果。</p>
          <p align="JUSTIFY">  前面说过,在256色以下的显示模式中,DDB中的像素值是系统调色板的索引。一般在系统调色板中除了保留的20种静态颜色外,其它表项都有可能被应用程序改变。如果DDB中有一些像素值是指向20种静态颜色以外的颜色,那么该位图的颜色将是不稳定的。因此,DDB不能用来长期存储色彩丰富的位图。如果位图使用的大部分颜色都是20种保留色,则该位图可以用CBitmap对象保存在内存中。例如,用CDC::LoadBitmap载入的资源位图一般都是颜色较简单的位图,对于那些颜色比较丰富的位图,只有使用下面将要介绍的DIB才能长期保存。</p>
          <p align="JUSTIFY">在窗口中显示DDB的方法有些特别,其过程分以下几步:</p>
          <blockquote> 
            <blockquote> 
              <p align="JUSTIFY">构建一个CDC对象,然后调用CDC::CreateCompatibleDC创建一个兼容的内存设备上下文。</p>
              <p align="JUSTIFY">调用CDC::SelectObject将DDB选入内存设备上下文中。</p>
              <p align="JUSTIFY">调用CDC::BitBlt或CDC::StretchBlt将DDB从内存设备上下文中输出到窗口的设备上下文中。</p>
              <p align="JUSTIFY">调用CDC::SelectObject把原来的DDB选入到内存设备上下文中并使新DDB脱离出来。</p>
            </blockquote>
          </blockquote>
          <p> </p>
          <p align="JUSTIFY">下面这段代码在视图中显示了一个DDB:</p>
          <blockquote> 
            <p align="JUSTIFY">void CMyView::OnDraw( CDC* pDC)</p>
            <p align="JUSTIFY">{</p>
            <p align="JUSTIFY"><b>. . .</b></p>
            <p align="JUSTIFY">CDC MemDC;</p>
            <p align="JUSTIFY">CBitmap *oldBmp;</p>
            <p align="JUSTIFY">BITMAP bmpInfo;</p>
            <p align="JUSTIFY">int bmWidth,bmHeight;</p>
            <p align="JUSTIFY">MemDC.CreateCompatibleDC(pDC);</p>
            <p align="JUSTIFY">oldBmp=MemDC.SelectObject(&amp;m_Bitmap); //m_Bitmap是一个CBitmap对象</p>
            <p align="JUSTIFY">m_Bitmap.GetBitmap(&amp;bmpInfo); //获取位图的尺寸</p>
            <p align="JUSTIFY">bmWidth=bmpInfo.bmWidth;</p>
            <p align="JUSTIFY">bmHeight=bmpInfo.bmHeight;</p>
            <p align="JUSTIFY">pDC-&gt;BitBlt(0,0,bmWidth,bmHeight,&amp;MemDC,0,0,SRCCOPY);</p>
            <p align="JUSTIFY">MemDC.SelectObject(oldBmp); //使位图m_Bitmap脱离设备上下文</p>
            <p align="JUSTIFY"><b>. . .</b></p>
            <p align="JUSTIFY">}</p>
          </blockquote>
          <p align="JUSTIFY">函数CDC::BitBlt的声明为:</p>
          <blockquote> 
            <blockquote> 
              <blockquote> 
                <p align="JUSTIFY">BOOL BitBlt( int x, int y, int nWidth, int 
                  nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );</p>
              </blockquote>
            </blockquote>
          </blockquote>
          <p>  该函数把源设备上下文中的位图复制到本身的设备上下文中,两个设备上下文可以是内存设备上下文,也可以是同一个设备上下文。参数x和y是目的矩形的逻辑坐标,参数nWidth和nHeight说明了目的矩形及源位图的宽和高。pSrcDC指向源设备上下文,xSrc和ySrc说明了源矩形相对于源位图左上角的偏移。参数dwRop指定了光栅操作(ROP)代码,一些常用的ROP代码如表11.2所示。</p>
          <p align="JUSTIFY"><b> </b></p>
          <b> 
          <p align="CENTER">表11.2 常用的ROP代码</p>
          </b> 
          <table border="1" cellspacing="1" cellpadding="1" width="579">
            <tr> 
              <td width="22%"><b>
                <p align="JUSTIFY">ROP码
                </b></td>
              <td width="78%"><b>
                <p align="JUSTIFY">含义
                </b></td>
            </tr>
            <tr> 
              <td width="22%">
                <p align="JUSTIFY">BLACKNESS
              </td>
              <td width="78%">
                <p align="JUSTIFY">输出黑色
              </td>
            </tr>
            <tr> 
              <td width="22%">
                <p align="JUSTIFY">DSTINVERT
              </td>
              <td width="78%">
                <p align="JUSTIFY">反转目的位图
              </td>
            </tr>
            <tr> 
              <td width="22%">
                <p align="JUSTIFY">MERGECOPY
              </td>
              <td width="78%">
                <p align="JUSTIFY">用与操作把图案(Pattern)与源位图融合起来
              </td>
            </tr>
            <tr> 
              <td width="22%">
                <p align="JUSTIFY">MERGEPAINT
              </td>
              <td width="78%">
                <p align="JUSTIFY">用或操作把反转的源位图与目的位图融合起来
              </td>
            </tr>
            <tr> 
              <td width="22%">
                <p align="JUSTIFY">NOTSRCCOPY

⌨️ 快捷键说明

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