我正在尝试实现一个自定义控件,作为其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
有没有办法查询我正在寻找的转换持续时间?