c++仿手机qq窗口抖动代码

有朋友想要一个能够在鼠标左键按下时实现窗口抖动的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;
}

说明:

  1. 首先注册一个窗口类,并创建窗口。
  2. 在窗口过程函数中,如果检测到鼠标左键按下事件,则开始抖动窗口。抖动窗口的过程通过定时器实现,每隔一段时间就将窗口位置偏移一定的距离,然后改变偏移方向,直到抖动次数达到一定值后停止抖动,并将窗口位置还原到原来的位置。
  3. 在定时器事件处理函数中,首先获取窗口的位置和尺寸,然后判断是否已经抖动了一定次数。如果还没达到次数,则将窗口位置偏移一定距离,并改变偏移方向。如果达到次数,则停止抖动,并将窗口位置还原到原来的位置。
  4. 在主循环中处理窗口消息,并在消息循环退出前销毁窗口。注意:该示例中,抖动效果只在窗口内部进行,如果需要抖动整个桌面窗口,需要在消息处理函数中获取桌面窗口句柄,并将其位置偏移。