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

时间:2016-01-17 23:49:52

标签: c++ user-interface winapi animation button

通过此次通话

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

我禁用了Win32 C ++项目中的按钮动画(没有MFC或其他任何东西),它启用了Visual Styles Common Controls 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,当normale状态或colorB当鼠标当正常时结束而不是colorA,当鼠标结束时结束时为fade_until_you_reach_colorB。

由于

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

What I want

What I DON'T want

1 个答案:

答案 0 :(得分:1)

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

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

由于您使用的是自定义绘图,因此已禁用动画。此方法还将禁用鼠标悬停效果。

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