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 // 透明颜色
//);

代码解释

  1. 加载位图: LoadImage 函数用于加载位图文件 monster.bmp,并将它转换为 HBITMAP 类型。

  2. 获取左上角像素颜色: GetPixel 函数用于获取 hdcMem(内存设备上下文)中左上角像素的颜色值,该颜色值将作为透明色。

  3. 透明输出: TransparentBlt 函数用于将位图透明输出到窗口。它接受以下参数:

    • hdcDest: 目标设备上下文句柄。
    • xoriginDest, yoriginDest: 目标矩形左上角坐标。
    • wDest, hDest: 目标矩形的宽和高。
    • hdcSrc: 源设备上下文句柄。
    • xoriginSrc, yoriginSrc: 源矩形左上角坐标。
    • wSrc, hSrc: 源矩形的宽和高。
    • crTransparent: 透明颜色。
  4. 释放资源: 最后,释放所有创建的资源,例如 hdc, hdcMem, hBm 等。

注意

  • 确保 monster.bmp 位图文件位于与可执行文件相同的目录下,或者提供正确的文件路径。
  • 如果需要设置其他透明颜色,可以修改 GetPixel 函数的参数,获取其他像素的颜色值。

总结

本文详细介绍了使用 C++ 和 TransparentBlt 函数实现位图透明输出的方法,并提供了完整的代码示例。希望本文能帮助您理解并应用该技术。

C++ 使用 TransparentBlt 实现位图透明输出

原文地址: https://www.cveoy.top/t/topic/SOp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录