Dry StretchBltROP EngStretchBltROP Dry TextOut Eng TextOut DryStrokePath EngStrokePath DryFillPath ng ipaTh DryStrokeAndfillPath EngStrokeAndFillPath Dryline Englineto rv t Eng Bits DrvAlphablend EngAlphablend DryGradientfill EngGradientFill DrvTransparentblt Eng transparentblt 2.3GDI支持的服务 GDⅠ输出许多服务例程,能简化驱动程序的设计。驱动程序能够直接调用这些例程。 通常图形引擎服务例程的名字以Eng开头。与特殊的对象相关的服务例程总是用对象的名字 开头;例如,CLIP0 BJ cEnumStart是一个 CLIPOBJ服务 注意第一个参数是用户对象的指针的任务例程,是用户对象的方法和使用通常的C++ 惯例调用。因此,用C++写的驱动程序能作为方法访问服务例程 这些服务例程有以下几类: 表面管理 调色板服务 路径服务 绘图服务 字体和文本服务 第3章“支持倗”描述了DDI的入口点,并解释许多这些服务例程能用来帮助驱动 程序实现入口点。每个服务函数的详细描述参见在线DDK 2.3.1GDI对表面的支持 对每个PDEV,驱动程序必须支持 Dry EnableSurface函数。 Dry Enablesurface建立要 绘制的表面并将其和PDEV相关。驱动程序也必须支持 DryDisablesurface函数停止创建的 表面。因为GDⅠ创建和维护表面,驱动程序依赖几个GDI服务函数(在下页的表中列出)实 现启用和禁止表面 函数名 用途 EngAssociate Surface用PDEV相关一个表面并定义驱动程序编写者要hook 的那个表面的绘图操作。它使用PDEV缺省的调色板 和方式步骤。驱动程序在 Dry Enablesurface的执行 过程中必须对主表面进行调用。当驱动程序在锁定表 面进行写之前启用第二个表面时,也必须进行这个调 EngCheckAbort (仅针对打印机)使打印机驱动程序能够测定打印机 的工作是否已经结東 11
11 DrvStretchBltROP EngStretchBltROP DrvTextOut EngTextOut DrvStrokePath EngStrokePath DrvFillPath EngFillPath DrvStrokeAndFillPath EngStrokeAndFillPath DrvLineTo EngLineTo DrvCopyBits EngCopyBits DrvAlphaBlend EngAlphaBlend DrvGradientFill EngGradientFill DrvTransparentBlt EngTransparentBlt 2.3 GDI 支持的服务 GDI 输出许多服务例程,能简化驱动程序的设计。驱动程序能够直接调用这些例程。 通常图形引擎服务例程的名字以 Eng 开头。与特殊的对象相关的服务例程总是用对象的名字 开头;例如,CLIPOBJ_cEnumStart 是一个 CLIPOBJ 服务。 注意 第一个参数是用户对象的指针的任务例程,是用户对象的方法和使用通常的 C++ 惯例调用。因此,用 C++写的驱动程序能作为方法访问服务例程。 这些服务例程有以下几类: ▪ 表面管理 ▪ 调色板服务 ▪ 路径服务 ▪ 绘图服务 ▪ 字体和文本服务 第 3 章“支持 DDI”描述了 DDI 的入口点,并解释许多这些服务例程能用来帮助驱动 程序实现入口点。每个服务函数的详细描述参见在线 DDK。 2.3.1 GDI 对表面的支持 对每个 PDEV,驱动程序必须支持 DrvEnableSurface 函数。DrvEnableSurface 建立要 绘制的表面并将其和 PDEV 相关。驱动程序也必须支持 DrvDisableSurface 函数停止创建的 表面。因为 GDI 创建和维护表面,驱动程序依赖几个 GDI 服务函数(在下页的表中列出)实 现启用和禁止表面。 函数名 用途 EngAssociateSurface 用 PDEV 相关一个表面并定义驱动程序编写者要 hook 的那个表面的绘图操作。它使用 PDEV 缺省的调色板 和方式步骤。驱动程序在 DrvEnableSurface 的执行 过程中必须对主表面进行调用。当驱动程序在锁定表 面进行写之前启用第二个表面时,也必须进行这个调 用。 EngCheckAbort (仅针对打印机)使打印机驱动程序能够测定打印机 的工作是否已经结束
EngCreateBitmap创建一个标准格式DIB。在这种类型表面上GDI能够 执行所有绘图操作 EngCreateDeviceBitmap创建一个DDB,驱动程序在上面绘图是可靠的(虽然 也可创建一个DIB,在这种情况下驱动程序能够回调 以使GDI在上面绘图 EngCreateDevice Surfac创建一个设备管理表面。驱动程序为这个表面管理某 些绘图操作是可靠的。此函数又返回一个驱动程序管 理句柄 EngDeleteSurface 删除一个表面(DIB,DDB,或设备管理表面) 青除 在表面上用给定的颜色填充指定的矩形,有效地清 表面。调用这个函数仅可清除一个GDI位图表面。 EngLockSurface 通过创建表面的一个用户对象( SURFOBJ)使驱动程 序访问已创建的表面。(源表面是不锁定的。) EngMarkBandingSurface(仅针对打印机)标记表面为相关的表面。 nlocksurrace 当驱动程序已完成一项绘图操作时释放一个表面(禁 止第二个表面时调用此函数) 这些函数更详细的内容,请参考在线DDK 2.3.2GDI支持的调色板 GDI可以做大多数有关调色板管理的工作。当GDI调用 Dry Enablepdev函数,驱动程 序把缺省的调色板作为 DEVINFO结构的一部分返回到GDI。驱动程序必须用 EngCreatePalette函数创建这个调色板 调色板有效地把32位颜色索引映射到24位RGB颜色值,这是GDI使用调色板的方法 驱动程序指定其调色板,这样GDⅠ能确定不同的颜色索引如何在设备上出现。 驱动程序只要使用GDI提供的 XLATEOBJ,就不需要处理大多数调色板操作和计算 如果设备支持可改变的调色板,必须实现 Dry palette函数。当应用为设备改变调 色板并把作为结果的新调色板传递给驱动程序时,GDI调用 DrySet palette。驱动程序要设 置内部的硬件调色板,尽可能地匹配新调色板。 可以用下表列出的两种格式为GDI定义调色板 调色板格式 Indexed 个颜色索引是RGB值的数组的一个索引。这一数组 可以是小的,例如,包括16个颜色索引;或者是大 的,例如,包括4096个颜色索引,甚至更多 it fields 颜色索引里的位域依据每一种颜色里R、G和B的数 量指定颜色。例如,5位能够用来为每一种颜色提供 0和31之间的一个值。当转换为RGB时,每个部分的 5位的值将放大到包括0255的范围。(通常RGB代表 自己是由位域定义的) 相反,GDⅠ一般使用调色板映射。也就是说,应用指定一个RGB颜色进行绘图,并且 GDI必须指定设备显示的颜色索引的地址。就像下表指出的,GDI提供两种主要的调色板服 务函数用来创建和删除调色板,以及一些与 PALOBJ和 XLATEOBJ有关的服务函数用于在两个 调色板之间转换颜色索引
12 EngCreateBitmap 创建一个标准格式 DIB。在这种类型表面上 GDI 能够 执行所有绘图操作。 EngCreateDeviceBitmap 创建一个 DDB,驱动程序在上面绘图是可靠的(虽然 也可创建一个 DIB,在这种情况下驱动程序能够回调 以使 GDI 在上面绘图。 EngCreateDeviceSurfac e 创建一个设备管理表面。驱动程序为这个表面管理某 些绘图操作是可靠的。此函数又返回一个驱动程序管 理句柄。 EngDeleteSurface 删除一个表面(DIB,DDB,或设备管理表面) EngEraseSurface 在表面上用给定的颜色填充指定的矩形,有效地清除 表面。调用这个函数仅可清除一个 GDI 位图表面。 EngLockSurface 通过创建表面的一个用户对象(SURFOBJ)使驱动程 序访问已创建的表面。(源表面是不锁定的。) EngMarkBandingSurface (仅针对打印机)标记表面为相关的表面。 EngUnlockSurface 当驱动程序已完成一项绘图操作时释放一个表面(禁 止第二个表面时调用此函数) 这些函数更详细的内容,请参考在线 DDK。 2.3.2 GDI 支持的调色板 GDI 可以做大多数有关调色板管理的工作。当 GDI 调用 DrvEnablePDEV 函数,驱动程 序把缺省的调色板作为 DEVINFO 结构的一部分返回到 GDI 。驱动 程序必须用 EngCreatePalette 函数创建这个调色板。 调色板有效地把 32 位颜色索引映射到 24 位 RGB 颜色值,这是 GDI 使用调色板的方法。 驱动程序指定其调色板,这样 GDI 能确定不同的颜色索引如何在设备上出现。 驱动程序只要使用 GDI 提供的 XLATEOBJ,就不需要处理大多数调色板操作和计算。 如果设备支持可改变的调色板,必须实现 DrvSetPalette 函数。当应用为设备改变调 色板并把作为结果的新调色板传递给驱动程序时,GDI 调用 DrvSetPalette。驱动程序要设 置内部的硬件调色板,尽可能地匹配新调色板。 可以用下表列出的两种格式为 GDI 定义调色板。 调色板格式 描述 Indexed 一个颜色索引是 RGB 值的数组的一个索引。这一数组 可以是小的,例如,包括 16 个颜色索引;或者是大 的,例如,包括 4096 个颜色索引,甚至更多。 Bit Fields 颜色索引里的位域依据每一种颜色里 R、G 和 B 的数 量指定颜色。例如,5 位能够用来为每一种颜色提供 0 和 31 之间的一个值。当转换为 RGB 时,每个部分的 5 位的值将放大到包括 0~255 的范围。(通常 RGB 代表 自己是由位域定义的) 相反,GDI 一般使用调色板映射。也就是说,应用指定一个 RGB 颜色进行绘图,并且 GDI 必须指定设备显示的颜色索引的地址。就像下表指出的,GDI 提供两种主要的调色板服 务函数用来创建和删除调色板,以及一些与 PALOBJ 和 XLATEOBJ 有关的服务函数用于在两个 调色板之间转换颜色索引
函数 描述 EngCreatePalette 创建一个调色板。驱动程序通过给 DEV INFO结构里的 调色板返回一个句柄使设备和调色板相联系。 EngDeletePalette 删除给定的调色板。 PALOBJ cGetColors 允许驱动程序从从一个索引的调色板下载RBG颜色 它由显示驱动程序在 DrySetPalette函数中调用 XLATEOBJ iXlate 从一个源颜色索引转换到目的颜色索引 XLATEOBJ biVector 从一个索引的源调色板中检索转换向量。驱动程序能 使用这个向量完成其自身从源索引到目的索引的转 换 XLATEOBJ cGetPalette在一个索引的源调色板中检索24位RGB颜色或颜色 的位域格式驱动程序能使用这个函数从调色板获得 信息执行颜色混合。 这些函数更详细的内容,请参考在线DDK。 2.3.3路径的GDI服务 为帮助矢量设备填充复杂的区域,驱动程序能调用创建、修改和计算路径的引擎函数 这些函数在下表列出。驱动程序通过 PATHOBJ结构访问路径。 DI路径服务函数 EngCreatePath 为驱动程序的临时使用分配一个路径。驱动程序在从 当前的绘图调用返回GDI之前要删除这个路径 EngDeletePath 删除通过 EngCreatePath函数创建的路径。 PATHOBJ VGetBounds 返回路径的一个混合矩形。 PATHOBJ vEnumStart 通知 PATHOBJ驱动程序将调用 PATHOB bEnum用指定 的路径计算曲线。这个函数假设计算重新开始时必须 要调用 PatHo bEnum 从路径检索下一个 PATHDATA记录。每个记录描述了 个子路径的全部或部分 PATHOBJ vEnumStartCliplines允许驱动程序请求相对一个 PATHOBJ要裁剪的直线 当裁剪区比一个矩形更复杂时是有用的 PaTHOBJ bEnumClipLines 从路径计算已裁剪的直线段 PatHO mOvetO 在一个已定义的 PATHOBJ路径里改变现有的位置 PathoBJ pLoy to 在一个已定义的 PATHOBJ路径里绘制直线 PaTHOBJ bPloy BezierTo 在一个已定义的 PATHOBJ路径里绘制贝塞尔曲线 patho bCloseFigure通过正绘制的一条直线回至起始点关闭路径 这些函数更详细的内容,请参考在线DDK 2.3.4GDI绘图服务及其他 为了支持 CLIPOBJ, BRUSHOB J,和 XFORMOBJ结构,GDI提供几种绘图服务(在下页的 表中列出)此外GDI模拟在前面 hooking对 punting中描述 GDI绘图服务函数 描述
13 函数 描述 EngCreatePalette 创建一个调色板。驱动程序通过给 DEVINFO 结构里的 调色板返回一个句柄使设备和调色板相联系。 EngDeletePalette 删除给定的调色板。 PALOBJ_cGetColors 允许驱动程序从从一个索引的调色板下载 RBG 颜色。 它由显示驱动程序在 DrvSetPalette 函数中调用。 XLATEOBJ_iXlate 从一个源颜色索引转换到目的颜色索引 XLATEOBJ_piVector 从一个索引的源调色板中检索转换向量。驱动程序能 使用这个向量完成其自身从源索引到目的索引的转 换。 XLATEOBJ_cGetPalette 在一个索引的源调色板中检索 24 位 RGB 颜色或颜色 的位域格式驱动程序能使用这个函数从调色板获得 信息执行颜色混合。 这些函数更详细的内容,请参考在线 DDK。 2.3.3 路径的 GDI 服务 为帮助矢量设备填充复杂的区域,驱动程序能调用创建、修改和计算路径的引擎函数; 这些函数在下表列出。驱动程序通过 PATHOBJ 结构访问路径。 GDI 路径服务函数 描述 EngCreatePath 为驱动程序的临时使用分配一个路径。驱动程序在从 当前的绘图调用返回 GDI 之前要删除这个路径。 EngDeletePath 删除通过 EngCreatePath 函数创建的路径。 PATHOBJ_vGetBounds 返回路径的一个混合矩形。 PATHOBJ_vEnumStart 通知 PATHOBJ 驱动程序将调用 PATHOBJ_bEnum 用指定 的路径计算曲线。这个函数假设计算重新开始时必须 要调用。 PATHOBJ_bEnum 从路径检索下一个 PATHDATA 记录。每个记录描述了 一个子路径的全部或部分。 PATHOBJ_vEnumStartClipLines 允许驱动程序请求相对一个 PATHOBJ 要裁剪的直线。 当裁剪区比一个矩形更复杂时是有用的。 PATHOBJ_bEnumClipLines 从路径计算已裁剪的直线段 PATHOBJ_bMoveTo 在一个已定义的 PATHOBJ 路径里改变现有的位置 PATHOBJ_bPloyLineTo 在一个已定义的 PATHOBJ 路径里绘制直线 PATHOBJ_bPloyBezierTo 在一个已定义的 PATHOBJ 路径里绘制贝塞尔曲线 PATHOBJ_bCloseFigure 通过正绘制的一条直线回至起始点关闭路径 这些函数更详细的内容,请参考在线 DDK。 2.3.4 GDI 绘图服务及其他 为了支持 CLIPOBJ,BRUSHOBJ,和 XFORMOBJ 结构,GDI 提供几种绘图服务(在下页的 表中列出)此外 GDI 模拟在前面 hooking 对 punting 中描述。 GDI 绘图服务函数 描述
Eng CreateClip 为驱动程序的临时使用分配一个 CLIPOBJ。当不再需要它时 驱动程序调用 EngDeleteClip函数删除它 EngDeleteClip 用 Eng CreateClip函数删除已分配的 CLIPOB EngBitBlt Drybitblt函数的GDI模拟 EngCopy Bits DrvCopy Bits函数的GDI模拟 EngstretchBlt Dry StretchBlt函数的GDI模拟 EngFillPath DryFillPath函数的GDI模拟 EngStrokeAndFillPath DryStrokeAndFillPath函数的GDI模拟 EngStrokePath DryStrokepath函数的GDI模拟 Englineto Drylinetot函数的GDI模拟 BRUSHOBJ pVAllocRbrush为实现驱动程序的画刷分配存储器 BRUSHOBJ pvGetrbrush为实现驱动程序的画刷返回一个指针;如果还没有实现画刷 就实现画刷 CLIPOBJ cEnumStart 在已裁剪的全部或部分区域里为矩形的计算设定参数。(没 有调用这个函数时能够计算一次这个区域,但是随后的计算 需要使用这个函数。) CLIPob bEnum 从裁剪区域恢复大量矩形 CLIPOBJ ppoGetPath 作为路径用来恢复复杂的区域。 这些函数更详细的内容,请参考在线DDK 2.3.5GDI字体和文本服务 GDⅠ提供对字体管理和文本输出的支持。 FONTOBJ结构和相关函数允许驱动程序访问 个字体的特定实例。为了支持文本输出,驱动程序访问 STROBJ结构和相关函数。下表列 出了 FONTOBJ和 STROBJ相关的函数 函数 描述 GDI模拟 DrvTextout函数 ExtOut FoNTOBJ cGetAllGlyphHandles允许驱动程序恢复GDⅠ字体的每一个字形句柄。驱动程序使 用这个服务下载全部字体。 FONTOBJ vGetInfo 返回描述已分配字体的信息 FONTOBJ cGetGlyph 为字体使用者把字形句柄翻译成指针给已分配的字形数据 到下一次调用 FontoBJ cGetGlyphs之前这些指针均有效。 FONTOBJ pQueryGlyphAttrs 返回有关字体字形的信息。 FONTOBJ pXOGetXform 为相关的字体恢复从抽象到设备的转换。这个转换要求驱动 程序实现一个驱动程序提供的字体。 FONTOBJ pifi 取得一个到描述相关字体的 IFIMETRICS结构的指针。 FontOBJ pvTrue TypeFontFile取得一个到与 TrueType字体相关的ROM映射 TrueType文件 的指针 STROBJ vEnumStart 为指定的 STROBJ结构重新计算 GLYPHPO数组。驱动程序要 在随后的计算之前调用这个函数 STROBJ bEnum 在指定的 STROBJ中计算字体轮廓一致性和位置 StROB dwGetCodePage返回与指定的 STROB J相关的代码页 这些函数更详细的内容,请参考在线DDK 2.3.6GDI支持的服务及其他
14 EngCreateClip 为驱动程序的临时使用分配一个 CLIPOBJ。当不再需要它时 驱动程序调用 EngDeleteClip 函数删除它。 EngDeleteClip 用 EngCreateClip 函数删除已分配的 CLIPOBJ EngBitBlt DrvBitBlt 函数的 GDI 模拟 EngCopyBits DrvCopyBits 函数的 GDI 模拟 EngStretchBlt DrvStretchBlt 函数的 GDI 模拟 EngFillPath DrvFillPath 函数的 GDI 模拟 EngStrokeAndFillPath DrvStrokeAndFillPath 函数的 GDI 模拟 EngStrokePath DrvStrokePath 函数的 GDI 模拟 EngLineTo DrvLineTot 函数的 GDI 模拟 BRUSHOBJ_pvAllocRbrush 为实现驱动程序的画刷分配存储器。 BRUSHOBJ_pvGetRbrush 为实现驱动程序的画刷返回一个指针;如果还没有实现画刷 就实现画刷。 CLIPOBJ_cEnumStart 在已裁剪的全部或部分区域里为矩形的计算设定参数。(没 有调用这个函数时能够计算一次这个区域,但是随后的计算 需要使用这个函数。) CLIPOBJ_bEnum 从裁剪区域恢复大量矩形。 CLIPOBJ_ppoGetPath 作为路径用来恢复复杂的区域。 这些函数更详细的内容,请参考在线 DDK。 2.3.5 GDI 字体和文本服务 GDI 提供对字体管理和文本输出的支持。FONTOBJ 结构和相关函数允许驱动程序访问 一个字体的特定实例。为了支持文本输出,驱动程序访问 STROBJ 结构和相关函数。下表列 出了 FONTOBJ 和 STROBJ 相关的函数。 函数 描述 EngT ExtOut GDI 模拟 DrvTextOut 函数 FONTOBJ_cGetAllGlyphHandles 允许驱动程序恢复 GDI 字体的每一个字形句柄。驱动程序使 用这个服务下载全部字体。 FONTOBJ_vGetInfo 返回描述已分配字体的信息。 FONTOBJ_cGetGlyphs 为字体使用者把字形句柄翻译成指针给已分配的字形数据。 到下一次调用 FONTOBJ_cGetGlyphs 之前这些指针均有效。 FONTOBJ_pQueryGlyphAttrs 返回有关字体字形的信息。 FONTOBJ_pxoGetXform 为相关的字体恢复从抽象到设备的转换。这个转换要求驱动 程序实现一个驱动程序提供的字体。 FONTOBJ_pifi 取得一个到描述相关字体的 IFIMETRICS 结构的指针。 FONTOBJ_pvTrueTypeFontFile 取得一个到与TrueType字体相关的ROM映射TrueType文件 的指针。 STROBJ_vEnumStart 为指定的 STROBJ 结构重新计算 GLYPHPOS 数组。驱动程序要 在随后的计算之前调用这个函数。 STROBJ_bEnum 在指定的 STROBJ 中计算字体轮廓一致性和位置。 STROBJ_dwGetCodePage 返回与指定的 STROBJ 相关的代码页。 这些函数更详细的内容,请参考在线 DDK。 2.3.6 GDI 支持的服务及其他
GDⅠ给驱动程序编写者提供了多种一般的支持服务,包括装载、读取、操作数据文件 的能力,以及分配内核模式和用户模式的存储器 2.4浮点数支持 内核模式图形驱动程序在调用GDI提供的 Eng SaveFloatingPointState和 EngRestoreFloatingPointState例程之间必须进行所有的浮点操作。 如果硬件有一个浮点处理器,驱动程序能够直接做浮点操作。另外,驱动程序能使用 GDI的 FLOATOBJ服务来计算浮点操作。不考虑处理器类型,当声明浮点值时,驱动程序要 使用 FLOAT数据类型。 2.5数据类型 下表中定义的数据类型在设备驱动程序接口里出现。这些数据类型中的几个在前面 GDI用户对象里描述过。指针型数据类型用星号(*)标记 变量前缀名定义 BOOL 以是TRUE或 FALSE的32位值 BYTE 8位无符号整数 BRUSHOBJ* 指向画刷对象的指针 CLIPLINE 裁剪线对象 CLIPOBJ pco 裁剪对象的指针 DHPDEV dhpe 由设备驱动程序定义的32位句柄。它识别一个物理设备。 DHSURF dhsurf 由设备驱动程序定义的32位句柄。它识别一个设备管理 定点数 FLOATL 点数 FLOAT-LONG el 32位溢出值,依据上下文解释成LONG或 FLOAT 32位标志的设定 FONTOB J* fo 字体对象的指针 FSHORT 6位标志的设定 hbm 由GDI定义能识别位图的32位句柄 HPAL 由GDI定义能识别调色板的32位句柄 HSURF surf 由GDI定义能识别表面的32位句柄 LONG 32位有符号整数 X 32位数量,它的低16位定义前景和背景的混合模式 PALOBJ=k palo 调色板对象指针 PATHOB J=* 路径对象指针 POINTE 由{ FLOAT X,y;}组成的小数点结构 POINTFX 由{FIXx,y;}组成的小数点结构 POINTL 由{ LONG X,y;}组成的小数点结构 PWSZ pws 以0结束的 Unicode字符串的指针 没有定义数据类型的VOID指针 RECTL 由{ LONG XLeft,yTop, xRight, y tom;}组成的矩形结构 RECTFX f 由{ FIX XLeft,yTop, xRight, yBot tom;}组成的矩形结构
15 GDI 给驱动程序编写者提供了多种一般的支持服务,包括装载、读取、操作数据文件 的能力,以及分配内核模式和用户模式的存储器。 2.4 浮点数支持 内核模式图形驱动程序在调用 GDI 提供的 EngSaveFloatingPointState 和 EngRestoreFloatingPointState 例程之间必须进行所有的浮点操作。 如果硬件有一个浮点处理器,驱动程序能够直接做浮点操作。另外,驱动程序能使用 GDI 的 FLOATOBJ 服务来计算浮点操作。不考虑处理器类型,当声明浮点值时,驱动程序要 使用 FLOAT 数据类型。 2.5 数据类型 下表中定义的数据类型在设备驱动程序接口里出现。这些数据类型中的几个在前面 GDI 用户对象里描述过。指针型数据类型用星号(*)标记。 DDI 数据类型 变量前缀名 定义 BOOL b 可以是 TRUE 或 FALSE 的 32 位值 BYTE j 8 位无符号整数 BRUSHOBJ* pbo 指向画刷对象的指针 CLIPLINE cl 裁剪线对象 CLIPOBJ pco 裁剪对象的指针 DHPDEV dhpdev 由设备驱动程序定义的 32 位句柄。它识别一个物理设备。 DHSURF dhsurf 由设备驱动程序定义的 32 位句柄。它识别一个设备管理 表面。 FIX fix 定点数 FLOATL e 浮点数 FLOAT-LONG el 32 位溢出值,依据上下文解释成 LONG 或 FLOAT FLONG fl 32 位标志的设定 FONTOBJ* pfo 字体对象的指针 FSHORT fs 16 位标志的设定 HBM hbm 由 GDI 定义能识别位图的 32 位句柄 HPAL hpal 由 GDI 定义能识别调色板的 32 位句柄 HSURF hsurf 由 GDI 定义能识别表面的 32 位句柄 LONG l 32 位有符号整数 MIX mix 32 位数量,它的低 16 位定义前景和背景的混合模式 PALOBJ* ppalo 调色板对象指针 PATHOBJ* ppo 路径对象指针 POINTE pte 由{FLOAT x,y;}组成的小数点结构 POINTFX ptfx 由{FIX x,y;}组成的小数点结构 POINTL ptl 由{LONG x,y;}组成的小数点结构 PWSZ pwsz 以 0 结束的 Unicode 字符串的指针 PVOID pv 没有定义数据类型的 VOID 指针 RECTL rcl 由{LONG xLeft,yTop,xRight,yBottom;}组成的矩形结构 RECTFX rcfx 由{FIX xLeft,yTop,xRight,yBottom;}组成的矩形结构