|
分類:[C#]
VS2008 C#
いつも大変お世話になっています。
もしかしたらむちゃくちゃなやり方をしているのかもしれませんが、
Controlより派生させたAAAクラスに、空の自作クラスBBBを貼り付け、
そのBBBクラスにAAAからWndProcメッセージを送っています。
そのBBBクラスをさらに継承させたCCCクラスを作成して、
AAAクラスにBBBとCCCを描画させています。
そしてフォーム上でマウスを動かすと、Invalidate(Rectangle)で
一部が再描画されるはずなのですが、
BBBクラスでは正しく描画されますが、CCCクラスでは全体の再描画に
なってしまいます。
原因は、
> if (m.Msg == WM_PAINT)
> OnPaint(new PaintEventArgs( 親.CreateGraphics(), 枠));
であることはわかるのですが、どうすればいいのかわかりません。
ややこしく、またむちゃくちゃなやり方なのかも知れませんが、
ご指導お願いします。
参考プログラム
using System;
using System.Drawing;
using System.Windows.Forms;
namespace QQ
{
public partial class Form1 : Form
{
AAA aa = new AAA();
public Form1()
{
InitializeComponent();
aa.BackColor = Color.DarkGray;
aa.Location = new Point(50, 50);
aa.Size = new Size(250, 200);
this.Controls.Add(aa);
}
protected override void OnMouseMove(MouseEventArgs e)
{
aa.Invalidate(new Rectangle(50, 50, 10, 10));
}
}
}
class AAA : Control
{
public delegate void MsgHandler(ref Message e);
public event MsgHandler Msg送信;
BBB bb = new BBB();
CCC cc = new CCC();
public AAA()
{
bb.親 = this;
cc.親 = this;
bb.枠 = new Rectangle(10, 10, 100, 150);
cc.枠 = new Rectangle(120, 10, 100, 150);
Msg送信 += bb.WndProc;
Msg送信 += cc.WndProc;
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (Msg送信 != null) Msg送信(ref m);
}
}
class BBB
{
const int WM_PAINT = 0xF;
public event PaintEventHandler Paint;
public Rectangle 枠 ;
public Control 親;
public virtual void OnPaint(PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.Pink, 枠);
if (Paint != null) Paint(this, e);
}
public virtual void WndProc(ref Message m)
{
> 原因箇所 ただ解決方法がわかりません
if (m.Msg == WM_PAINT)
OnPaint(new PaintEventArgs( 親.CreateGraphics(), 枠));
}
}
class CCC : BBB
{
public override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.FillRectangle(Brushes.SkyBlue, 枠);
}
}
|