有朋友想要一个能够在鼠标左键按下时实现窗口抖动的C++程序。当鼠标左键按下时,程序会将窗口进行一定幅度的抖动,抖动完成后窗口回到原始位置。说简单点就是仿QQ窗口抖动的代码。
以下是C++仿QQ窗口抖动的代码示例及详细说明:
#include <windows.h> #include <iostream> LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int main() { // 注册窗口类 WNDCLASS wc = {}; wc.lpfnWndProc = WndProc; wc.hInstance = GetModuleHandle(nullptr); wc.hCursor = LoadCursor(nullptr, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW); wc.lpszClassName = TEXT("MyWindowClass"); RegisterClass(&wc); // 创建窗口 HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("My Window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, nullptr, nullptr, wc.hInstance, nullptr); if (!hwnd) { std::cerr << "Failed to create window" << std::endl; return 1; } ShowWindow(hwnd, SW_SHOWDEFAULT); // 处理消息循环 MSG msg; while (GetMessage(&msg, nullptr, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } // 窗口过程函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static bool isShaking = false; // 是否正在抖动 static int shakeCount = 0; // 已经抖动的次数 static int shakeX = 0; // 当前抖动的x坐标偏移量 static int shakeY = 0; // 当前抖动的y坐标偏移量 switch (msg) { case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; case WM_LBUTTONDOWN: if (!isShaking) { isShaking = true; shakeCount = 0; shakeX = 10; shakeY = 10; } break; case WM_TIMER: if (isShaking) { RECT rect; GetWindowRect(hwnd, &rect); int x = rect.left; int y = rect.top; int width = rect.right - rect.left; int height = rect.bottom - rect.top; if (shakeCount < 10) { SetWindowPos(hwnd, nullptr, x + shakeX, y + shakeY, width, height, SWP_NOZORDER | SWP_NOSIZE); shakeX = -shakeX; shakeY = -shakeY; shakeCount++; } else { SetWindowPos(hwnd, nullptr, x, y, width, height, SWP_NOZORDER | SWP_NOSIZE); isShaking = false; } } break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; }
说明:
- 首先注册一个窗口类,并创建窗口。
- 在窗口过程函数中,如果检测到鼠标左键按下事件,则开始抖动窗口。抖动窗口的过程通过定时器实现,每隔一段时间就将窗口位置偏移一定的距离,然后改变偏移方向,直到抖动次数达到一定值后停止抖动,并将窗口位置还原到原来的位置。
- 在定时器事件处理函数中,首先获取窗口的位置和尺寸,然后判断是否已经抖动了一定次数。如果还没达到次数,则将窗口位置偏移一定距离,并改变偏移方向。如果达到次数,则停止抖动,并将窗口位置还原到原来的位置。
- 在主循环中处理窗口消息,并在消息循环退出前销毁窗口。注意:该示例中,抖动效果只在窗口内部进行,如果需要抖动整个桌面窗口,需要在消息处理函数中获取桌面窗口句柄,并将其位置偏移。
评论