今回はステータスバーを複数のパーツに振り分け、日付、時刻、ウィンドウサイズを表示してみます。




どうやって振り分けるの?

CreateStatusWindow関数を使ってステータスバーを生成したら、ステータスバーのハンドルに向けて、SB_SETPARTS メッセージを送ります。SB_SETPARTS メッセージのパラメータは以下の通り…
  • wParamにはパーツ数を指定します。
  • lParamには、各パーツの長さ(ピクセルサイズ)が格納されたLong配列へのポインタを指定します。
また、各パーツへ文字列を設定するときには、SB_SETTEXT メッセージを使うわけですが、wParam部分にパーツ番号を指定する点をおさえておくと良いでしょう。

作ってみよう!

ステップ21で作成したプログラムがある場合は上書き方式でプログラムを加工してみて下さい(変更点は太字の部分)。ない場合は、新規にプロジェクトを作成し、ウィンドウ(MainWnd)を用意しておきましょう。
あと、MainWndの大きさ(幅)をあらかじめ広げておくとよいでしょう。

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

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

Const ID_STATUS = 70
Dim hStatusWnd As DWord

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



↑プログラムの先頭部分は前のままです。

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



↑Destroyイベントにも変更点はありません。

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
   Dim ic As INITCOMMONCONTROLSEX
   Dim Statusbar_Sizes[2] As Long

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

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

   'ステータスバーサイズを設定
   Statusbar_Sizes[0]=150
   Statusbar_Sizes[1]=300
   Statusbar_Sizes[2]=450
   SendMessage(hStatusWnd,SB_SETPARTS,3,Statusbar_Sizes)

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



↑CreateStatusWindowのスタイル パラメータに、SBARS_SIZEGRIP を追加しておきます。このフラグを指定するとウィンドウ右下にサイズグリップが表示されるようになります。
また、ステータスバー作成直後に SB_SETPARTS メッセージを送り、パーツ振り分けをしておきます。

Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
   Dim buffer[255] As Byte

   'ステータスバーにサイズ変更情報を送る
   SendMessage(hStatusWnd,WM_SIZE,cx,cy)

   'ウィンドウサイズをステータスバーに表示
   wsprintf(buffer,"Size: %d×%d",cx,cy)
   SendMessage(hStatusWnd, SB_SETTEXT, 2, buffer)
End Sub



↑Resizeイベントでは、ウィンドウサイズ変更時に、ステータスバー内の文字列を変更するようにします。

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

   '日付をステータスバーに表示
   GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, ByVal 0, 0, buffer, 255)
   SendMessage(hStatusWnd, SB_SETTEXT, 0, buffer)

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



↑Timerイベントでは、日付の表示が加わります。また、時刻のパーツ部の番号が1になっているので、注意して下さい。

これで完了です。三つのデータがしっかりと表示されるかどうか、コンパイル&実行でチェック!