获取滚动条的主题转换持续时间

时间:2013-12-20 05:00:43

标签: c winapi gdi uxtheme

我正在尝试实现一个自定义控件,作为其WM_PAINT处理程序的一部分,它绘制了一个主题滚动条箭头。我还希望按钮的视觉状态(正常,热,悬停,按下等)之间的转换使用BeginBufferedAnimation()中定义的uxtheme.dll系列函数进行淡入淡出动画。

我现在的问题是我无法获得滚动条的正确淡入淡出持续时间,因为GetThemeTransitionDuration()功能失败了。当我尝试查询转换持续时间时,它返回E_INVALIDARG( - 2147024809)而不是成功:

HTHEME hTheme = OpenThemeData(hwnd, L"SCROLLBAR"); // returns a valid non-NULL theme handle
...
DWORD dwDuration = 0;
HRESULT hr = GetThemeTransitionDuration(
    hTheme,                /*hTheme*/
    SBP_ARROWBTN           /*iPartId*/,
    ABP_LEFTNORMAL         /*iStateIdFrom*/,
    ABP_LEFTHOT            /*iStateIdTo*/,
    TMT_TRANSITIONDURATION /*iPropId*/, 
    &dwDuration            /*pdwDuration*/
); // PROBLEM: returns E_INVALIDARG

这有点奇怪,原因有两个:

(1)在我的Windows 7版本中,主题滚动条明显具有状态之间的快速淡入淡出动画(例如,在Windows资源管理器中)。

(2)如果我将主题更改为BUTTON并只使用普通和热键状态,则该函数返回S_OK并给出合理的转换持续时间(我机器上的1000毫秒)。

HTHEME hTheme = OpenThemeData(hwnd, L"BUTTON");
...
DWORD dwDuration = 0;
HRESULT hr = GetThemeTransitionDuration(
    hTheme,                /*hTheme*/
    BP_PUSHBUTTON          /*iPartId*/,
    PBS_NORMAL             /*iStateIdFrom*/,
    PBS_HOT                /*iStateIdTo*/,
    TMT_TRANSITIONDURATION /*iPropId*/, 
    &dwDuration            /*pdwDuration*/
); // returns S_OK, and dwDuration = 1000

有没有办法查询我正在寻找的转换持续时间?

0 个答案:

没有答案