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