0

私は階層化されたフォームを扱っていて、Visual Basic .NET で素晴らしい例を見つけましたが、ソースを C# に変換する際に問題が発生しました。Visual Basic .NET の実装では、shadows 修飾子を使用して Form クラスのInvalidate()メソッドを効果的に置き換え、Paint イベントに対して同じことを行います。

Public Shadows Event Paint(ByVal G As Drawing.Graphics)

Public Shadows Sub Invalidate()
    Dim B As New Drawing.Bitmap(ClientSize.Width, ClientSize.Height)
    Dim G As Drawing.Graphics = Drawing.Graphics.FromImage(B) : G.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias

    RaiseEvent Paint(G)

    G.Dispose()
    SetBits(B)
    B.Dispose()
End Sub

コードを C# に変換したので、次のようになります。

public new event PaintEventHandler Paint;

public new void Invalidate()
    {
        Bitmap b = new Bitmap(ClientSize.Width, ClientSize.Height);
        Graphics g = Graphics.FromImage(b);
        g.SmoothingMode = SmoothingMode.AntiAlias;

        Paint(this, new PaintEventArgs(g, Rectangle.Empty));

        g.Dispose();
        SetBits(b);
        b.Dispose();
    }

しかし、メソッドが呼び出されると、NullReferenceException - オブジェクト参照がオブジェクトのインスタンスに設定されていません。

別の実装も試しましたが、同じ例外が発生しました。

    public delegate void PaintEventHandler(Graphics g);
    public event PaintEventHandler Paint;

誰かが私が間違っていることを教えてもらえますか? ありがとう。

4

2 に答える 2

1

イベントを呼び出す前に、nullをチェックする必要があります。

if (Paint != null)   
    Paint(this, new PaintEventArgs(g, Rectangle.Empty));
于 2012-08-22T13:37:15.827 に答える
0

デフォルトでは、Paintイベントには関数が含まれていません。これを実行するには、いくつか追加する必要があります。

Paint += new PaintEventHandler(Form1_Paint);

私が宣言するところ:

void Form1_Paint(object sender, PaintEventArgs e)


プログラムで実行する必要があるのは、関数を呼び出すか、関数をオーバーライドするのではなくonPaint()、イベントに関数を追加することです。Paint

于 2012-08-22T13:48:27.187 に答える