0

我正在尝试实现一个自定义控件,该控件作为其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

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

4

0 回答 0