加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 05:53:53 所属栏目:Windows 来源:网络整理
导读:如何在 Windows中获得某些控件的图标? 更具体地说,我想从ListView标题中获取排序箭头图标. 我尝试使用以下方法获取它: HRESULT GetSortArrowBmp(HWND hwnd,HEADERSORTARROWSTATES arrowState,HBITMAP** arrow){ HTHEME theme = OpenThemeData(hwnd,L"HEADE
如何在 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,TMT_GLYPHDIBDATA,&bmp);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读