c++ - 从打印机 DC 创建的内存 DC 的 BitBlt 问题

标签 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

最佳答案

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

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

感谢您的帮助!

关于c++ - 从打印机 DC 创建的内存 DC 的 BitBlt 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18408576/

相关文章:

c++ - c++17 中的 STL 容器是否有三向比较

c++ - fopen64/fseeko64 和 c++ 11

C++ REG_SZ 到 char* 并在没有提升权限的情况下读取 HKLM

c++ - 为什么 Windows 上的 C++ 类定义通常在 'class' 之后有一个宏标记?

c - 尝试追踪 archLinux64 下的内存分配错误

delphi - 为什么当 LineTo 成功时 FillRect 不绘制?

c++ - 如何避免控件在 CDialog 中闪烁(MFC C++)

c++ - 创建一个包含 30 亿个 uint8 元素的 vector

c++ GDI打印导致系统卡住

c++ - 支持重载运算符的不同类型?