【发布时间】:2017-07-08 00:22:15
【问题描述】:
我有一个 32 位整数数组形式的位图图像(ARGB 像素:uint32 *mypixels)和int width 和int height。我需要将它们输出到打印机。
我有打印机上下文:HDC hdcPrinter;
据我所知,我首先需要创建一个兼容的上下文:
HDC hdcMem = CreateCompatibleDC(hdcPrinter);
然后我需要创建一个HBITMAP 对象,将其选择到兼容的上下文中,然后渲染:
HBITMAP hBitmap = ...?
SelectObject(hdcMem, hBitmap);
BitBlt(printerContext, 0, 0, width, height, hdcMem, 0, 0, SRCCOPY);
最后清理一下:
DeleteObject(hBitmap);
DeleteDC(hdcMem);
我的问题是如何创建一个HBITMAP 对象并将mypixels 放入其中?
我找到了两个选择:
-
HBITMAP hBitmap = CreateCompatibleBitmap(hdcPrinter, width, height);看起来不错,但是
mypixels怎么进入这个位图呢? -
HBITMAP hBitmap = CreateDIBSection(hdcPrinter /*or hdcMem?*/, ...);它会起作用吗?它比选项 1 更好吗?
【问题讨论】:
-
您可以在CreateCompatibleBitmap 之后使用或SetDIBits - 或者更好地在单个调用CreateDIBitmap 中执行此操作 -
creates a compatible bitmap (DDB) from a DIB and, optionally, sets the bitmap bits -
很多方法,重要的是它来自哪里。基本上来自文件、资源、内存位置。您必须关注位图的来源,代码 sn-p 会自动从任何基本的 Google 查询中弹出。请注意代码中的错误,您永远不能忽略 SelectObject() 的返回值。必须恢复设备上下文,否则会导致内存泄漏。强烈建议使用库来执行此操作,这也有助于避免使用谷歌搜索。