c++ 创建一个窗口将base64图像展示在窗口上不使用qt 详细方法 不写入文件 使用GDI+
时间: 2023-12-29 21:06:07 浏览: 143
要在C++中创建一个窗口并将base64图像展示在窗口上,需要进行以下步骤:
1. 首先,需要使用GDI+库来处理图像,所以需要在代码中包含以下头文件:
```
#include <gdiplus.h>
#pragma comment (lib,"Gdiplus.lib")
```
2. 接着,需要创建一个窗口,可以使用Windows API的CreateWindow函数。示例代码如下:
```
HWND hwnd = CreateWindow("STATIC", NULL, WS_VISIBLE | WS_POPUP, 0, 0, 500, 500, NULL, NULL, NULL, NULL);
```
3. 然后,需要将base64图像解码为位图。可以使用GDI+的Bitmap类来完成。示例代码如下:
```
Gdiplus::Bitmap* bitmap;
std::string base64_image; // 假设已经有一个base64编码的图像字符串
std::vector<BYTE> data;
data.insert(data.end(), base64_image.begin(), base64_image.end());
data.push_back('\0');
DWORD size = 0;
BYTE* buffer = NULL;
if (::CryptStringToBinaryA(data.data(), data.size(), CRYPT_STRING_BASE64, buffer, &size, NULL, NULL)) {
buffer = new BYTE[size];
if (::CryptStringToBinaryA(data.data(), data.size(), CRYPT_STRING_BASE64, buffer, &size, NULL, NULL)) {
IStream* stream = SHCreateMemStream(buffer, size);
bitmap = Gdiplus::Bitmap::FromStream(stream);
stream->Release();
}
delete[] buffer;
}
```
4. 最后,需要将位图绘制到窗口上。可以使用GDI+的Graphics类和HDC句柄来完成。示例代码如下:
```
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
Gdiplus::Graphics graphics(hdc);
graphics.DrawImage(bitmap, 0, 0, 500, 500);
EndPaint(hwnd, &ps);
```
完整代码示例:
```
#include <windows.h>
#include <gdiplus.h>
#include <vector>
#include <string>
#include <wincrypt.h>
#include <shlwapi.h>
#pragma comment (lib,"Gdiplus.lib")
#pragma comment (lib,"Crypt32.lib")
#pragma comment (lib,"Shlwapi.lib")
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_PAINT: {
Gdiplus::Bitmap* bitmap;
std::string base64_image; // 假设已经有一个base64编码的图像字符串
std::vector<BYTE> data;
data.insert(data.end(), base64_image.begin(), base64_image.end());
data.push_back('\0');
DWORD size = 0;
BYTE* buffer = NULL;
if (::CryptStringToBinaryA(data.data(), data.size(), CRYPT_STRING_BASE64, buffer, &size, NULL, NULL)) {
buffer = new BYTE[size];
if (::CryptStringToBinaryA(data.data(), data.size(), CRYPT_STRING_BASE64, buffer, &size, NULL, NULL)) {
IStream* stream = SHCreateMemStream(buffer, size);
bitmap = Gdiplus::Bitmap::FromStream(stream);
stream->Release();
}
delete[] buffer;
}
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
Gdiplus::Graphics graphics(hdc);
graphics.DrawImage(bitmap, 0, 0, 500, 500);
EndPaint(hwnd, &ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
// 初始化 GDI+
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
// 注册窗口类
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "MyWindowClass";
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&wc)) {
MessageBox(NULL, "窗口注册失败!", "错误", MB_ICONERROR | MB_OK);
return 0;
}
// 创建窗口
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "MyWindowClass", "窗口标题", WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL);
if (hwnd == NULL) {
MessageBox(NULL, "窗口创建失败!", "错误", MB_ICONERROR | MB_OK);
return 0;
}
// 消息循环
while (GetMessage(&Msg, NULL, 0, 0) > 0) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
// 关闭 GDI+
Gdiplus::GdiplusShutdown(gdiplusToken);
return Msg.wParam;
}
```
阅读全文