【问题标题】:BitBlt issues with Memory DC created from printer DC从打印机 DC 创建的内存 DC 的 BitBlt 问题
【发布时间】:2013-09-12 04:40:30
【问题描述】:

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

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

【问题讨论】:

  • “一两个像素大”是什么意思?您看到了什么结果?
  • 对不起,直到今天我才看到你的帖子 这里是一个 PDF 打印的链接,我直接画到打印机 DC:link 和这里是一样的,但我画到内存DC 然后 BitBlt 到打印机 DC:link 现在,我确实在 2 号启用了递归洪水填充功能,以展示我们试图实现的示例,您可以看到,bttm 和右边缘被切断,我也担心字体和线宽的差异,但没有尺寸不匹配那么严重谢谢,Scott
  • 您明确将矩形设置为比大小大 1。为什么你会惊讶于它会变大 1 像素?
  • 是的,我试过了,以防万一,同样的结果发生了,但我留下+ 1的原因是这是绘制整个矩形的正确方法:{0, 0, iWidthLP, iHeightLP},因为“ FillRect...函数包括左边框和上边框,但不包括矩形的右边框和下边框。"来源:MSDN: FillRect

标签: c++ windows gdi


【解决方案1】:

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

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

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多