禁用 Win32 C++中单个应用程序的按钮动画

Disable button animation for a single application in Win32 C++

本文关键字:按钮 动画 应用程序 单个 Win32 C++ 禁用      更新时间:2023-10-16

通过此调用

SystemParametersInfo(SPI_SETCLIENTAREAANIMATION, 0, (LPVOID)FALSE, 0);

我在 Win32 C++ 项目(没有 MFC 或其他任何内容)中禁用按钮动画,该项目启用了视觉样式通用控件 6.0.0.0,并通过调用函数正确初始化InitCommonControlsEx。有没有其他方法可以做到这一点?我问是因为我不想禁用整个系统的动画,而只想禁用我的应用程序。我创建的按钮是自定义绘制的(不是所有者绘制的)。我在WM_CREATE消息中创建了一个这样的按钮(hwndbutton之前被定义为静态的,以便我可以在所有WM消息之间共享它):

hwndbutton = CreateWindowEx(0, L"BUTTON", L"example", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, x, y, width, height, hwnd, (HMENU)button_id, GetModuleHandle(NULL), NULL);

我画它

...
case WM_NOTIFY:
{
    LPNMHDR item = (LPNMHDR)lParam;
    if (item->idFrom == button_id && item->code == NM_CUSTOMDRAW)
        {
            LPNMCUSTOMDRAW item_draw = (LPNMCUSTOMDRAW)item;
            if (item_draw->uItemState & CDIS_HOT)
            {
                SetDCBrushColor(item_draw->hdc, RGB(180, 180, 180));
                SelectObject(item_draw->hdc, GetStockObject(DC_BRUSH));
            }
            else
            {
                SetDCBrushColor(item_draw->hdc, RGB(255, 255, 255));
                SelectObject(item_draw->hdc, GetStockObject(DC_BRUSH));
            }
            SetDCPenColor(item_draw->hdc, RGB(0, 0, 0));
            SelectObject(item_draw->hdc, GetStockObject(DC_PEN));
            RoundRect(item_draw->hdc, item_draw->rc.left, item_draw->rc.top, item_draw->rc.right, item_draw->rc.bottom, 0, 0);
            return CDRF_DODEFAULT;   // Return would be CDRF_SKIPDEFAULT but I want to keep the text "example" drawn
}
break;
...

通过"按钮动画",我的意思是例如,当您将光标移到按钮上然后离开它时按钮颜色中发生的淡入淡出效果:我希望它在正常状态时是colorA,或者在鼠标结束时是colorB,而不是正常时的颜色A,当鼠标结束时fade_until_you_reach_colorB。

谢谢

编辑:我添加两个 GIF第一个是我想要的(我通过之前调用SystemParametersInfo获得的),第二个是我想避免的动画

我想要什么

我不想要的

可以按如下方式禁用单个窗口和控件的主题:

SetWindowTheme(hbutton, L" ", L" ");

动画应该已经禁用,因为您使用的是自定义绘制。此方法还将禁用鼠标悬停效果。

通常,当您禁用按钮的主题时,新系统上的旧 3D 边框可能看起来很奇怪。您可以将BS_FLAT添加到按钮的样式中。