ImageコントロールまたはPictureBoxコントロールを使用して、自作のコマンドボタンを作る方法です。
以下のような場合に利用できます。
- フォーカスの枠を表示したくない
- 任意のデザインのボタンを使用したい
- etc...
通常は、下のようなデザインのボタンですが……
例えば、こんなデザインにすることができます。
作り方は簡単です。……面倒ですが(^^;
まず、Imageコントロールを3つ、配置します。名前をそれぞれ、imgBtn、imgSrcUp、imgSrcDownとしておきます。
imgBtnが自作ボタンの表示に使用するコントロールです。imgSrcUpとimgSrcDownがそれぞれ、「押されていない状態」「押されている状態」の画像です。
そうです。つまり、画像を使ってボタンを作る訳です。
コードウィンドウを開いて、以下のコードを入力します。
Private Sub Form_Load()
'似非ボタンの初期画像セット
imgBtn.Picture = imgSrcUp.Picture
End Sub
'似非ボタン上で(左)ボタンを押された場合
' 画像を「押されているボタン」に変更する
Private Sub imgBtn_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button And vbLeftButton Then
imgBtn.Picture = imgSrcDown.Picture
End If
End Sub
'似非ボタン上でマウスが移動した場合
' (左)ボタンが押されている場合は、似非ボタン上でマウスを
' ドラッグしている状態なので適切な処理を行う
Private Sub imgBtn_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button And vbLeftButton Then
'ボタンの座標を見て、似非ボタンの状態をセット
'(参考)似非ボタン内の座標は 0〜imgBtn.Width-1
' 0〜imgBtn.Height-1
If X < 0 Or Y < 0 _
Or X >= imgBtn.Width Or Y >= imgBtn.Height Then
'マウスが似非ボタンの範囲外にある場合は
'画像を「押されていないボタン」に変更
imgBtn.Picture = imgSrcUp.Picture
Else
'マウスが似非ボタンの範囲内にある場合は
'画像を「押されているボタン」に変更
imgBtn.Picture = imgSrcDown.Picture
End If
End If
End Sub
'似非ボタンの上で(左)ボタンが離された場合
' マウスの座標が似非ボタン内なら、処理を行う
Private Sub imgBtn_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button And vbLeftButton Then
'似非ボタンの画像を「押されていないボタン」に変更
imgBtn.Picture = imgSrcUp.Picture
'ボタンの座標を見て、似非ボタンの状態をセット
'(参考)似非ボタン内の座標は 0〜imgBtn.Width-1
' 0〜imgBtn.Height-1
If X < 0 Or Y < 0 _
Or X >= imgBtn.Width Or Y >= imgBtn.Height Then
'マウスが似非ボタンの範囲外にある場合は処理しない
Else
'マウスが似非ボタンの範囲内にある場合は処理を行う
MsgBox "似非ボタンが押されました。", vbInformation
End If
End If
End Sub
|
説明はコメントとして書いてあるので省略してもいいですよね?
簡単に書いておくと、下のような感じです。
- MouseDownイベント --> ボタンの上でマウスのボタンが押された(押下げられた)
- MouseMoveイベント --> ボタンの上をマウスカーソルが通過中
- MouseUpイベント --> マウスのボタンが離された
上のタイミングでボタンの画像を変えるなどすればいいことになります。
ただし、今回のこのサンプルでは通常のコマンドボタンと同じ動きはしません。
- フォーカスを受け取らない
- マウスのボタンを押下げ中(ボタンの画像がへこんでいる状態)にTabキーなどを押されても反応しない
(通常はフォーカスを失ってボタンのクリックが無効になる)
- アクセスキーがない
例えばこんなものがあります。
まぁ、必ずしも必要な動作かは、その時々ですが。
なお、下でダウンロードできるサンプルには、他のやり方2つも合わせて紹介しています。
ソースを眺めてみるといいと思います。