ステータスバーとはウィンドウアプリケーションでよく見かける左のようなものです。ちょっとした情報を表示するために使われるポピュラー機能ですね。


どーやって埋め込むの?

イメージ画像では、ウィンドウにスッポリとはまっていますね。一見、スタティックコントロールのようにも見えますが、常にクライアント領域の端っこに表示されたり、分割表示できたりと、少し用途が違います。
具体的には、CreateStatusWindow関数を使用してステータスバーを生成し、表示するだけなので、作成方法はとてもシンプル。なにかしらアプリケーションを作るときには積極的に活用してしまいましょう(^^;

CreateStatusWindow (style As Long, lpszText As BytePtr, hwndParent As DWord, wID As DWord) As DWord

  • styleにはウィンドウスタイル(WM_???)及びステータスバースタイルを指定します。
  • lpszTextにはステータスバーの初期文字列を指定します(省略時は0を指定)。
  • hwndParentには親ウィンドウのハンドルを指定します。
  • wIDにはステータスバーを示すIDナンバーを指定します。
関数が成功すると、ステータスバーのハンドルが返ります。失敗すると 0 が返ります。

作ってみよう!

まずはstatusなどという名前のプロジェクトを新規作成します。ノーマルウィンドウベースで、プロジェクトオプションでは「コモンコントロールを使用する」にチェックを入れておきます。

プロジェクト生成が完了したら、メインウィンドウ(MainWnd)を適度なサイズにあわせ、以下のようにスタティックテキストでも入れておきましょう。



次に、MainWnd.sbpを開き、先頭部分に以下のような2行を追加しておきます。

' ----------------------------------------------------------------------------
' イベント プロシージャ
' ----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' メモ - 以下の領域を、変数、構造体、定数、関数を宣言するための、
' グローバル領域として利用することができます。
' ----------------------------------ここから----------------------------------

Const ID_STATUS = 70
Dim hStatusWnd As DWord

' ----------------------------------ここまで----------------------------------



ID_STATUSはステータスバーのIDです。hStatusWndは、ステータスバーのハンドルを格納するための変数です。

ここから、イベントコーディングを行っていきます…

Sub MainWnd_Destroy()
status_DestroyObjects()
PostQuitMessage(0)
End Sub



↑Destroyイベントはそのまま(--;

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim ic As INITCOMMONCONTROLSEX

'コモンコントロールの初期化
ic.dwSize=Len(ic)
ic.dwICC=ICC_BAR_CLASSES
InitCommonControlsEx(ic)

'ステータスバーを作成
hStatusWnd = CreateStatusWindow( _
WS_CHILD or WS_VISIBLE or CCS_BOTTOM, _
NULL, _
hMainWnd, _
ID_STATUS)

'タイマー開始
SetTimer(hMainWnd,0,100,NULL)
End Sub



↑Createイベントでは、CreateStatusWindow関数によるステータスバーの生成を行います。その後、タイマー処理を開始させます。ここでは、100ミリ秒ごとにTimerイベントが呼び出されるようにセットしておきます。

Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
'ステータスバーにサイズ変更情報を送る
SendMessage(hStatusWnd,WM_SIZE,cx,cy)
End Sub



↑ユーザーがウィンドウの大きさを変更したときなどに通知されるResizeイベントです。ウィンドウサイズの変更に伴い、ステータスバーにもサイズ情報を送っておきます。こうすることで、ステータスバーのサイズもウィンドウにあわせておくことができます。

Sub MainWnd_Timer(TimerID As Long)
Dim buffer[255] As Byte
Dim template[255] As Byte

'時刻をステータスバーに表示
lstrcpy(template,"tt hh時 mm分 ss秒")
GetTimeFormat(LOCALE_USER_DEFAULT, NULL, ByVal 0, template, buffer, 255)
SendMessage(hStatusWnd, SB_SETTEXT, 0, buffer)
End Sub


↑Timerイベントでは、templateにテンプレート文字列を格納し、それをもとに現在時刻の文字列をbufferに取得します。SB_SETTEXTメッセージでステータスバー内の文字列を変更しています。

今回はこれで完了です。コンパイル&実行で、ステータスバー内の時計が秒刻みで動くかどうかチェックしておきましょう。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2010年08月07日 21:11