gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:32:16 25 4
gpt4 key购买 nike

它只是为了“调试”目的,所以我不想花很多时间在这上面,也不是很重要。该程序将数据导出为 png、jpg、svg 等...-所以这没什么大不了的,尽管在生成图像时看到图像可能会很好。此外,该程序将用于 Linux 服务器;但我会将此“功能”限制为 Win 版本。

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

我有 ARGB 格式 (32bpp) 的图像,尽管转换格式完全不是问题。我想使用 Win32,从代码深处的函数(不知道 hInstance 等)创建一个窗口,然后编写位图。希望又快又简单。

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

谢谢!

最佳答案

这里最大的工作实际上是注册窗口类并编写一个最小的窗口过程。但如果这是仅用于调试的代码,您实际上可以跳过该部分。 (稍后我会回来讨论)。

如果你有一个 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 绘制?那么对于调试代码,我经常直接在屏幕上绘制。 HDC hdc = GetDC(NULL) 将获得一个可以绘制到屏幕上的 DC,但存在安全问题并且它与 Windows Vista 中的 Aero 不一样,所以另一种方法是绘制到 window 上。如果您有一个可以直接绘制的窗口,那么 HDC hdc = GetDC(hwnd) 将起作用。

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

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

如果您没有访问 HINSTANCE 的权限,它仍然可以显示一个对话框,只是需要更多的工作。这是一个不同的问题。

关于C++ Win32,用位图显示窗口的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2269918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com