ToolStripDropDownMenuのビジュアルスタイルを無効にします
-
12-12-2019 - |
質問
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と比較していくつかの制限があります。色を変更したい場合は、独自のレンダラを実装してその色テーブルを変更できます。この回答