C++ 使用 TransparentBlt 实现位图透明输出
C++ 使用 TransparentBlt 实现位图透明输出
本文将介绍如何使用 C++ 和 Windows API 中的 TransparentBlt 函数实现位图透明输出。
代码示例
#include <Windows.h>
#include<stdlib.h>
#pragma comment(lib, "msimg32.lib")
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 注册窗口类
WNDCLASS wc = {};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = L"MyWindows";
RegisterClass(&wc);
// 创建窗口
HWND hwnd = CreateWindowExW(
0, // 扩展风格,这里设为0
L"MyWindows", // 窗口类名
TEXT("位图"), // 窗口标题
WS_OVERLAPPEDWINDOW, // 窗口样式
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, // 窗口位置和大小,这里设为默认值
nullptr, // 父窗口句柄,这里设为无父窗口
nullptr, // 菜单句柄,这里设为无菜单
hInstance, // 应用实例句柄
nullptr // 其他创建参数,这里设为nullptr
);
if (hwnd == nullptr) {
return 0;
}
ShowWindow(hwnd, nCmdShow);
// 进入消息循环
MSG msg = {};
while (GetMessage(&msg, nullptr, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HBITMAP hBm;
hBm = HBITMAP(LoadImage(NULL, L'monster.bmp', IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE));
switch (msg) {
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc, hdcMem;
hdc = BeginPaint(hwnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
COLORREF color = GetPixel(hdcMem, 1, 1);
SelectObject(hdcMem, hBm);
BITMAP bitmap;
GetObject(hBm, sizeof(bitmap), &bitmap);
BitBlt(hdc, 50, 100, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
SetStretchBltMode(hdc, HALFTONE);
StretchBlt(hdc, 200, 100, bitmap.bmWidth * 2, bitmap.bmHeight * 2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
StretchBlt(hdc, 50, bitmap.bmHeight + 100, bitmap.bmWidth / 2, bitmap.bmHeight / 2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
StretchBlt(hdc, bitmap.bmWidth, bitmap.bmHeight + 100, bitmap.bmWidth / 2, bitmap.bmHeight / 2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
// 获取左上角像素颜色值
// 设置透明色并输出位图
COLORREF transparentColor = GetPixel(hdcMem, 0, 0);
TransparentBlt(hdc, 250, 100, bitmap.bmWidth, bitmap.bmHeight,
hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, transparentColor);
/* TransparentBlt(hdc, 300, 300, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, color);*/
// 释放资源
ReleaseDC(hwnd, hdc);
DeleteDC(hdcMem);
DeleteObject(hBm);
EndPaint(hwnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
//BOOL TransparentBlt(
// HDC hdcDest, // 目标设备上下文句柄
// int xoriginDest, // 目标矩形左上角的x坐标
// int yoriginDest, // 目标矩形左上角的y坐标
// int wDest, // 目标矩形的宽度
// int hDest, // 目标矩形的高度
// HDC hdcSrc, // 源设备上下文句柄
// int xoriginSrc, // 源矩形左上角的x坐标
// int yoriginSrc, // 源矩形左上角的y坐标
// int wSrc, // 源矩形的宽度
// int hSrc, // 源矩形的高度
// UINT crTransparent // 透明颜色
//);
代码解释
-
加载位图:
LoadImage函数用于加载位图文件monster.bmp,并将它转换为HBITMAP类型。 -
获取左上角像素颜色:
GetPixel函数用于获取hdcMem(内存设备上下文)中左上角像素的颜色值,该颜色值将作为透明色。 -
透明输出:
TransparentBlt函数用于将位图透明输出到窗口。它接受以下参数:hdcDest: 目标设备上下文句柄。xoriginDest,yoriginDest: 目标矩形左上角坐标。wDest,hDest: 目标矩形的宽和高。hdcSrc: 源设备上下文句柄。xoriginSrc,yoriginSrc: 源矩形左上角坐标。wSrc,hSrc: 源矩形的宽和高。crTransparent: 透明颜色。
-
释放资源: 最后,释放所有创建的资源,例如
hdc,hdcMem,hBm等。
注意
- 确保
monster.bmp位图文件位于与可执行文件相同的目录下,或者提供正确的文件路径。 - 如果需要设置其他透明颜色,可以修改
GetPixel函数的参数,获取其他像素的颜色值。
总结
本文详细介绍了使用 C++ 和 TransparentBlt 函数实现位图透明输出的方法,并提供了完整的代码示例。希望本文能帮助您理解并应用该技术。
原文地址: https://www.cveoy.top/t/topic/SOp 著作权归作者所有。请勿转载和采集!