質問

MenuStripコントロールをビジュアルスタイルの影響を受けるのを防ぐことを試みます。

だから私はMain()で簡単なメニューストリップと無効なビジュアルスタイルを使って簡単なフォームを作成しました:

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

この外観をもたらす(灰色の境界線と背景):

画像の説明を入力して

このフォームの他のコントロールがビジュアルスタイルの影響を受けるところで同じことをしたい(このドロップダウンのみのビジュアルスタイルを無効にしたい)。

だから私はDropDownすべてのToolStripMenuItemのためのビジュアルスタイルを無効にしようとしましたが、それはうまくいきませんでした。それから私は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();Main()が呼び出されている場合、フォームの外観は次の(青):

画像の記述ここで

任意のアイデアこのドロップダウンの外観に影響を与える可能性があるのは何ですか?
私は何が足りないのですか?

ありがとう。

役に立ちましたか?

解決

menustripが母国語のWindowsコントロールではないことを欠いているため、ビジュアルスタイルのテーマの直接影響を受けません。すべてのレンダリングは.NETコードによって行われます。これを行う基本クラスは、ToolStripRenderer、2つの実装を持つ2つの実装です.ToolStripProfessionAlRendererとToolStripSystemRenderer。後者はオペレーティングシステムの外観をエミュレートしようとし、MenustripのRenderModeを "System"に設定することで取得します。エミュレーションはとても、窓7のような後のオペレーティングシステムでとても間違っています。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top