3

こんにちは、私はカスタムコントロールを書いているときに問題があります。私のコントロールは Windows.Forms.Control を継承しており、OnPaint メソッドをオーバーライドしようとしています。別のコントロールを追加すると、フォームに 1 つのコントロールを含める場合にのみ機能するため、問題は少し奇妙です。2 番目のコントロールは描画されませんが、すべてのコントロールに対して OnPaint メソッドが呼び出されます。だから私が望むのは、すべてのカスタムコントロールが描画されることです。ここにあるのは私のコードだけではありません:

コードを実行すると、画面に赤い四角形が 1 つだけ表示されることがわかります。

public partial class Form1 : Form
{
    myControl one = new myControl(0, 0);
    myControl two = new myControl(100, 0);

    public Form1()
    {
        InitializeComponent();
        Controls.Add(one);
        Controls.Add(two);
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }
}


public class myControl:Control
{
    public myControl(int x, int y)
    {
        Location = new Point(x, y);
        Size = new Size(100, 20);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        Pen myPen = new Pen(Color.Red);
        e.Graphics.DrawRectangle(myPen, new Rectangle(Location, new Size(Size.Width -         1, Size.Height - 1)));



    }


}
4

2 に答える 2

2

私はあなたがこのようなものを探していると思います:

e.Graphics.DrawRectangle(Pens.Red, new Rectangle(0, 0, 
                                                this.ClientSize.Width - 1,
                                                this.ClientSize.Height - 1));

グラフィックオブジェクトはコントロールの内部用であるため、ここでの使用Locationはあまり効果的ではありません。座標系は、コントロールのクライアント領域の左上隅から0,0から始まります。

また、組み込みのPens色を使用することもできます。それ以外の場合は、独自の「新しい」ペンを作成する場合は、必ず廃棄してください。

于 2012-05-22T21:18:08.250 に答える
0

LarsTech は私を打ち負かしましたが、その理由を理解する必要があります。

コントロール内のすべての描画は、座標が自己相対である "キャンバス" (Windows ではデバイス コンテキストと呼ばれます) に対して行われます。左上隅は常に 0, 0 です。

Width と Height は ClientSize または ClientRectangle にあります。これは、ウィンドウ (コントロールは Windows のウィンドウです) には、クライアント領域と非クライアント領域の 2 つの領域があるためです。ボーダレス/タイトルバーのないコントロールの場合、これらの領域はまったく同じですが、将来を保証するために、常にクライアント領域にペイントする必要があります (OS が通常ペイントする非クライアント ビットをペイントするまれな状況が発生しない限り)。あなたのために)。

于 2012-05-22T21:24:25.010 に答える