DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Buttonの表面を自分で描画する

環境/言語:[WinXP VS2005 C#]
分類:[.NET]

お世話になります。
早速ですが掲題の件に関して質問させていただきます。

本HPの
http://dobon.net/vb/dotnet/control/btnownerdraw.html
に関しての質問なのですが、大量のボタンを配置する際にも
この方法でよいのでしょうか?
(例えば100個とかのボタンで行う)

UIをグラフィカルにする為に各種ボタンに画像を張ろうと考えています。

定石的なやり方があるようでしたら教えて頂けないでしょうか?
よろしくお願いします。
お世話になっております

大量に、つまり何度も同じ事をやる場合は
ボタンを継承してコントロールを作ってしまった方が早いと思います。
■No20641に返信(しろさんの記事)
> 大量に、つまり何度も同じ事をやる場合は
> ボタンを継承してコントロールを作ってしまった方が早いと思います。

そんなことはないと思いますが、これは具体的にどういった根拠ででしょうか?
しろさんご返信有難うございます。

> 大量に、つまり何度も同じ事をやる場合は
> ボタンを継承してコントロールを作ってしまった方が早いと思います。

ユーザコントロール上にボタンを配置して提示したHP上の内容で
作成して見ましたが、正常に表示されません。
 パネル?とボタン両方に画像イメージが表示されているみたいです。
何か他に書くべき事があるのでしょうか?

宜しければ教えてください。

◆やった事
・ユーザコントロールを作成しボタンを配置
・フォーム上に上記のユーザコントロールを配置し
 BackGroundImageを指定

◆書いたコード
public partial class grphBtn : UserControl
{

public grphBtn()
{
InitializeComponent();
this.button.Paint += new PaintEventHandler(Button_Paint);
}

private void Button_Paint(object sender, PaintEventArgs e)
{
Button btn = (Button)sender;
//ボタンの背景画像をボタンの大きさに合わせて描画
e.Graphics.DrawImage(this.BackgroundImage, btn.ClientRectangle);

//ボタンのTextを描画する準備
StringFormat sf = new StringFormat();

//文字列を真ん中に描画
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;

//&がアンダーラインになるようにする
sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show;
//Brushの作成

Brush brsh = new SolidBrush(btn.ForeColor);

//文字列を描画
e.Graphics.DrawString(btn.Text, btn.Font, brsh, btn.ClientRectangle, sf);
brsh.Dispose();

}
お世話になっております。

>じゃんぬねっと様
「同じ処理を複数書くより一箇所にまとめて書いた方が良い」
と思って言ったのですが……。

言われてみるとループでイベントハンドラを追加する場合なら
わざわざ分ける必要はないですよね(汗


>とけい様
と、言う訳で申し訳ありません。少し訂正させて下さい。

for等でイベントハンドラに同じメソッドを割り当てる事も出来ます。
--------------------------------------------------------------------
//btnはボタンの配列です
for (int i = 0; i < btn.Length; i++)
{
btn[i].Paint += new PaintEventHandler(Button_Paint);
}
--------------------------------------------------------------------

ユーザーコントロールの不具合は
「ユーザーコントロールのBackgroundImageプロパティ」に
画像を指定している為だと思います。
ユーザーコントロール内のボタンのBackgroundImageプロパティに
画像を指定してみて下さい。
しろさん たびたびの返信有難うございます。

> for等でイベントハンドラに同じメソッドを割り当てる事も出来ます。
これはコントロール配列にすると言うことですね。


> ユーザーコントロールの不具合は
> ユーザーコントロール内のボタンのBackgroundImageプロパティに
> 画像を指定してみて下さい。
これだと、常に同じ画像になってしまいますよね?
 (ユーザコントロール内で画像を配置している為)
これを、通常のボタンオブジェクトの様に設定する方法は無いのでしょうか?
質問ばかりで申し訳ありませんがよろしくお願いします。
お世話になっております。

>とけい様
>これはコントロール配列にすると言うことですね。
そうですね。
後は画面上に存在する全てのコントロールに対して
「ボタンであればイベント追加する」というチェックを行う。でしょうか
(数次第で処理速度が凄い事になりそうですが……)

>ユーザーコントロール
ちょっとどういう処理をされてるのか想像出来ないのですが、
ユーザーコントロール外からボタンのBackgroundImageプロパティに
アクセスしたいのであれば
「ユーザーコントロール内のボタンのアクセシビリティレベル」をpublicにしたり、
ユーザーコントロールにプロパティを追加して
「そのプロパティの値=BackgroundImageプロパティの値」とする。
等の方法があります。

あるいは、ユーザーコントロールではなく
Buttonを継承したクラスを作成してみるとか……。
--------------------------------------------------
class ImageBtn:Button
{
//処理
}
--------------------------------------------------
お世話になります。

> 「ボタンであればイベント追加する」というチェックを行う。でしょうか
> (数次第で処理速度が凄い事になりそうですが……)
手動でボタンを配置してるので全てをChkする必要は今回は無いと思います。
確かに全てをCHKするなら処理がすごそうですね(^^;

> >ユーザーコントロール
提示して頂いた項目で色々試してみます。

貴重なお時間を割いていただき有難うございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板