3

ToolStripMenuItem下の画像の「すべてのドキュメントを閉じる」項目のように、に画像を追加できることを私は知っています。

いくつかの ToolStripMenuItems を含むメニュー

ただし、私が達成したいのは次のようなものです。

ここに画像の説明を入力

これは、アイテムのテキストの横に画像を配置することですが、チェック スペースと重ならないようにします。少し検索しましたが、これを実行できる Winforms コントロールが見つかりませんでした。教えてください。それとも、自分で実装する必要がありますか? ありがとうございました。

編集:答えてくれてありがとう!週末以降は受け付けます。

4

4 に答える 4

3

カスタムペイントを使用する必要があります。これを実装する方法はいくつかありますが、いくつかのカスタム を使用する方法を紹介したいと思いますToolStripRenderer。以下は単なるデモコードです。自分で改善できます。便宜上、各内部イメージを対応するアイテムに保存します。Tag

public class CustomRenderer : ToolStripProfessionalRenderer
{
    int innerImagePadding = 2;
    protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) {
        Image img = e.Item.Tag as Image;
        if(img == null) base.OnRenderItemText(e);
        else {
          e.Graphics.DrawImage(img, e.Item.ContentRectangle.Left + e.Item.Bounds.Height + innerImagePadding,
                               e.Item.ContentRectangle.Top + innerImagePadding, 
                               Math.Max(1, e.Item.ContentRectangle.Height - innerImagePadding*2), 
                               Math.Max(1, e.Item.ContentRectangle.Height - innerImagePadding*2));              
          Rectangle textRect = new Rectangle(e.Item.ContentRectangle.Left + e.Item.Bounds.Height*2, 
                               e.Item.ContentRectangle.Top +1, 
                               e.TextRectangle.Width, 
                               e.TextRectangle.Height);
          e.Graphics.DrawString(e.Text, e.TextFont, new SolidBrush(e.TextColor), textRect);
       }
    }
}

//Usage
ContextMenuStrip cm = new ContextMenuStrip();
cm.Items.Add(new ToolStripMenuItem("Clear all", myImage) {Tag = myImage});
cm.Items.Add(new ToolStripMenuItem("Remove all", myImage){Tag = myImage});
this.ContextMenuStrip = cm; //set the ContextMenuStrip for the form
//set the custom Renderer
cm.Renderer = new CustomRenderer();

ここに画像の説明を入力

于 2013-11-08T14:59:26.597 に答える
2

デザイナーから行うことはできませんが、親の DropDown プロパティを ToolStripDownDownMenu 項目にキャストして Show プロパティにアクセスすることで、余分なマージンを表示できます。

public Form1() {
  InitializeComponent();
  ((ToolStripDropDownMenu)FileMenuItem.DropDown).ShowCheckMargin = true;
  ((ToolStripDropDownMenu)FileMenuItem.DropDown).ShowImageMargin = true;
}

結果:

ここに画像の説明を入力

于 2013-11-08T14:50:45.883 に答える
1

イベントを使用して、コントロールのどこにでもペイントできますpaint。例えば ​​-

void myToolStripMenuItem1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawImage(Image.FromFile("open_icon.jpg"), 0, 0);
}

これにより、画像が (0,0) の位置に配置されます。どこにでも置くことができます。

于 2013-11-08T14:35:22.973 に答える
0

この機能を持つ標準の .NET API にはコントロールがないため、新しい機能として自分で作成する必要があります。

ただし、この「新しい」機能を使用する頻度に応じて、効率的な実装方法が存在する可能性があります。適切に機能すると思われる解決策の 1 つは、これらの画像のサイズが固定されているという事実を利用し、それに応じてテキストをインデントすることです。

次のようなアプローチを検討してください。

using System.Drawing;

const string MENU_TEXT_INDENT = "           ";

private void MenuItemWithImage_Paint(Object sender, PaintEventArgs e) {
    ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
    if (!menuItem.Text.StartsWith(MENU_TEXT_INDENT)) {
        menuItem.Text = menuItem.Text.Insert(0, MENU_TEXT_INDENT);
    }
    Image img = menuItem.Image;
    e.Graphics.DrawImage(img, new Point(0, 0));
    menuItem.Refresh(); // May be needed to reflect changes - try without though!
}

次に、このイベント ハンドラーをPaint各メニュー項目のイベントにアタッチして、この方法でレンダリングする画像を指定すると、これが機能するはずです。(スペースの増減が必要な場合があります。自分でテストしたことはありません)

于 2013-11-08T14:35:38.947 に答える