Windows亚克力特效代码实现(Dev c++可以编译通过)
阅读原文时间:2023年07月16日阅读:1

#include
#include

// 定义一个枚举类型,表示不同的窗口组合状态
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;  

}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章