2

次の質問であなたの助けが必要です (.Net 3.5 と Windows フォームを使用):

フォーム上にあるコンボボックス (Windows フォーム) の真ん中に線を引きたいだけです。私が使用するコードは次のとおりです。

void comboBox1_Paint(object sender, PaintEventArgs e)
{
  e.Graphics.DrawLine(new Pen(Brushes.DarkBlue),
                      this.comboBox1.Location.X,
                      this.comboBox1.Location.Y + (this.comboBox1.Size.Height / 2),
                      this.comboBox1.Location.X + this.comboBox1.Size.Width,
                      this.comboBox1.Location.Y + (this.comboBox1.Size.Height / 2));
}

ペイント イベントを発生させるには:

private void button1_Click(object sender, EventArgs e)
{
  comboBox1.Refresh();
}

コードを実行してボタンを押すと、線が描画されません。デバッグでは、ペイント ハンドラーのブレークポイントにヒットしていません。奇妙なことに、MSDNでは ComBox のイベント リストにペイント イベントがありますが、VS 2010 では IntelliSense は ComboBox のメンバーでそのようなイベントを見つけられません。

ありがとう。

4

2 に答える 2

2
public Form1() 
{
  InitializeComponent();
  comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
  comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem);
}

void comboBox1_DrawItem(object sender, DrawItemEventArgs e) {
  e.DrawBackground();
  e.Graphics.DrawLine(Pens.Black, new Point(e.Bounds.Left, e.Bounds.Bottom-1),
    new Point(e.Bounds.Right, e.Bounds.Bottom-1));
  TextRenderer.DrawText(e.Graphics, comboBox1.Items[e.Index].ToString(), 
    comboBox1.Font, e.Bounds, comboBox1.ForeColor, TextFormatFlags.Left);
  e.DrawFocusRectangle();
}
于 2012-08-08T10:26:46.340 に答える
1

Paintイベントは発生しません。
あなたが望むことは次の場合にのみ可能ですDropDownStyle == ComboBoxStyle.DropDownList

        comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
        comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
        comboBox1.DrawItem += (sender, args) => 
        {
            var ordinate = args.Bounds.Top + args.Bounds.Height / 2;
            args.Graphics.DrawLine(new Pen(Color.Red), new Point(args.Bounds.Left, ordinate),
                new Point(args.Bounds.Right, ordinate));
        };

このようにして、選択したアイテム領域を自分で描画できます。

于 2012-08-08T10:29:19.130 に答える