0

我有一个问题,我进行了修复以允许打印充满洪水的对象...

所以,完整的故事是我们使用的是 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

4

1 回答 1

1

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

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

谢谢您的帮助!

于 2013-09-11T20:40:30.247 回答