• Win32窗口设置为透明


    可以使用以下方法将Win32窗口设置为透明:

    1. 定义窗口类时,在WNDCLASSEX结构体中设置hbrBackground成员为NULL。

    2. 在窗口创建时,使用WS_EX_LAYERED风格和SetLayeredWindowAttributes函数将窗口设置为透明:

    HWND hwnd = CreateWindowEx(WS_EX_LAYERED, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL);
    
    SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA);
    

    其中,第二个参数指定颜色偏移量,第三个参数指定透明度,范围从0(完全透明)到255(完全不透明)。

    1. 在窗口的WM_PAINT消息处理函数中,使用CreateCompatibleDC函数创建一个与窗口DC兼容的内存DC,并将要绘制的图形绘制到该内存DC上。然后使用UpdateLayeredWindow函数将内存DC中的内容复制到窗口DC中。
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
    
        // 创建与窗口DC兼容的内存DC
        HDC memDC = CreateCompatibleDC(hdc);
    
        // 创建一个与窗口大小相同的位图
        HBITMAP memBmp = CreateCompatibleBitmap(hdc, 500, 100);
    
        // 将位图选入内存DC
        HBITMAP oldBmp = (HBITMAP)SelectObject(memDC, memBmp);
    
        // 在内存DC中绘制图形
        // ...
    
        // 使用UpdateLayeredWindow函数将内存DC中的内容复制到窗口DC中
        POINT ptSrc = { 0, 0 };
        SIZE size = { 500, 100 };
        BLENDFUNCTION blend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
        POINT ptDst = { 0, 0 };
    
        UpdateLayeredWindow(hwnd, hdc, &ptDst, &size, memDC, &ptSrc, 0, &blend, ULW_ALPHA);
    
        // 恢复原来的位图
        SelectObject(memDC, oldBmp);
    
        // 释放内存DC和位图
        DeleteDC(memDC);
        DeleteObject(memBmp);
    
        EndPaint(hwnd, &ps);
    }
    break;
    

    以上代码中,在内存DC中绘制图形的过程自行实现。另外,由于UpdateLayeredWindow函数需要使用内存DC和位图,因此需要在WM_DESTROY消息处理函数中释放这些资源:

    case WM_DESTROY:
    {
        PostQuitMessage(0);
        DeleteObject(hBrush);
        DeleteObject(hPen);
        DeleteObject(hFont);
        DeleteObject(hImage);
    
        // 释放内存DC和位图
        HDC memDC = GetDC(hwnd);
        ReleaseDC(hwnd, memDC);
    }
    break;
  • 相关阅读:
    设计模式-适配器模式在Java中的使用示例
    先有鸡还是先有蛋?这是领域驱动设计落地最大的困局
    机器学习和深度学习 -- 李宏毅(笔记与个人理解)Day19
    线性表的应用 —— 单链表
    ISIS多区域实验简述
    最新AI创作系统+ChatGPT网站源码+支持GPT4.0+支持ai绘画+支持国内全AI模型
    红菜苔炒腊肉
    HTML (总结黑马的)
    SpringBoot开发实用篇
    手写编程语言-递归函数是如何实现的?
  • 原文地址:https://www.cnblogs.com/bzbk/p/17197596.html