如何在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);