0

Aero が有効になっている Windows 7 でビジュアル スタイルを使用して、カスタム Windows フォーム コントロールで選択/フォーカス フレームを描画しようとしています。私はこれを試しました:

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 で描画された選択

4

2 に答える 2

2

私はかなり近かった。純粋な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);

次に、OSに特定のパーツを描画するように要求できます。

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; 
}

結果:

ここに画像の説明を入力してください

テーマOSのサポートが十分に文書化されていないのは残念です。たとえば、L"Explorer"値はSetWindowThemeのMSDNから取得されますが、そのルーチンに提供される可能性のあるパラメーターの公式リストはありません。

于 2012-12-26T15:29:50.313 に答える
0

MSDN によると、Visaul スタイルは Windows XP Home Edition、Windows XP Professional x64 Edition、および Windows Server 2003 でのみサポートされています。

このリンク (VisualStyleRenderer クラス)備考セクションの最後と、このリンクの備考セクションを参照してください。また、どちらも true を返しますが、XP と Server 2003 以外の OS ではサポートされていないようです!VisualStyleRenderer.IsSupportedVisualStyleInformation.IsSupportedByOS

于 2012-12-26T11:51:15.223 に答える