[英]Which class, part and state is used to draw selection?
我正在嘗試使用啟用了Aero的Windows 7上的視覺樣式在我的自定義窗體控件中繪制選擇/焦點框架。 我試過這個:
VisualStyleRenderer selectionRenderer = new VisualStyleRenderer(VisualStyleElement.ListView.Item.Selected);
selectionRenderer.DrawBackground(g, visual.ItemArea);
還有這個:
VisualStyleRenderer selectionRenderer = new VisualStyleRenderer(VisualStyleElement.TreeView.Item.Selected);
selectionRenderer.DrawBackground(g, visual.ItemArea);
但是,兩者都失敗了信息,當前樣式既不支持TreeView.Item.Selected,也不支持ListView.Item.Selected。 但是,嘿,Windows在UI的樹視圖中繪制選擇:
和列表視圖:
那么我應該使用哪個類和部分來繪制系統選擇矩形?
編輯:我試圖用純WinAPI編寫代碼。 這是一段代碼片段:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HTHEME theme = OpenThemeData(hwnd, L"TREEVIEW");
RECT rect;
rect.left = 10;
rect.top = 10;
rect.right = 80;
rect.bottom = 80;
DrawThemeBackground(theme, hdc, TVP_TREEITEM, TREIS_SELECTED, &rect, &rect);
CloseThemeData(theme);
EndPaint(hwnd, &ps);
return 0L;
}
結果如下:
我很親密。 純WinAPI的完整解決方案如下所示:
HWND mainWinHWND = CreateWindowEx(WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,
L"MainWindowClass",
L"WinAPI window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
NULL,
NULL,
hInstance,
NULL);
if (!mainWinHWND)
return -1;
SetWindowTheme(mainWinHWND, L"explorer", nullptr);
然后可以請求操作系統繪制特定部分:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HTHEME theme = OpenThemeData(hwnd, L"TREEVIEW");
RECT rect;
rect.left = 10;
rect.top = 10;
rect.right = 80;
rect.bottom = 80;
DrawThemeBackground(theme, hdc, TVP_TREEITEM, TREIS_SELECTED, &rect, &rect);
CloseThemeData(theme);
EndPaint(hwnd, &ps);
return 0L;
}
結果:
令人遺憾的是,主流操作系統支持的記錄很少。 例如, L"Explorer"
值取自MSDN的SetWindowTheme,但沒有正式的參數列表,可以提供給該例程。
MSDN表示,僅在Windows XP Home Edition,Windows XP Professional x64 Edition和Windows Server 2003上支持Visaul樣式。
請參閱此鏈接的備注部分(VisualStyleRenderer類)的末尾,以及此鏈接的 備注部分。 VisualStyleRenderer.IsSupported
和VisualStyleInformation.IsSupportedByOS
都返回true,似乎除了XP和Server 2003之外的任何操作系統都不支持它!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.