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