如何判断打印机驱动程序是不是支持 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_ALPHABLEND
由 EngAssociateSurface
返回
如果支持DrvAlphaBlend
,我如何使用 Win32 API(或通过其他方式)检查?
【问题讨论】:
【参考方案1】:使用GetDeviceCaps
和SHADEBLENDCAPS
然后照顾SB_PIXEL_ALPHA
左右
【讨论】:
GetDeviceCaps(hdc, SHADEBLENDCAPS)
返回的值在任何一种情况下都是NULL
。
"对于打印机,GetDeviceCaps 返回打印机报告的任何内容。" .如果您对hdc
做得很好。
这也是我读到的,但SHADEBLENDCAPS
除了NULL
(或SB_NONE
)之外,我测试过的所有打印机和打印机驱动程序都没有返回,考虑到hdc
是一个有效的 DC,我已经用它同时打印了文件。这个值不可靠。
我没有测试过。但女士做到了
你可以这样做:如果打印机支持混合它有其他选项没有的其他选项,请对此进行一些研究。而是继续这样做以上是关于如何判断打印机驱动程序是不是支持 GDI AlphaBlend?的主要内容,如果未能解决你的问题,请参考以下文章
如何判断Delphi的THeapException是否与堆相关,而不是Windows GDI或其他什么?