如何获得与Windows主题相关联的图标?

Rob*_*tas 3 winapi visual-c++

如何在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;
} 
Run Code Online (Sandbox Code Playgroud)

但它并没有回归我所期待的微小三角形.有什么建议?

mit*_*ity 6

根据MSDN文档,函数GetThemeBitmap()可以被称为属性TMT_DIBDATA(没有字形的背景)或TMT_GLYPHDIBDATA(字形,即这里只是三角形)或TMT_HBITMAP(虽然目前根本不支持).

不幸的是,我发现TMT_GLYPHDIBDATA功能总是失败E_INVALIDARG.标题<vssym32.h>定义TMT_GLYPHDIBDATA8.但是我发现该函数获取常量的字形位图3.

我猜在标题中有一个错误(拼写错误)<vssym32.h>(从Windows SDK 7.1开始)或GetThemeBitmap()在Windows 7上实现.

除非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);
Run Code Online (Sandbox Code Playgroud)