首页 > 系统相关 >Windows亚克力特效代码实现(Dev c++可以编译通过)

Windows亚克力特效代码实现(Dev c++可以编译通过)

时间:2023-05-06 22:55:48浏览次数:42  
标签:SetWindowCompositionAttribute 窗口 Windows 句柄 ACCENT Dev c++ wcex NULL

#include <windows.h>
#include <dwmapi.h>

// 定义一个枚举类型,表示不同的窗口组合状态
enum AccentState {
    ACCENT_DISABLED = 0,
    ACCENT_ENABLE_GRADIENT = 1,
    ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
    ACCENT_ENABLE_BLURBEHIND = 3,
    ACCENT_ENABLE_ACRYLICBLURBEHIND = 4,
    ACCENT_INVALID_STATE = 5
};

// 定义一个结构体,表示窗口组合策略
struct AccentPolicy {
    AccentState AccentState;
    int AccentFlags;
    int GradientColor;
    int AnimationId;
};

// 定义一个结构体,表示窗口组合属性
struct WindowCompositionAttributeData {
    int Attribute;
    PVOID Data;
    ULONG DataSize;
};

// 定义一个函数指针类型,用于调用 SetWindowCompositionAttribute API
typedef BOOL(WINAPI*pSetWindowCompositionAttribute)(HWND, WindowCompositionAttributeData*);

// 定义一个全局变量,存储函数指针
pSetWindowCompositionAttribute SetWindowCompositionAttribute = nullptr;

// 定义一个函数,用于设置窗口的亚克力效果
void EnableAcrylic(HWND hwnd, COLORREF color) {
    // 如果函数指针为空,就从 dwmapi.dll 中获取函数地址
    if (!SetWindowCompositionAttribute) {
        HMODULE hModule = LoadLibrary(TEXT("user32.dll"));
        if (hModule) {
            SetWindowCompositionAttribute =
                (pSetWindowCompositionAttribute)GetProcAddress(hModule, "SetWindowCompositionAttribute");
        }
    }
    
    // 如果函数指针有效,就构造参数并调用函数
    if (SetWindowCompositionAttribute) {
        AccentPolicy policy = { ACCENT_ENABLE_ACRYLICBLURBEHIND, 0, color, 0 };
        WindowCompositionAttributeData data = { 19, &policy, sizeof(AccentPolicy) };
        SetWindowCompositionAttribute(hwnd, &data);
    }
}

// 定义窗口类名和标题
const char g_szClassName[] = "myWindowClass";
const char g_szTitle[] = "亚克力效果示例";

// 定义消息处理函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CREATE:
            // 在窗口创建时设置亚克力效果,颜色为半透明的白色(0x80FFFFFF)
            EnableAcrylic(hwnd, 0x80FFFFFF);
            break;
        case WM_CLOSE:
            DestroyWindow(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
//定义全局变量
HINSTANCE hInstance; //程序实例句柄
HWND hWnd; //窗口句柄
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //初始化窗口类结构体
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX); //结构体大小
    wcex.style = CS_HREDRAW | CS_VREDRAW; //窗口样式
    wcex.lpfnWndProc = WndProc; //窗口过程函数指针
    wcex.cbClsExtra = 0; //额外的类内存
    wcex.cbWndExtra = 0; //额外的窗口内存
    wcex.hInstance = hInstance; //程序实例句柄
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); //窗口图标句柄
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //窗口光标句柄
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //窗口背景画刷句柄
    wcex.lpszMenuName = NULL; //菜单资源名
    wcex.lpszClassName = "win"; //窗口类名
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //小图标句柄

    //注册窗口类
    if (!RegisterClassEx(&wcex))
    {
        MessageBox(NULL, "注册窗口类失败!", "错误", MB_OK | MB_ICONERROR);
        return -1;
    }

    //创建窗口
    hWnd = CreateWindowEx(
        WS_EX_APPWINDOW | WS_EX_LAYERED, //扩展样式,包括应用程序窗口和分层窗口
        "win", //窗口类名
        "C++设置窗口亚克力效果", //窗口标题
        WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX, //基本样式,包括重叠式窗口,但不包括可调边框和最大化按钮
        0, 0, //初始位置,默认居中
        1000, 1000, //初始大小,按照宏定义的值
        NULL, //父窗口句柄,无父窗口为NULL
        NULL, //菜单句柄,无菜单为NULL
        hInstance, //程序实例句柄
        NULL); //附加数据,无附加数据为NULL

    if (!hWnd)
    {
        MessageBox(NULL, "创建窗口失败!", "错误", MB_OK | MB_ICONERROR);
        return -1;
    }
    
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

 

标签:SetWindowCompositionAttribute,窗口,Windows,句柄,ACCENT,Dev,c++,wcex,NULL
From: https://www.cnblogs.com/cytxzgbp/p/acrylic.html

相关文章

  • c++结构体写入文档
    //#include<iostream>//#include<fstream>//usingnamespacestd;// structstudent// {// charname[20];// charsex[20];// intage;// };// intmain()// {// constintnum=2;// studentstu[num];// stringpath="1.txt";// fstreamf......
  • C++17 解构绑定
    在python中,加入我们有一个函数返回了两个数值,如:defgetData(x,y): returnx,y那么我们在使用这个函数时只需要使用两个新变量去接收函数返回值就可以:a,b=getData(4,5)但是对于C++来说就没有这么方便了,比如一个函数要返回多个数通常会把他们封装成一个pair或者vector容器......
  • C/C++手机库存管理系统[2023-05-06]
    C/C++手机库存管理系统[2023-05-06]1、 设计并实习一个手机库存管理系统。要求实现至少以下功能:产品录入产品查询产品增加产品删除产品入库产品出库排序退出其中具体功能如下:产品录入:产品初始化。录入产品编号,产品品牌,产品型号,产品数量,产品价格。例如: 1001,华为,p30,10,5......
  • C/C++猜数字游戏[2023-05-06]
    C/C++猜数字游戏[2023-05-06]题目8:猜数字游戏软件题目描述设计一个猜数字游戏软件,该程序具有以下功能:(1)游戏区:玩家在此开始游戏,系统给出玩家每次猜数字后的提示,包括数值、位置均正确的个数,以及数值正确但位置不正确的个数。(2)刷新排行榜:当玩家成功完成一轮猜数字游戏后......
  • 【C++文件信息(空格信息)的读、写、追加、截断】
    文件数据类型:ofstream:创建文件+写入信息ifstream:读取信息fstream:创建文件+写入信息+读取信息文件打开模式:ios::app(追加)、ios::out(写)、ios::in(读)ios::ate(定位末尾)、ios::trunc(截断覆盖)打开文件:open(“文件名”,打开模式)关闭文件:close()写入文件:使用流插入运算......
  • C/C++活动管理程序[2023-05-06]
    C/C++活动管理程序[2023-05-06]设计一个活动管理程序,该程序具有以下功能:(1)多用管理,用户登录:输入用户名和密码,密码正确才允许登录。(2)可以创建活动,设定活动的内容,活动的人数,时间,要求等;(3)登录的所有用户可以查看当前所有正在征集的活动,并可以选择参加;(4)活动的创建者,可......
  • c++ 保留小数示范
    #include<iostream>#include<iomanip>//必要头文件usingnamespacestd;intmain(intargc,char**argv){ doublea,b,c; doublen; cin>>a>>b>>c; n=(a/b)*c; cout<<fixed<<setprecision(6)<<n<<endl; return......
  • 掌握C++中static关键字的多种使用场景
    static是什么在最开始C中引入了static关键字可以用于修饰变量和函数,后来由于C++引入了class的概念,现在static可以修饰的对象分为以下5种:成员变量,成员函数,普通函数,局部变量,全局变量static的作用修饰成员变量static修饰成员变量之后,该变量会属于该类,而不是某一个该类的对象。......
  • 深入理解C++右值引用和移动语义:全面解析
    C++11引入了右值引用,它也是C++11最重要的新特性之一。原因在于它解决了C++的一大历史遗留问题,即消除了很多场景下的不必要的额外开销。即使你的代码中并不直接使用右值引用,也可以通过标准库,间接地从这一特性中收益。为了更好地理解该特性带来的优化,以及帮助我们实现更高效的程序,......
  • spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)
    关键字:spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)应用场景:很多时候我们想要在某个类加载完毕时干某件事情,但是使用了spring管理对象,我们这个类引用了其他类(可能是更复杂的关联),所以当我们去使用这个类做事情时发现包空指针错误,这是因为我们......