Buttonクラスを継承した「ButtonEx」コントロールを作成し、フォーム上に設置して初期表示された
ときに自動的に条件に応じてボタンの外観を変えたいです。
ButtonExボタンを配置する際、デザイナでそのボタンの「Tag」プロパティに文字列を設定し、
その文字列に応じて外観を変える、変えないを判別したいです。
ただ、外観を変えるコードをオーバーライドするNewコンストラクタ内で記述しても、まだTagプロパティには
条件となる値が代入されておらず、意味がありません。
ButtonEx内で、どのメソッドをオーバーライドするなどして外観を変えるコードを記述すればよいでしょうか。
形状はそのままで単純な見た目だけ変更するなら
のようにビットマップをセットするだけです。
'ボタンに張り付けるイメージ
Button1.Image = bmp
'表示位置は中央
Button1.ImageAlign = System.Drawing.ContentAlignment.MiddleCenter
ビットマップを使用しない場合や、ボタンの形状を変更するには
Paintのイベントで描画することになります。
また、形状を三角や丸などに変更した場合は、
クリック時やマウスオーバーしたときの
当たり判定なども変える必要があります。
「コントロールの形状を変更する」が参考になると思います。
http://msdn.microsoft.com/ja-jp/library/aa289517%28v=vs.71%29.aspx
プロパティを使うのはいかがですか?
http://dobon.net/vb/dotnet/vb6/property.html
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard47.htm
プロパティなら、関数のようにいろいろな設定ができます。デザイナのプロパティのところにも表示されます。
最初から決まったスタイルしかないなら、文字列を指定するより列挙体を使ったほうが間違いがなくなります。
コードの一部です。
Public Class ButtonEx
Inherits Button
Public Sub New()
MyBase.New()
If Me.Tag = "ほげ" Then
' Tagプロパティの値に応じて下記のようにボタンの外観を変えたいが、
' この段階では、まだ、デザイナで個々のButtonExインスタンスに設定したTagの
' 値が有効になっていないので、この条件式が真になることは無し。
Me.FlatStyle = System.Windows.Forms.FlatStyle.Flat
End If
End Sub
' 親クラスであるButtonクラスのどのメソッドをオーバーライドすれば、よいか。
' コンストラクタ内での記述がだめなら、おそらくインスタンスが生成された直後に一度だけ
' 呼ばれるメソッドが適当
プロパティとは、外からは変数のように扱えて、内部から見ればメソッドのように扱える、というものです。外から変数のようにプロパティを変更すると、内部ではメソッドのように好きな処理を行えます。
プロパティが「ほげ」に書き換えられたらこのようにスタイルを変更する、ということが可能になります。
(詳細は回答のリンクをご覧ください)
基本的に、変数に見えるメソッドですが、プロパティだとデザイナの変数(プロパティ)一覧にも表示されて、そこで編集ができます。
また、Tagプロパティを上書きすれば、Tagの中身を変更したときにボタンのスタイルを変更させることも可能です。
Form1.Designer.vbにその設定が書き込まれます。
(デフォルトではソリューション エクスプローラーでは非表示)
例)ボタンの貼り付け後に、ButtonEx1.FlatStyleとTagを変更した
Form1.Designer.vbの中身
'Windows フォーム デザイナを使用して変更できます。
'コード エディタを使って変更しないでください。
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.ButtonEx1 = New VBButton.ButtonEx
Me.SuspendLayout()
'
'ButtonEx1
'
Me.ButtonEx1.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.ButtonEx1.Location = New System.Drawing.Point(77, 31)
Me.ButtonEx1.Name = "ButtonEx1"
Me.ButtonEx1.Size = New System.Drawing.Size(75, 23)
Me.ButtonEx1.TabIndex = 0
Me.ButtonEx1.Tag = "AA"
Me.ButtonEx1.Text = "ButtonEx1"
Me.ButtonEx1.UseVisualStyleBackColor = True
これを見るとMe.ButtonEx1をNewした後にプロパティの設定を
しているのが分かります。
Me.ButtonEx1.FlatStyle = System.Windows.Forms.FlatStyle.Flat
の後に
Me.ButtonEx1.Tag = "AA"
が設定されているので、この場合はTagの変更時にMe.ButtonEx1.FlatStyleを
再設定するコードを書けばうまく動きます。
ただ、FlatStyleとTagをファイルに記述する順番がデザイナで確実に決まっているかは
私は知りません。もし逆の順番になってしまった場合は、Tagの変更イベントで
FlatStyleが設定され、そのあとでデザイナがFlatStyleを設定するので
思い通りには動作しません。
一番確実なのは、親フォーム(Form1)のInitializeComponentが
呼び出された後のタイミングです。
今のままで一番簡単な方法は
ボタンのPaintイベントもしくは、OnPaintをオーバーライドする方法です。
ただし、ボタンのFlatStyleを Systemに変更された場合はイベントが
来なくなるのでFlatStyleを外部から変更できないようにする必要があります。
Private buttonStyleFlg As Boolean = True
Private Sub ButtonEx_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
If buttonStyleFlg = True Then
Me.FlatStyle = System.Windows.Forms.FlatStyle.Flat
buttonStyleFlg = False
End If
End Sub
アプリケーション内のボタンのスタイルを一括で揃えるという仕様なら
私だったらFormのベースクラスを作って、フォームのInitializeComponentの
あとでFormに追加されているコントロールを探して、ボタンだったらスタイルを揃えるようにします。
それとボタンのTagに設定を持たせないで、アプリケーション構成ファイルに
設定を記述します。
プロパティについてももっと勉強してみます。
OnPaintメソッドをオーバーライドしてできました。