BitBlt与从打印机DC创建的内存DC有关

BitBlt issues with Memory DC created from printer DC

本文关键字:DC 内存 有关 创建 BitBlt 打印机      更新时间:2023-10-16

我为允许打印泛洪填充对象而进行的修复有问题。。。

所以,完整的故事是,我们使用的是windows GDI FloodFill函数,我们注意到它在打印机上不起作用,所以我在inet上发现的是创建一个与打印机DC兼容的内存DC,并在内存DC上进行所有绘图操作,然后一次将其全部BitBlt到打印机DC(我也不得不更改为使用递归的颜色替换洪水填充函数,因为存储器DC只允许主DC所做的)

问题是内存DC在x和y上似乎大了一两个像素,但我不知道该怎么办,当我从内存DC中获得选定的位图时,它显示它的大小是正确的,我想使用StretchBlt,但我可以访问的值用作StretchBlt的参数,这与调用BitBlt 没有什么不同

如果你需要更多信息,请告诉我。。。

提前感谢!!!

这是我的代码:

HDC hMemPrnDC = CreateCompatibleDC (hPrnDC);
HBITMAP hBitmap = CreateCompatibleBitmap (hPrnDC, iWidthLP, iHeightLP);
HBITMAP hOldBitmap = SelectBitmap (hMemPrnDC, hBitmap);
    // paint the whole memory DC with the window color
HBRUSH hBrush = CreateSolidBrush (GetSysColor (COLOR_WINDOW));
RECT rect;
    // add one to right and bottom, FillRect doesnt include the right and bottom edges
SetRect (&rect, 0, 0, iWidthLP + 1, iHeightLP + 1);
    // NOTE: im doing this cause it starts out as all black
FillRect (hMemPrnDC, &rect, hBrush);
    // delete object
DeleteBrush (hBrush);
//
// do all my MoveToEx, LineTo, Ellipse, Arc, TextOut,
// SetPixel, etc calls on hMemPrnDC here
//
    // copy all the memory DC drawing data to the printer DC
BitBlt (hPrnDC, 0, 0, iWidthLP, iHeightLP, hMemPrnDC, 0, 0, SRCCOPY);
    // select old bitmap, and clean up objects
SelectBitmap (hMemPrnDC, hOldBitmap);
DeleteBitmap (hBitmap);
DeleteDC (hMemPrnDC);
hMemPrnDC = NULL;

更新(9月5日):

这里有一个PDF打印的链接,我可以直接绘制到打印机DC:hPrnDC.pdf

这里是相同的,但我画到存储器DC,然后BitBlt它到打印机DC:hMemPrnDC.pdf

现在,我确实在第二个例子中启用了递归洪泛填充函数,以展示我们正在努力实现的目标,如果没有它,它也会这样做,所以这不是的问题

正如你所看到的,底部和右侧边缘都被切掉了,我也很担心字体的差异;线重介于两者之间,但没有尺寸不匹配那么多

注意:打印在顶部的文件名不会通过内存DC,它总是直接绘制到打印机DC

我找到了解决问题的方法,更多的是解决问题,但它达到了预期的结果。。。

我只使用内存DC作为需要递归泛洪填充的项目(GetPixel和SetPixel)的中间人,所以我首先将它们绘制到内存DC,将其全部复制到打印机DC,然后将其他所有内容直接绘制到打印机DC。似乎工作得很好

谢谢你的帮助!