2

これは、私が以前行っていたものとは異なるアプローチです。

私のコンボ所有者が描いたコンボボックスで、以前のcolprピッカードロップダウンから選択した色で描画される3本の線(実線、ダッシュ、ダッシュドット)を描画します

this.DrawMode = DrawMode.OwnerDrawVariable;
            this.DropDownStyle = ComboBoxStyle.DropDownList;
     protected override void OnDrawItem(DrawItemEventArgs e)
        {
            e.DrawBackground();  
            int startX = e.Bounds.Left + 5;
            int startY = (e.Bounds.Y);
            Point p1=new Point(startX,startY);
            int endX = e.Bounds.Right - 5;
            int endY = (e.Bounds.Y);
             ComboBoxItem item = (ComboBoxItem)this.Items[e.Index];
            Point p2=new Point(endX,endY);
            base.OnDrawItem(e);
            Pen SolidmyPen = new Pen(item.foreColor, 1);
            Pen DashedPen = new Pen(item.foreColor, 1);
            DashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
            Pen DashDot = new Pen(item.foreColor, 1);
            DashDot.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
           // Pen DashedPen = new Pen(item.foreColor, (Int32)this.Items[e.Index]);

            Bitmap myBitmap = new Bitmap(item.Picture);
            Graphics graphicsObj;
            graphicsObj = Graphics.FromImage(myBitmap);
            switch (e.Index)
            {
                case 0:
                    graphicsObj.DrawLine(SolidmyPen, p1, p2);
                    break;
                case 1:
                    graphicsObj.DrawLine(DashedPen, p1, p2);
                    break;
                case 2:
                    graphicsObj.DrawLine(DashDot, p1, p2);
                    break;


            }

これが私がやろうとしていることです。コンボボックスに3本の線(実線、ダッシュ、ダッシュドット)を描画します。

選択した色である青を除いて、コンボボックスに線が表示されません

ありがとう

4

2 に答える 2

2

これを試して。

新しいwinformsアプリケーションを開始しました。ComboBoxに基づいてクラスを作成し、コードを追加して少し変更しました。大きな問題はビットマップ部分にあったと思います。新しいビットマップを作成し、それを描画しますが、作成したビットマップを使用することはありません。作成したコードを保持したい場合は、メソッドitem.Picture=myBitmapの最後に追加する必要があります。しかし、それによってondrawitemが再び呼び出され、無限ループに陥ると思います。item.Pictureに基づいてグラフィックスオブジェクトを作成する代わりに、DrawItemEventArgsで作成したグラフィックスオブジェクトを使用するだけです。

e.Graphics

これが私がしたことです、私はそれを少しきれいにしたと思います。すでにご存知かもしれませんが、以下に示すように、{....}を使用する場合は、常にペン、ブラシ、グラフィックをラップする必要があります。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
}

public class MyComboBox : ComboBox
{
    public MyComboBox()
    {
    this.DrawMode = DrawMode.OwnerDrawVariable;
        this.DropDownStyle = ComboBoxStyle.DropDownList;
    }
    protected override void OnDrawItem(DrawItemEventArgs e)
    {
        e.DrawBackground();
        //I removed you int startX... endy... stuff, unless you want to keep it for readability there is no need
        Point p1 = new Point(e.Bounds.Left + 5, e.Bounds.Y + 5);
        Point p2 = new Point(e.Bounds.Right - 5, e.Bounds.Y + 5);

        //I am not sure why you would want to call the base.OnDrawItem, feel free to uncomment it if you wish though
        //base.OnDrawItem(e);

        switch (e.Index)
        {
            case 0:
                using ( Pen SolidmyPen = new Pen(e.ForeColor, 1))
                e.Graphics.DrawLine(SolidmyPen, p1, p2);
                break;
            case 1:
                using (Pen DashedPen = new Pen(e.ForeColor, 1))
                {
                    DashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
                    e.Graphics.DrawLine(DashedPen, p1, p2);
                }
                break;
            case 2:
                using (Pen DashDot = new Pen(e.ForeColor, 1))
                {
                    DashDot.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
                    e.Graphics.DrawLine(DashDot, p1, p2);
                }
                break;


        }
    }
}
于 2012-06-05T11:26:09.093 に答える
1

同様の方法を使用してコンボボックスを描画します。しかし、GDI+は例外をスローし続けます。これはWindowsXPでは正常に機能しますが、Windows7では機能しません。

だから私はそれをハックで修正しなければなりませんでした。

フォームが最初に表示されてから100ミリ秒後に、イベントを発生させるタイマーを追加しました。このイベントは、コンボボックスリストの最初の項目を表示します。

private void timer1_Tick(object sender, EventArgs e)
{
    // Use a short 100 ms delay before showing the default items 
    // in the dropdown lists
    predefinedComboBox.SelectedIndex = 0;

    // Disable the timer
    timer1.Enabled = false;
}

レイアウトイベントは早すぎました。コントロールはまだ描画する準備ができていませんでした。そのため、例外がスローされました。目的の効果を達成するために他にどのようなイベントを使用できるかわかりません。

于 2012-09-27T18:24:04.313 に答える