BitBlt与从打印机DC创建的内存DC有关
BitBlt issues with Memory DC created from printer DC
我为允许打印泛洪填充对象而进行的修复有问题。。。
所以,完整的故事是,我们使用的是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++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 无论使用内存DC和BitBlit,GDI中都会闪烁
- 选择内存 DC 上的对象
- 内存中的 GDI+ DC 始终为单色
- BitBlt与从打印机DC创建的内存DC有关
- GDI+只在内存DC上绘制单色
- 如何创建每像素24位的内存DC