如何判断打印机驱动程序是不是支持 GDI AlphaBlend?

Posted

技术标签:

【中文标题】如何判断打印机驱动程序是不是支持 GDI AlphaBlend?【英文标题】:How to tell if a printer driver supports GDI AlphaBlend?如何判断打印机驱动程序是否支持 GDI AlphaBlend? 【发布时间】:2021-10-11 21:08:49 【问题描述】:

当我想在纸上的一些其他图形上打印半透明的 32 bpp 图像时,我正在使用 AlphaBlend 函数,就像我在屏幕上所做的那样。

这适用于某些打印机驱动程序,但不适用于其他打印机驱动程序。如果这不起作用,则使用不透明(白色)背景绘制图像,并且下方的文本或图形不会出现在图像区域中。

同一台打印机的两个驱动程序会产生两种不同的结果。我可以使用下面的代码和下面的解释来区分它们:

char technology[MAX_PATH] = 0;
int escapeCode = GETTECHNOLOGY;
if (ExtEscape(hdc, QUERYESCSUPPORT, sizeof(int), (LPCSTR) &escapeCode, 0, nullptr) > 0)

    if (ExtEscape(hdc, GETTECHNOLOGY, 0, nullptr, MAX_PATH, (LPSTR) technology) > 0)
    
        return technology;
    

一方面,如果technology 包含"http://schemas.microsoft.com/xps/2005/06",则AlphaBlend 正在工作;另一方面,当technology"ESC/P" 时,AlphaBlend 不起作用。

是否有检测此功能的通用方法?

根据https://www.winvistatips.com/threads/trick-to-hooking-drvalphablend-in-printer-driver.178598,打印机驱动程序支持AlphaBlend时:

DrvAlphaBlend 在驱动 DLL 中实现 HOOK_ALPHABLEND 存在于 DrvFuncTable HOOK_ALPHABLENDEngAssociateSurface 返回

如果支持DrvAlphaBlend,我如何使用 Win32 API(或通过其他方式)检查?

【问题讨论】:

【参考方案1】:

使用GetDeviceCapsSHADEBLENDCAPS 然后照顾SB_PIXEL_ALPHA 左右

【讨论】:

GetDeviceCaps(hdc, SHADEBLENDCAPS) 返回的值在任何一种情况下都是NULL "对于打印机,GetDeviceCaps 返回打印机报告的任何内容。" .如果您对hdc 做得很好。 这也是我读到的,但SHADEBLENDCAPS 除了NULL(或SB_NONE)之外,我测试过的所有打印机和打印机驱动程序都没有返回,考虑到hdc是一个有效的 DC,我已经用它同时打印了文件。这个值不可靠。 我没有测试过。但女士做到了 你可以这样做:如果打印机支持混合它有其他选项没有的其他选项,请对此进行一些研究。而是继续这样做

以上是关于如何判断打印机驱动程序是不是支持 GDI AlphaBlend?的主要内容,如果未能解决你的问题,请参考以下文章

如何判断Delphi的THeapException是否与堆相关,而不是Windows GDI或其他什么?

GDI

GDI+ 基础知识[1]

如何在 C++/MFC/GDI 中创建一个非常大的位图

如何获取传递给 DrvEnablePDEV 的属于 GDI 引擎的“逻辑设备句柄”HDEV?

如何在纯 C++ 中高效快速地清理我的 GDI 对象 - winapi(不是 .net,c#)?