#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