C ++ Win32,显示带位图的窗口的最简单方法

时间:2010-02-16 00:31:56

标签: c++ winapi bitmap gdi

这仅用于“调试”目的,因此我不想花费大量时间来处理这个问题,也不是非常重要。该程序将数据导出为png,jpg,svg等... - 这并不是什么大不了的事,尽管在生成图像时看到它可能会很好。此外,该程序将用于Linux服务器;但是我会将这个'功能'限制在Win版本中。

我也不想使用库,除非它非常非常轻便(我使用了CImg一段时间,但我对它的速度不是很满意,所以我最后自己写了重要的函数并直接使用libjpeg和libpng。)

我的图像采用ARGB格式(32bpp),虽然转换格式根本不会成为问题。我想使用Win32,从代码内部的函数创建窗口(没有已知的hInstance等),并编写位图。希望快速而简单。

但我不知道win32api足够了。我已经看到绘制(GDI)的唯一选择是通过HBITMAP对象...我可以依赖的任何代码片段或示例?我可能不会忽视任何考虑因素?或者也许 - 考虑我的时间限制 - 我应该忘记它吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

这里最重要的工作是实际注册窗口类并编写最小窗口过程。但如果这是仅调试代码,您实际上可以跳过该部分。 (我稍后再回过头来看。)

如果您有HBITMAP,那么您可以使用BitBltStretchBlt来绘制它,但如果您还没有将图像作为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进入?那么对于Debug代码,我经常直接绘制到屏幕上。 HDC hdc = GetDC(NULL)将获得可以绘制到屏幕的DC,但是存在安全问题,并且它在Windows Vista中与Aero不同,所以另一种方法是绘制到窗口。如果你有一个可以画画的窗口,那么HDC hdc = GetDC(hwnd)就可以了。

这样做的好处是你不必创建和显示一个窗口,因此它对代码流的破坏性较小,它对调试特定问题很有帮助,但不是你可以留下的那种东西在所有的时间。

对于较长期的解决方案,您可以创建一个对话框,并将位图绘制调用放在对话框的WM_PAINT或WM_ERASEBKGND消息处理程序中。但我不建议您从内部代码中显示一个不应该执行UI的对话框。显示窗口,尤其是对话框窗口将干扰应用程序中的正常消息流。如果你想为这个位图查看器使用一个对话框,那么你希望该对话框窗口是用户显示的东西,如果它在那里你只需要绘制它。

如果您无法访问HINSTANCE,仍然可以显示一个对话框,这只是更多的工作。这是一个不同的问题。

答案 1 :(得分:1)

关于您所需要的只是设备上下文的句柄(HDC)。要在其上显示您的数据:

  1. CreateDibSection以创建DIBSection。
  2. 将数据复制到CreateDibSection返回的内存块。
  3. 创建与目标DC兼容的DC。
  4. 在新创建的DC中选择DIBSection。
  5. 从DC到目标DC的BitBlt(或StretchBlt)。