私は階層化されたフォームを扱っていて、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;
誰かが私が間違っていることを教えてもらえますか? ありがとう。