gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:27:45 28 4
gpt4 key购买 nike

我对允许打印填充填充对象的修复有疑问...

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com