Visual Studio 2008で、VB.NETのWindowsアプリを作成しています。

Buttonクラスを継承した「ButtonEx」コントロールを作成し、フォーム上に設置して初期表示された
ときに自動的に条件に応じてボタンの外観を変えたいです。

ButtonExボタンを配置する際、デザイナでそのボタンの「Tag」プロパティに文字列を設定し、
その文字列に応じて外観を変える、変えないを判別したいです。

ただ、外観を変えるコードをオーバーライドするNewコンストラクタ内で記述しても、まだTagプロパティには
条件となる値が代入されておらず、意味がありません。

ButtonEx内で、どのメソッドをオーバーライドするなどして外観を変えるコードを記述すればよいでしょうか。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2011/06/13 11:08:32
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:heke2mee No.2

回答回数162ベストアンサー獲得回数43

ポイント60pt

形状はそのままで単純な見た目だけ変更するなら

のようにビットマップをセットするだけです。

'ボタンに張り付けるイメージ

Button1.Image = bmp

'表示位置は中央

Button1.ImageAlign = System.Drawing.ContentAlignment.MiddleCenter


ビットマップを使用しない場合や、ボタンの形状を変更するには

Paintのイベントで描画することになります。

また、形状を三角や丸などに変更した場合は、

クリック時やマウスオーバーしたときの

当たり判定なども変える必要があります。


「コントロールの形状を変更する」が参考になると思います。

http://msdn.microsoft.com/ja-jp/library/aa289517%28v=vs.71%29.aspx

id:kyoko55

質問が伝わっていないようなのですが、

外観の変え方ではく、

ButtonExクラス内で、親クラスの「どのメソッド」をオーバーライドしてその中に変えるコードを挿入すればよいでしょうか。

下記のコメントをご覧ください。

2011/06/11 11:28:29

その他の回答2件)

id:TinqWill No.1

回答回数71ベストアンサー獲得回数11

ポイント20pt

プロパティを使うのはいかがですか?

http://dobon.net/vb/dotnet/vb6/property.html

http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard47.htm

プロパティなら、関数のようにいろいろな設定ができます。デザイナのプロパティのところにも表示されます。

最初から決まったスタイルしかないなら、文字列を指定するより列挙体を使ったほうが間違いがなくなります。

id:kyoko55

質問が伝わっていないようなのですが、

外観の変え方ではく、

ButtonExクラス内で、親クラスの「どのメソッド」をオーバーライドしてその中に変えるコードを挿入すればよいでしょうか。

下記のコメントをご覧ください。

2011/06/11 11:28:34
id:heke2mee No.2

回答回数162ベストアンサー獲得回数43ここでベストアンサー

ポイント60pt

形状はそのままで単純な見た目だけ変更するなら

のようにビットマップをセットするだけです。

'ボタンに張り付けるイメージ

Button1.Image = bmp

'表示位置は中央

Button1.ImageAlign = System.Drawing.ContentAlignment.MiddleCenter


ビットマップを使用しない場合や、ボタンの形状を変更するには

Paintのイベントで描画することになります。

また、形状を三角や丸などに変更した場合は、

クリック時やマウスオーバーしたときの

当たり判定なども変える必要があります。


「コントロールの形状を変更する」が参考になると思います。

http://msdn.microsoft.com/ja-jp/library/aa289517%28v=vs.71%29.aspx

id:kyoko55

質問が伝わっていないようなのですが、

外観の変え方ではく、

ButtonExクラス内で、親クラスの「どのメソッド」をオーバーライドしてその中に変えるコードを挿入すればよいでしょうか。

下記のコメントをご覧ください。

2011/06/11 11:28:29
id:ruayarou No.3

回答回数5ベストアンサー獲得回数0

ポイント20pt

コンストラクタ内ではダメですよ。

親のOnPaint() をオーバーライドしないといけないですね。

http://uchukamen.com/Programming1/StarButton/index.htm

  • id:kyoko55

    コードの一部です。

    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クラスのどのメソッドをオーバーライドすれば、よいか。
      ' コンストラクタ内での記述がだめなら、おそらくインスタンスが生成された直後に一度だけ
      ' 呼ばれるメソッドが適当
  • id:TinqWill
    すいません。伝わっていなかったようです。私は外観の変更の仕方を書いたのではありません。

    プロパティとは、外からは変数のように扱えて、内部から見ればメソッドのように扱える、というものです。外から変数のようにプロパティを変更すると、内部ではメソッドのように好きな処理を行えます。
    プロパティが「ほげ」に書き換えられたらこのようにスタイルを変更する、ということが可能になります。
    (詳細は回答のリンクをご覧ください)

    基本的に、変数に見えるメソッドですが、プロパティだとデザイナの変数(プロパティ)一覧にも表示されて、そこで編集ができます。

    また、Tagプロパティを上書きすれば、Tagの中身を変更したときにボタンのスタイルを変更させることも可能です。
  • id:heke2mee
    フォーム(Form1)上に貼り付けたButtonExをデザイン画面で変更すると
    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に設定を持たせないで、アプリケーション構成ファイルに
    設定を記述します。
  • id:kyoko55
    皆さんありがとうございました。
    プロパティについてももっと勉強してみます。
    OnPaintメソッドをオーバーライドしてできました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません