这仅用于“调试”目的,因此我不想花费大量时间来处理这个问题,也不是非常重要。该程序将数据导出为png,jpg,svg等... - 这并不是什么大不了的事,尽管在生成图像时看到它可能会很好。此外,该程序将用于Linux服务器;但是我会将这个'功能'限制在Win版本中。
我也不想使用库,除非它非常非常轻便(我使用了CImg一段时间,但我对它的速度不是很满意,所以我最后自己写了重要的函数并直接使用libjpeg和libpng。)
我的图像采用ARGB格式(32bpp),虽然转换格式根本不会成为问题。我想使用Win32,从代码内部的函数创建窗口(没有已知的hInstance等),并编写位图。希望快速而简单。
但我不知道win32api足够了。我已经看到绘制(GDI)的唯一选择是通过HBITMAP对象...我可以依赖的任何代码片段或示例?我可能不会忽视任何考虑因素?或者也许 - 考虑我的时间限制 - 我应该忘记它吗?
谢谢!
答案 0 :(得分:5)
这里最重要的工作是实际注册窗口类并编写最小窗口过程。但如果这是仅调试代码,您实际上可以跳过该部分。 (我稍后再回过头来看。)
如果您有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进入?那么对于Debug代码,我经常直接绘制到屏幕上。 HDC hdc = GetDC(NULL)
将获得可以绘制到屏幕的DC,但是存在安全问题,并且它在Windows Vista中与Aero不同,所以另一种方法是绘制到窗口。如果你有一个可以画画的窗口,那么HDC hdc = GetDC(hwnd)就可以了。
这样做的好处是你不必创建和显示一个窗口,因此它对代码流的破坏性较小,它对调试特定问题很有帮助,但不是你可以留下的那种东西在所有的时间。
对于较长期的解决方案,您可以创建一个对话框,并将位图绘制调用放在对话框的WM_PAINT或WM_ERASEBKGND消息处理程序中。但我不建议您从内部代码中显示一个不应该执行UI的对话框。显示窗口,尤其是对话框窗口将干扰应用程序中的正常消息流。如果你想为这个位图查看器使用一个对话框,那么你希望该对话框窗口是用户显示的东西,如果它在那里你只需要绘制它。
如果您无法访问HINSTANCE,仍然可以显示一个对话框,这只是更多的工作。这是一个不同的问题。
答案 1 :(得分:1)
关于您所需要的只是设备上下文的句柄(HDC
)。要在其上显示您的数据: