1


0

RenderModeが "System"の場合、ToolStripMenuItemはチェックマークとImage(アイコン)を表示できませんか?

私のWindows Formsアプリケーションには + MenuStrip +`があり、一部のメニュー項目( `+ ToolStripMenuItem +)にはアイコン( `+ ToolStripMenuItem.Image +`プロパティを設定する)があります。

`+ MenuStrip `の ` RenderMode `プロパティが ` ToolStripRenderMode.System `に設定されている場合、 ` Checked `または ` CheckOnClick +`プロパティがtrueでメニュー項目にアイコンがある場合、チェックマークは表示されません。

`+ MenuStrip.RenderMode `プロパティを ` ToolStripRenderMode.Professional `または ` ToolStripRenderMode.RenderManagerMode +`に切り替えると表示されます。

残念ながら、これは私のアプリに必要なので問題です。

  1. マーキーモードの `+ ProgressBar `なので、 これを機能させるには、 ` Application.EnableVisualStyles()+`が必要です。

  2. アプリには「フラットな」視覚スタイルが必要です。 `+ Application.EnableVisualStyles()`への呼び出しを省略し、MenuStripのデフォルトの ` ToolStripRenderMode.RenderManagerMode +`を残します。 しかし、それから私は私のマーキーProgressBarを得ることができません!

  3. `+ RenderMode `を ` ToolStripRenderMode.System +`に設定すると解決します ルックアンドフィールの要件。ただし、アイコン付きのメニューアイテムをチェックする機能は無効になります。

私の要求をすべて満たす方法はありますか? 私は何かが足りない? 見てくれてありがとう。

2 Answer


3


うわー、私はそう困った! 今私は私がある深刻なコードに取り組んでいなければならないことを知っている。

とにかく、答えは次のとおりです。+ ToolStripSystemRenderer + `を継承するクラスを作成して、独自の + ToolStripRenderer + `を実装します。

項目を描画するメソッドを自分のコードでオーバーライドします。 これは私が特にチェックしたアイテムを描画するものを探していたものです。 `+ ToolStripMenuItem +`の画像がないかどうかをチェックします。

protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e)
{
    base.OnRenderItemCheck(e);
    if (e.Item.Selected)
    {
        Rectangle rect = new Rectangle(3, 1, 20, 20);
        Rectangle rect2 = new Rectangle(4, 2, 18, 18);
        SolidBrush b = new SolidBrush(Color.FromArgb(49, 106, 197));
        SolidBrush b2 = new SolidBrush(Color.Orange);

        e.Graphics.FillRectangle(b, rect);
        e.Graphics.FillRectangle(b2, rect2);
        e.Graphics.DrawImage(e.Image, new Point(5, 3));
    }
    else
    {
        Rectangle rect = new Rectangle(3, 1, 20, 20);
        Rectangle rect2 = new Rectangle(4, 2, 18, 18);
        SolidBrush b = new SolidBrush(Color.FromArgb(49, 106, 197));
        SolidBrush b2 = new SolidBrush(Color.Orange);

        e.Graphics.FillRectangle(b, rect);
        e.Graphics.FillRectangle(b2, rect2);
        e.Graphics.DrawImage(e.Image, new Point(5, 3));
    }
}


0


私はまたもっと簡単な方法に出くわしました:

メニュー項目をContextMenuStripに入れて、それをDropDownButtonの* DropDown *プロパティに割り当てるだけです。

これがPaintメソッドを上書きしたくないという人に役立つことを願っています。