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


若葉印  2005-07-27 21:19:06  No: 91118  IP: [192.*.*.*]

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

編集 削除
特攻隊長まるるう  2005-07-28 10:49:58  No: 91119  IP: [192.*.*.*]

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

編集 削除
若葉印  2005-07-28 15:08:52  No: 91120  IP: [192.*.*.*]

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

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

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

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

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

編集 削除
特攻隊長まるるう  2005-07-28 15:38:26  No: 91121  IP: [192.*.*.*]

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

編集 削除
若葉印  2005-08-01 10:21:19  No: 91122  IP: [192.*.*.*]

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

編集 削除
特攻隊長まるるう  2005-08-01 12:08:36  No: 91123  IP: [192.*.*.*]

>この状態で別のコントロールのイベントが発生すると表示が元の状態(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 14:34:52  No: 91124  IP: [192.*.*.*]

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

編集 削除
特攻隊長まるるう  2005-08-01 14:58:58  No: 91125  IP: [192.*.*.*]

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

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

編集 削除