使用GDI+绘制,打印时透明图片出现bug,图片没有透明效果,背后的内容不见了

Rabbit 0 信誉分
2025-01-16T07:54:47.84+00:00

使用GDI+绘制透明的,细小的虚线,然后绘制透明图片,当两者相交的时候,打印为XPS,效果不对。

上面为在窗口绘制的正确的效果,下面为打印为xps时有问题的效果:

用户的图像

关键代码如下:

/*
尝试了几个改动,任意一个改动,都可以使得问题不重现:
1. 把画笔大小改大
2. 把画笔颜色的透明度去掉
3. 错开矩形和图片,不要交叉
*/
void Draw(HDC hdc)
{
	Graphics graphics(hdc);

	// Draw a semi-transparent red dashed rectangle
	Pen pen(Color(128, 255, 0, 0), 1);
	pen.SetDashStyle(DashStyleDash);
	graphics.DrawRectangle(&pen, 50, 50, 200, 100);

	// Load image from file
    Bitmap* pBmp = Bitmap::FromFile(L"text.png", 0);
    if (pBmp)
	{
        int format = pBmp->GetPixelFormat();
		graphics.DrawImage(pBmp, 150, 10, pBmp->GetWidth(), pBmp->GetHeight());
		delete pBmp;
        pBmp = NULL;
	}
}

void userPrinterPrint()
{
	PRINTDLG pd;
	ZeroMemory(&pd, sizeof(pd));
	pd.lStructSize = sizeof(pd);
	pd.Flags = PD_RETURNDC;
	pd.hwndOwner = NULL;

	if (PrintDlg(&pd))
	{
		HDC hdcPrinter = pd.hDC;
		DOCINFO di;
		ZeroMemory(&di, sizeof(di));
		di.cbSize = sizeof(di);
		di.lpszDocName = TEXT("GDI+ Print Document");

		if (StartDoc(hdcPrinter, &di) > 0)
		{
			if (StartPage(hdcPrinter) > 0)
			{
                Draw(hdcPrinter);
				EndPage(hdcPrinter);
			}
			EndDoc(hdcPrinter);
		}
		DeleteDC(hdcPrinter);
	}
}

Windows API - Win32
Windows API - Win32
一组适用于桌面和服务器应用程序的核心 Windows 应用程序编程接口 (API)。 以前称为 Win32 API。
131 个问题
{count} 票

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。