- PR -

コントロールクラスの継承について

1
投稿者投稿内容
DUKE更家
会議室デビュー日: 2006/04/19
投稿数: 14
投稿日時: 2006-04-19 22:10
こんにちわ。コントロールの継承についてわからないことがあります。
参考にできるサンプルやサイトがありましたらご教授ください。
宜しくお願いします。

環境:
WinXP VS2005 .NetFramework2.0 Windowsアプリケーション

やりたいこと:
ボタンクラス(System.Windows.Forms.Button)を継承したクラス(CustomButton)
を作成して、あらかじめプロパティを設定しておくことで、
ツール内のすべてのボタンデザインの統一化を図ろうとしています。

問題点:
CustomButtonクラス内でOnPaintのイベントを取って、
自身の背景色を変更させようとしたのですが、↓これでは変更されません。
public class CustomButton : System.Windows.Forms.Button
{
public CustomButton()
{
this.OnPaint += new EventHandler(CustomButton_OnPaint);
}

private void CustomButton_Resize(object sender, EventArgs e)
{
this.BackColor = Color.Red;
this.Refresh();
}
}

懸念点:
CustomButtonクラスを使用している所で、
OnPaintのイベントを取ると背景色を変更できます。
public partial class Form1 : Form
{
private CustomButton customButton1;
public Form1()
{
InitializeComponent();

// CustomButton
customButton1 = new CustomButton();
this.customButton1.Resize += new EventHandler(customButton1_Resize);

// Form1
this.Controls.Add(customButton1);
}

void customButton1_Resize(object sender, EventArgs e)
{
this.customButton1.BackColor = Color.Red;
}
}

なんとなくだめな理由はわかるのですが、
具体的にCustomButtonクラス内でどう記述すればいいのかわかりません。

DUKE更家
会議室デビュー日: 2006/04/19
投稿数: 14
投稿日時: 2006-04-19 22:16
補足:
OnPaintは単に例として出しています。
OnPaint内でのオーナードローがわからないわけではありません。

イベントが取れているのに、CustomButtonクラス内でのプロパティ変更が
呼び出し元の画面に反映されていないというのが困っている所になります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-19 22:24
引用:

DUKE更家さんの書き込み (2006-04-19 22:10) より:

this.OnPaint += new EventHandler(CustomButton_OnPaint);


CustomButton_OnPaint の実装はどうなっているのですか?
ここで何もしていない (基底クラスメソッドの呼び出しをしていない) だけじゃないのですか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
DUKE更家
会議室デビュー日: 2006/04/19
投稿数: 14
投稿日時: 2006-04-19 22:35
はい。そうです。
private void CustomButton_Resize(object sender, EventArgs e)
{
this.BackColor = Color.Red;
this.Refresh();
}

これしかやっていません。
基底クラスを呼び出すというのは、
具体的にどう書いたらよいのでしょうか?

↓こんなのを書いてみたのですが、だめでした。
base.Resize += new EventHandler(CustomButton_Resize);

すいません。宜しくお願いします。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-04-19 22:58
Paint と Resize がごっちゃになっていて、よく分からないコードになっています。
もう一度整理して投稿してください。

後、基本となる Button クラスは Paint で何を行っていると思いますか?

_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-19 23:02
引用:

DUKE更家さんの書き込み (2006-04-19 22:35) より:

これしかやっていません。
基底クラスを呼び出すというのは、
具体的にどう書いたらよいのでしょうか?


というより、今の実装の「意味合い」がわかんないんですよ。
「OnPaint は例だから」はわかりましたが、それでも理由にならない実装があるのです。
例だろうと何だろうと、目的を持って実装をするわけですが、その「目的」がわからないのです。

BackColor が Resize イベントで固定化 (しかも、Form からも、内部でも) している理由がわかりません。

もっと単純に言えば、何を Custom にしたくて CustomButton と呼んでいるのでしょうか?
Refresh メソッドを呼んでいる点などからしても、何か BackColor に関して誤解をしていると思います。

意図がわかっていないだけに、私の発言が間違っている可能性は多いにあります。
間違っていたら、すみません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
DUKE更家
会議室デビュー日: 2006/04/19
投稿数: 14
投稿日時: 2006-04-20 00:06
すいません。ResizeとPaintがごっちゃになっていました。
シンプルに説明しようとして逆に失敗してしまいました。もう一度説明させてください。

CustomButtonは、外部xmlファイルで定義したカラー値を読み込んで自身の背景を設定するボタンです。
CustomButtonのコンストラクタでxmlファイルを読みにいっています。
デザイナ上でForm1にCustomButtonを貼付けます。(UserControlのように使います)
貼付けた時点で(自動でコンパイルされて?)xmlファイルの色がForm1のCustomButtonに反映されます。
色定義xmlファイルは更新されるものなので、更新するとForm1のCustomButtonの色も変わって欲しいのですが、
貼付けた時の色を維持してしまいます。

結局折角外部ファイルにしているのに、更新されるたびにForm1にCustomButtonを再度張り直す形になってしまい困っていました。

デザイナで貼付けてしまうと実行時のCustomButtonコンストラクタはスルーされてしまうのでしょうか?

もう1点気になっているのは、
CustomButtonクラス内の →this.BackColor
Form1クラス内の →customButton1.BackColor
は同じものを指していないのでしょうか?
DUKE更家
会議室デビュー日: 2006/04/19
投稿数: 14
投稿日時: 2006-04-20 00:42
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14796&forum=7

↑こちらの書き込みと同じ内容でした。
説明が下手で申し訳ございません。

DefaultValueAttlibuteで解決しました。
1

スキルアップ/キャリアアップ(JOB@IT)