设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 服务器 > 系统 > 正文

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

发布时间:2021-02-03 17:35 所属栏目:52 来源:网络整理
导读:如何在 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);

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读