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

时间:2013-08-23 17:30:25

标签: c++ windows gdi

我遇到了一个修复问题,我允许打印充满洪水的物体......

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

1 个答案:

答案 0 :(得分:1)

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

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

感谢您的帮助!