C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Invalidate(rect)で特定範囲のみ再描画したい


(過去ログ 64 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■37176 / inTopicNo.1)  Invalidate(rect)で特定範囲のみ再描画したい
  
□投稿者/ たこやき (101回)-(2009/06/15(Mon) 11:28:13)

分類:[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, 枠);
    }
}





引用返信 編集キー/
■37178 / inTopicNo.2)  Re[1]: Invalidate(rect)で特定範囲のみ再描画したい
□投稿者/ nori (70回)-(2009/06/15(Mon) 12:26:02)
AAAのOnPaintでBBBとCCCのOnPaintを呼べば良いのでは?
引用返信 編集キー/
■37196 / inTopicNo.3)  Re[2]: Invalidate(rect)で特定範囲のみ再描画したい
□投稿者/ たこやき (102回)-(2009/06/15(Mon) 13:45:02)
No37178 (nori さん) に返信
> AAAのOnPaintでBBBとCCCのOnPaintを呼べば良いのでは?

nori さん、ありがとうございます。いやはや、うまくいきました。
目からうろこです。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -