如何在Windows中获取某个控件的图标?
更具体地说,我想从ListView标头中获得排序箭头图标。
我尝试使用以下方法获取它:

HRESULT GetSortArrowBmp(HWND hwnd, HEADERSORTARROWSTATES arrowState, HBITMAP** arrow)
{
    HTHEME theme = OpenThemeData(hwnd,L"HEADER"); // hwnd is header itself
    HRESULT res = E_FAIL;
    if (theme){
        res = GetThemeBitmap(theme, HP_HEADERSORTARROW, arrowState, TMT_DIBDATA, GBF_COPY, *arrow);
        CloseThemeData(theme);
    }
    return res;
}

但这不会返回我期望的小三角形。有什么建议?

最佳答案

根据MSDN文档,可以为属性GetThemeBitmap()(不带字形的背景)或TMT_DIBDATA(字形,即此处的三角形)或TMT_GLYPHDIBDATA(目前尚不支持)调用TMT_HBITMAP函数。

不幸的是,我发现使用TMT_GLYPHDIBDATA时,函数总是失败,而使用E_INVALIDARG失败。头<vssym32.h>TMT_GLYPHDIBDATA定义为8。但是我发现该函数获取常量3的字形位图。

我猜头<vssym32.h>(从Windows SDK 7.1开始)或Windows 7上的GetThemeBitmap()实现中存在错误(错误)。

除非Microsoft至少证明3或8是正确的,否则我将在我的代码中使用以下解决方法:

HBITMAP bmp;
HRESULT hr = GetThemeBitmap(hTheme, iPartId, iStateId, 3, GBF_DIRECT, &bmp);
if(FAILED(hr))
   hr = GetThemeBitmap(hTheme, iPartId, iStateId, TMT_GLYPHDIBDATA, GBF_DIRECT, &bmp);

10-08 00:44