Image付きのボタンを押下された(pushed)状態で表示するには


若葉印  2005-07-28 06:19:06  No: 91118

.NETでImage付きのボタンを押下された(pushed)状態で表示するにはどうすればよいのでしょうか。
DrawButtonを使用して,ボタンを押下された状態にすることはできるのですが,Imageを表示することができません。


特攻隊長まるるう  2005-07-28 19:49:58  No: 91119

引数の graphics と rectangle を使って
Graphics.DrawImage メソッドが利用できませんか?


若葉印  2005-07-29 00:08:52  No: 91120

ありがとうございます。
Graphics.DrawImgeで表示できました。

Dim グラフィックス As System.Drawing.Graphics = Graphics.FromHwnd(ボタン.Handle)

ControlPaint.DrawButton(グラフィックス, 表示場所, ButtonState.Pushed)
グラフィックス.DrawImage(ボタン.Image, 表示場所)

しかし,ここで新たな問題が。
この状態で別のコントロールのイベントが発生すると表示が元の状態(Normal)に戻ってしまいます。

この状態を保持するにはどうすればよいのでしょうか。


特攻隊長まるるう  2005-07-29 00:38:26  No: 91121

実際にボタンで調べてないんで一般的な回答を…
>この状態で別のコントロールのイベントが発生すると表示が元の状態(Normal)に戻ってしまいます。
多分、再描画処理が走ったからだと思います。
対象コントロールの Paint メソッドをオーバーライド
して、再描画のたびに描画してやれば、その状態で
保持できると思います。


若葉印  2005-08-01 19:21:19  No: 91122

OnPaint methodにoverridesしてみましたが,状況は変わりません。


特攻隊長まるるう  2005-08-01 21:08:36  No: 91123

>この状態で別のコントロールのイベントが発生すると表示が元の状態(Normal)に戻ってしまいます。
テストしましたが、こちらでは再現されませんでした。
描画処理が実行されていないか、後から走るどこか別の描画処理の
影響でしょう。新規プロジェクトでボタンを2個配置し、以下の
コードを実行して下さい。Button2.Click で描画され、その後、
Button1.Click で本来の描画処理が行われるはずです。他の
コントロールを貼り付けてイベントを起こしても Button1 の
再描画処理は走りません。
Me.Refresh() をコメントから戻せば本来の描画処理が走って
しまいます。そのような処理を行ってる部分を修正して下さい。
[VB.NET]
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        With Me.Button1
            Dim wGraphics As System.Drawing.Graphics = Graphics.FromHwnd(.Handle)
            Dim wRect As New Rectangle(0, 0, .Width, .Height)
            ControlPaint.DrawButton(wGraphics, wRect, ButtonState.Pushed)
            wGraphics.DrawImage(.Image, wRect)
        End With
        'Me.Refresh()
    End Sub


若葉印  2005-08-01 23:34:52  No: 91124

確かに上記のように,button2のclickでbutton1のpushed表示を行うと,その後別のコントロールのイベントを発生させても表示はかわりません。
しかしbutto1のclickでbutton1のpushed表示をさせた後では,その状態が解除されてしまいます。
あくまでも操作したボタンの表示を変更したいのですが,何か根本的に間違っているのでしょうか?


特攻隊長まるるう  2005-08-01 23:58:58  No: 91125

質問の内容をもう一度整理して下さい。
>この状態で別のコントロールのイベントが発生すると表示が元の状態(Normal)に戻ってしまいます。
という風に書かれたので、それが再現されない事。及び pushed 表示が
ボタン自身の再描画処理が走るまで継続される事。…を確認するための
サンプルを示したまでです。

>しかしbutto1のclickでbutton1のpushed表示をさせた後では,その状態が解除されてしまいます。
ボタン自身のイベントでは再描画処理が走る事を分かり易くしただけで
意図通りの動きです。解決するには前々回の回答通り
>対象コントロールの Paint メソッドをオーバーライド
するか、ボタン自身の Paint イベントで描画してやれば
(オーバーライドまでしなくとも実現できますね(汗))
解決する話です。Button1.Click で描画するなんて
説明してませんが?OnPaint に書いた処理はどうなったんですか???


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加