这里最大的工作实际上是注册窗口类并编写一个最小的窗口过程。但如果这是仅调试代码,您实际上可以跳过该部分。 (我稍后会回到那个)。
如果你有 HBITMAP,那么你可以使用 BitBlt 或 StretchBlt 来绘制它,但如果你还没有图像作为 HBITMAP,那么 StretchDIBits 可能是一个更好的选择,因为你可以如果您只有一个指向位图数据的指针,请使用它。您必须将源矩形和目标矩形、BITMAPINFOHEADER 和指向原始位图数据的指针传递给它。像这样的
SIZE sBmp = { 100, 200 };
LPBITMAPINFOHEADER pbi; // the bitmap header from the file, etc.
LPVOID pvBits; // the raw bitmap bits
StretchDIBits (hdc, 0, 0, sBmp.cx, sBmp.cy,
0, 0, sBmp.cx, sBmp.cy,
pvBits, pbi,
DIB_RGB_COLORS,
SRCCOPY);
那么下一部分是如何让 HDC 进行绘制?对于调试代码,我经常直接在屏幕上绘制。 HDC hdc = GetDC(NULL) 将获得一个可以绘制到屏幕上的 DC,但是存在安全问题,并且它与 Windows Vista 中的 Aero 不一样,因此另一种方法是绘制到窗口上。如果您有一个可以直接绘制的窗口,那么 HDC hdc = GetDC(hwnd) 将起作用。
这样做的好处是您不必创建和显示一个窗口,因此它对代码流的破坏性较小,有助于调试特定问题,但不是那种你可以离开的东西一直在。
对于长期解决方案,您可以创建一个对话框并将位图绘制调用放在对话框的 WM_PAINT 或 WM_ERASEBKGND 消息处理程序中。但我不建议您从不应执行 UI 的深层代码中显示对话框。显示一个窗口,尤其是对话框窗口会干扰应用程序中的正常消息流。如果你想为这个位图查看器使用一个对话框,那么你希望那个对话框窗口是用户显示的东西,如果它在那里,你就可以在上面画画。
如果您无权访问 HINSTANCE,仍然可以显示一个对话框,这只是更多的工作。这是一个不同的问题。