今回はフォームを点滅させてみましょう。
例えば、なにか計算してテキストボックスに結果を出力したときに
終了したことをユーザーに伝えたいとします。
そのときにメッセージボックスでもいいのですが、ウィンドウが点滅したら
イヤでもユーザーの気を引きます。
使うのはFlashWindow()関数です。
この関数はウィンドウのキャプションバーをハイライト(点滅)させてくれます。

Dim Interval As Long
Private Sub Command1_Click()
If Me.Timer1.Enabled = False Then
Me.Timer1.Enabled = True
Me.Command1.Caption = "止める"
Else
Me.Command1.Caption = "Form1をハイライト表示させる"
Me.Timer1.Enabled = False
End If
End Sub
|
プログラムはこれだけです。
FlashWindow()関数は「Private Sub Timer1_Timer()」で使われています。
FlashWindow()関数には、点滅する間隔を設定するパラメータはないので
VBのタイマーコントロールを使って、点滅の間隔を作り出しています。
ダウンロードはこちらから。
ダウンロード
上のプログラムではFlashWindow()関数の第1引数に「Me.hWnd」というのを与えています。
さて、これはなんでしょう?
これはウィンドウハンドルというのを関数に渡しています。
ハンドルというのは、「オブジェクトを特定するための値」です。
つまり、「点滅するのはこのフォーム(ウィンドウ)だ」というのを関数に教えているのです。
実はFlashWindow()関数を拡張したFlashWindowEx()関数というのがあります.
この関数はFlashWindow()関数よりももっと自由に点滅させることができます。
例えば、フラッシュの仕方をウィンドウが一番前に来るまで点滅させたり
点滅する回数を設定できたり、点滅の間隔を設定できたりします。
早速やってみる事にします。
Private Type FLASHWINFO
cbSize As Long '構造体のバイト数
hWnd As Long 'ウィンドウハンドル
dwFlags As Long '点滅の状態を指定する定数の組み合わせ
uCount As Long '点滅の回数
dwTimeout As Long '点滅の継続時間(ミリ秒)
'0のときカーソルの点滅時間
End Type
'ウィンドウのキャプションバーをハイライト表示
Private Declare Function FlashWindowEx Lib "user32.dll" _
(pfwi As FLASHWINFO) As Long
'dwFlagsの定数
Private Const FLASH_STOP = &H0 '点滅を停止して、元の状態に戻る
Private Const FLASH_CAPTION = &H1 'キャプションバーを点滅させる
Private Const FLASH_TRAY = &H2 'タスクバーボタンを点滅させる
Private Const FLASH_ALL = FLASH_CAPTION Or FLASH_TRAY
Private Const FLASH_TIMER = &H4 'FLASH_STOPが設定されるまで連続的に点滅する
Private Const FLASH_TIMERNOFG = &HC 'ウィンドウがフォアグラウンドの
'状態になるまで点滅する
|
ちょっと長いですが、がんばってみてください。
さて、FlashWindowEx()関数の説明ページを見ると「FLASHWINFO構造体を指定する」となっています。
これを行っているのが、下の部分です。
Dim pfwi As FLASHWINFO
'必要な設定を行う
With pfwi
.cbSize = Len(pfwi) '構造体のサイズを指定する
.dwFlags = FLASH_TRAY 'タスクバーだけを点滅することを指定する
.hWnd = Me.hWnd '点滅するウィンドウのハンドル
.uCount = 3 '3回点滅する
.dwTimeout = 500 '500msごとに点滅する
End With
Call FlashWindowEx(pfwi) '関数の呼び出し |
大切なのは、「Dim pfwi As FLASHWINFO」の部分です。
DimステートメントでFLASHWINFOを「pfwiだ」と宣言する事によって始めてメモリが確保されます。
cbSizeメンバにはこの構造体のサイズを指定します。つまり、FLASHWINFO構造体が何バイトなのかを指定します。
自分で計算してもいいですが、VBのLen関数によってそのバイト数を取得することができます。
そして先ほどのウィンドウハンドルはhWndメンバに渡されています。
構造体はこれらの情報を1つにまとめてAPI関数に渡すことができるのです。
ダウンロードはこちらから。
ダウンロード