以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  DIBSTRUCT结构  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=51938)


--  作者:卷积内核
--  发布时间:8/29/2007 11:10:00 AM

--  DIBSTRUCT结构
DIBHELP.C档案-如此命名是因为对处理DIB提供帮助-有上千行,并在几个小部分中显示。但是首先让我们看一下DIBHELP函式所处理的结构,该结构在DIBHELP.C中定义如下:

typedef struct
{
             PBYTE            * ppRow ;       // array of row pointers
             int                iSignature ;          // = "Dib "
             HBITMAP            hBitmap ;             // handle returned from CreateDIBSection
             BYTE             *         pBits ;     // pointer to bitmap bits
             DIBSECTION         ds ;                  // DIBSECTION structure
             int                iRShift[3] ;          // right-shift values for color masks
             int                iLShift[3] ;          // left-shift values for color masks
}
DIBSTRUCT, * PDIBSTRUCT ;
现在跳过第一个栏位。它之所以为第一个栏位是因为它使某些巨集更易於使用-在讨论完其他栏位以後再来理解第一个栏位就更容易了。

在DIBHELP.C中,当DIB建立的函式首先设定了此结构时,第二个栏位就设定为文字字串「Dib」的二进位值。通过一些DIBHELP函式,第二个栏位将用於结构有效指标的一个标记。

第三个栏位,即hBitmap,是从CreateDIBSection函式传回的点阵图代号。您将想起该代号可有多种使用方式,它与我们在第十四章遇到的GDI点阵图物件的代号用法一样。不过,从CreateDIBSection传回的代号将涉及按装置无关格式储存的点阵图,该点阵图格式一直储存到通过呼叫BitBlt和StretchBlt来将位元图画到输出设备。

DIBSTRUCT的第四个栏位是指向点阵图位元的指标。此值也可由CreateDIBSection函式设定。您将想起,作业系统将控制这个记忆体块,但应用程式有存取它的许可权。在删除点阵图代号时,记忆体块将自动释放。

DIBSTRUCT的第五个栏位是DIBSECTION结构。如果您有从CreateDIBSection传回的点阵图代号,那么您可以将代号传递给GetObject函式以获得有关DIBSECTION结构中的点阵图资讯:

GetObject (hBitmap, sizeof (DIBSECTION), &ds) ;
作为提示,DIBSECTION结构在WINGDI.H中定义如下:

typedef struct tagDIBSECTION {
            BITMAP                                     dsBm ;
           BITMAPINFOHEADER         dsBmih ;
           DWORD                    dsBitfields[3] ;    // Color masks
            HANDLE          dshSection ;
            DWORD           dsOffset ;
}
DIBSECTION, * PDIBSECTION ;
第一个栏位是BITMAP结构,它与CreateBitmapIndirect一起建立点阵图物件,与GetObject一起传回关於DDB的资讯。第二个栏位是BITMAPINFOHEADER结构。不管点阵图资讯结构是否传递给CreateDIBSection函式,DIBSECTION结构总有BITMAPINFOHEADER结构而不是其他结构,例如BITMAPCOREHEADER结构。这意味著在存取此结构时,DIBHELP.C中的许多函式都不必检查与OS/2相容的DIB。

对於16位元和32位元的DIB,如果BITMAPINFOHEADER结构的biCompression栏位是BI_BITFIELDS,那么在资讯表头结构後面通常有三个遮罩值。这些遮罩值决定如何将16位元和32位图素值转换成RGB颜色。遮罩储存在DIBSECTION结构的第三个栏位中。

DIBSECTION结构的最後两个栏位指的是DIB区块,此区块由档案映射建立。DIBHELP不使用CreateDIBSection的这个特性,因此可以忽略这些栏位。

DIBSTRUCT的最後两个栏位储存左右移位值,这些值用於处理16位元和32位元DIB的颜色遮罩。我们将在第十五章讨论这些移位值。

让我们再回来看一下DIBSTRUCT的第一个栏位。正如我们所看到的一样,在开始建立DIB时,此栏位设定为指向一个指标阵列的指标,该阵列中的每个指标都指向DIB中的一行图素。这些指标允许以更快的方式来获得DIB图素位元,同时也被定义,以便顶行可以首先引用DIB图素位元。此阵列的最後一个元素-引用DIB图像的最底行-通常等於DIBSTRUCT的pBits栏位。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
4,760.010ms