代码示例
水波纹效果
cpp
#include <windows.h>
#include <windowsx.h>
#include <sstream>
// DLL 函数指针类型定义
typedef void (*WaterInitPtr)(HBITMAP bitmap);
typedef void (*WaterTimePtr)(HDC hdc, int sx, int sy);
typedef void (*WaterMouseActionPtr)(HDC hdc, int sx, int sy, int mx, int my, int half, int deep);
// 全局变量
WaterInitPtr WaterInit = nullptr;
WaterTimePtr WaterTimer = nullptr;
WaterMouseActionPtr WaterMouseAction = nullptr;
HBRUSH hbrBkgnd = NULL;
HINSTANCE g_hInstance = NULL;
// 窗口过程
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_CREATE:
{
std::ostringstream oss;
// 设置背景画刷为白色
hbrBkgnd = CreateSolidBrush(RGB(255, 255, 255));
// 加载位图
HBITMAP hBitmap = (HBITMAP)LoadImageA(
NULL,
"1.bmp",
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE
);
if (!hBitmap) {
MessageBox(hwnd, L"Bitmap loading failed", L"error", MB_OK | MB_ICONERROR);
return FALSE;
}
// 加载 DLL
HMODULE hDll = LoadLibrary(L"water.dll");
if (!hDll) {
MessageBox(hwnd, L"Failed to load water.dll", L"error", MB_OK | MB_ICONERROR);
return FALSE;
}
// 获取 DLL 中的函数
WaterInit = reinterpret_cast<WaterInitPtr>(GetProcAddress(hDll, "WaterInit"));
WaterTimer = reinterpret_cast<WaterTimePtr>(GetProcAddress(hDll, "WaterTimer"));
WaterMouseAction = reinterpret_cast<WaterMouseActionPtr>(GetProcAddress(hDll, "WaterMouseAction"));
// 初始化水波效果
WaterInit(hBitmap);
// 设置定时器
SetTimer(hwnd, 1, 10, NULL);
return 0;
}
case WM_ERASEBKGND:
// 处理背景擦除
return TRUE;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// 使用背景画刷填充窗口
FillRect(hdc, &ps.rcPaint, hbrBkgnd);
EndPaint(hwnd, &ps);
return 0;
}
case WM_TIMER:
if (wParam == 1 && WaterTimer) {
HDC hdc = GetDC(hwnd);
WaterTimer(hdc, 0, 0);
ReleaseDC(hwnd, hdc);
}
break;
case WM_MOUSEMOVE:
if (WaterMouseAction) {
HDC hdc = GetDC(hwnd);
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
WaterMouseAction(hdc, 0, 0, x, y, 5, 100);
ReleaseDC(hwnd, hdc);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
return 0;
case WM_DESTROY:
KillTimer(hwnd, 1);
if (hbrBkgnd) {
DeleteObject(hbrBkgnd);
}
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
// 程序入口
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
g_hInstance = hInstance;
// 注册窗口类
WNDCLASSW wc = {};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = L"WaterWindowClass";
wc.hbrBackground = hbrBkgnd;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
if (!RegisterClassW(&wc)) {
MessageBox(NULL, L"Window class registration failed", L"Error", MB_OK | MB_ICONERROR);
return 1;
}
// 创建窗口
HWND hwnd = CreateWindowW(
L"WaterWindowClass",
L"Water Effect",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
NULL, NULL, hInstance, NULL
);
if (!hwnd) {
MessageBox(NULL, L"Window creation failed", L"Error", MB_OK | MB_ICONERROR);
return 1;
}
// 显示窗口
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}相关资源下载
设置窗口背景特效
WindowCompositionAttribute.h
cpp
#pragma once
#include <Windows.h>
typedef enum _WINDOWCOMPOSITIONATTRIB
{
WCA_UNDEFINED = 0,
WCA_NCRENDERING_ENABLED = 1,
WCA_NCRENDERING_POLICY = 2,
WCA_TRANSITIONS_FORCEDISABLED = 3,
WCA_ALLOW_NCPAINT = 4,
WCA_CAPTION_BUTTON_BOUNDS = 5,
WCA_NONCLIENT_RTL_LAYOUT = 6,
WCA_FORCE_ICONIC_REPRESENTATION = 7,
WCA_EXTENDED_FRAME_BOUNDS = 8,
WCA_HAS_ICONIC_BITMAP = 9,
WCA_THEME_ATTRIBUTES = 10,
WCA_NCRENDERING_EXILED = 11,
WCA_NCADORNMENTINFO = 12,
WCA_EXCLUDED_FROM_LIVEPREVIEW = 13,
WCA_VIDEO_OVERLAY_ACTIVE = 14,
WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15,
WCA_DISALLOW_PEEK = 16,
WCA_CLOAK = 17,
WCA_CLOAKED = 18,
WCA_ACCENT_POLICY = 19,
WCA_FREEZE_REPRESENTATION = 20,
WCA_EVER_UNCLOAKED = 21,
WCA_VISUAL_OWNER = 22,
WCA_LAST = 23
} WINDOWCOMPOSITIONATTRIB;
typedef struct _WINDOWCOMPOSITIONATTRIBDATA
{
WINDOWCOMPOSITIONATTRIB Attrib;
PVOID pvData;
SIZE_T cbData;
} WINDOWCOMPOSITIONATTRIBDATA;
typedef enum _ACCENT_STATE
{
// 禁用所有特效,窗口背景为纯色或标准不透明状态
ACCENT_DISABLED = 0,
// 启用渐变颜色背景
ACCENT_ENABLE_GRADIENT = 1,
// 启用透明渐变背景
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
// 启用传统的毛玻璃效果(Windows 7/10 早期常见的 BlurBehind)
ACCENT_ENABLE_BLURBEHIND = 3,
// 启用亚克力(Acrylic)模糊效果(Windows 10 1803+ 及 Windows 11 常见的半透明高级模糊)
ACCENT_ENABLE_ACRYLICBLURBEHIND = 4,
// 无效状态/错误状态,通常用于边界检查
ACCENT_INVALID_STATE = 5
} ACCENT_STATE;
typedef struct _ACCENT_POLICY
{
ACCENT_STATE AccentState;
DWORD AccentFlags;
DWORD GradientColor;
DWORD AnimationId;
} ACCENT_POLICY;
WINUSERAPI
BOOL
WINAPI
GetWindowCompositionAttribute(
_In_ HWND hWnd,
_Inout_ WINDOWCOMPOSITIONATTRIBDATA* pAttrData);
typedef BOOL(WINAPI* pfnGetWindowCompositionAttribute)(HWND, WINDOWCOMPOSITIONATTRIBDATA*);
WINUSERAPI
BOOL
WINAPI
SetWindowCompositionAttribute(
_In_ HWND hWnd,
_Inout_ WINDOWCOMPOSITIONATTRIBDATA* pAttrData);
typedef BOOL(WINAPI* pfnSetWindowCompositionAttribute)(HWND, WINDOWCOMPOSITIONATTRIBDATA*);main.cpp
cpp
#include <windows.h>
#include "WindowCompositionAttribute.h"
// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
{
HMODULE hUser = GetModuleHandle(TEXT("user32.dll"));
if (hUser)
{
pfnSetWindowCompositionAttribute setWindowCompositionAttribute =
(pfnSetWindowCompositionAttribute)GetProcAddress(hUser, "SetWindowCompositionAttribute");
if (setWindowCompositionAttribute)
{
ACCENT_POLICY accent; {};
//alpha+blue+green+red
accent.GradientColor = (160 << 24) | (30 << 16) | (30 << 16) | 30;
accent.AccentFlags = 2;
//accent.AccentFlags = 232;
//accent.AccentFlags = 255;
accent.AccentState = ACCENT_ENABLE_BLURBEHIND;
accent.AnimationId = 0;
WINDOWCOMPOSITIONATTRIBDATA data;
data.Attrib = WCA_ACCENT_POLICY;
data.pvData = &accent;
data.cbData = sizeof(accent);
setWindowCompositionAttribute(hwnd, &data);
}
}
return 0;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// 绘制黑色背景
HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0));
HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
Rectangle(hdc, 0, 0, 600, 600);
SelectObject(hdc, hOldBrush);
DeleteObject(hBrush);
EndPaint(hwnd, &ps);
return 0;
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
// 入口函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
const wchar_t CLASS_NAME[] = L"SampleWindowClass";
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
if (!RegisterClassEx(&wc)) return 0;
HWND hwnd = CreateWindowEx(
0, CLASS_NAME, L"Blur Window Demo",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 600, 600,
NULL, NULL, hInstance, NULL
);
if (hwnd == NULL) return 0;
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}