1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| #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; };
typedef BOOL(WINAPI*pSetWindowCompositionAttribute)(HWND, WindowCompositionAttributeData*);
pSetWindowCompositionAttribute SetWindowCompositionAttribute = nullptr;
void EnableAcrylic(HWND hwnd, COLORREF color) { 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: 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, hInstance, 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; }
|