Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从打印机DC创建的内存DC出现BitBlt问题_C++_Windows_Gdi - Fatal编程技术网

C++ 从打印机DC创建的内存DC出现BitBlt问题

C++ 从打印机DC创建的内存DC出现BitBlt问题,c++,windows,gdi,C++,Windows,Gdi,我有一个问题,我做了一个修复,允许洪水填充的对象被打印 所以,整个故事是我们在使用windows GDI泛光填充功能,我们注意到它在打印机上不起作用,所以我在inet上找到的是创建一个与打印机DC兼容的内存DC,并在内存DC上进行所有绘图操作,然后将其一次全部BitBlt到打印机DC(由于内存DC只允许主DC所做的事情,我不得不更改为使用递归的、颜色替换的泛光填充函数) 问题是,内存DC在x和y上似乎大了一两个像素,但我不知道该怎么办,当我从内存DC获取选定位图时,它显示它的大小是正确的,我想使

我有一个问题,我做了一个修复,允许洪水填充的对象被打印

所以,整个故事是我们在使用windows GDI泛光填充功能,我们注意到它在打印机上不起作用,所以我在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:

这里是相同的,但我将其绘制到内存DC,然后将其BitBlt到打印机DC:

现在,我在第二节中启用了递归洪水填充函数,以展示我们正在尝试实现的一个示例,没有它,它也会这样做,所以这不是一个问题

正如您所看到的,底部和右侧边缘被切断,我还担心两者之间字体和线宽的差异,但没有大小不匹配那么大


注意:顶部打印的文件名不会经过内存DC,它总是直接绘制到打印机DC

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

我只使用内存DC作为需要递归泛洪填充(GetPixel和SetPixel)的项目的中间人,因此我首先将它们绘制到内存DC,将其全部复制到打印机DC,然后将其他所有内容直接绘制到打印机DC,似乎工作正常


谢谢你的帮助!

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