1

MenuStripコントロールが視覚スタイルの影響を受けないようにしようとしています。

そこで、シンプルなメニュー ストリップと無効なビジュアル スタイルを備えたシンプルなフォームを作成しましたMain()

// Application.EnableVisualStyles(); <-- no visual styles
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

この外観が得られます(灰色の境界線と背景に注意してください):

ここに画像の説明を入力

ここで、このフォームの他のコントロールが視覚スタイルの影響を受ける方法で同じことをしたいと思います (このドロップダウンのみの視覚スタイルを無効にしたい)。

DropDownそのため、最初はすべての視覚スタイルを無効にしようとしましToolStripMenuItemたが、うまくいきませんでした。次に、全体の視覚スタイルを無効にしようとしましMenuStripたが、どちらも機能しませんでした。

カスタム MenuStrip のコードは次のとおりです。

class MPMenuStrip : MenuStrip
{
    [DllImportAttribute("uxtheme.dll")]
    private static extern int SetWindowTheme(IntPtr hWnd, string appname, string idlist);

    protected override void OnHandleCreated(EventArgs e)
    {
        // first attempt:
        foreach (ToolStripMenuItem menuItem in this.Items)
            SetWindowTheme(menuItem.DropDown.Handle, "", "");

        // second attempt:
        SetWindowTheme(this.Handle, "", "");
        base.OnHandleCreated(e);
    }
}

カスタムMenuStripコントロールを使用しているにもかかわらず、 Application.EnableVisualStyles();inMain()が呼び出されている場合、フォームの外観は次のようになります (青):

ここに画像の説明を入力

このドロップダウンの外観に他に何が影響する可能性がありますか?
私は何が欠けていますか?

ありがとう。

4

1 に答える 1

1

MenuStripはネイティブのWindowsコントロールではないため、ビジュアルスタイルのテーマの影響を直接受けないということを見逃しています。すべてのレンダリングは.NETコードによって行われます。これを行う基本クラスはToolStripRendererであり、ToolStripProfessionalRendererとToolStripSystemRendererの2つの実装が提供されています。後者はオペレーティングシステムの外観をエミュレートしようとします。MenuStripのRenderModeを「System」に設定することで取得できます。エミュレーションはまあまあで、Windows7のような後のオペレーティングシステムではまったく間違っています。

実際のオペレーティングシステムのルックアンドフィールが必要な場合は、代わりにMainMenuを使用してください。MenuStripと比較していくつかの制限があります。色を変更したい場合は、独自のレンダラーを実装して、そのカラーテーブルを変更できます。この答えに示されているように。

于 2012-05-21T12:53:50.117 に答える