Win32プログラミング講座 〜 Step21. ステータスバーを使う@ 〜



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

どーやって埋め込むの?

イメージ画像では、ウィンドウにスッポリとはまっていますね。一見、スタティックコントロールのようにも見えますが、常にクライアント領域の端っこに表示されたり、分割表示できたりと、少し用途が違います。

具体的には、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メッセージでステータスバー内の文字列を変更しています。

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

前へ戻る - 次へ進む
トップへ戻る


©2005 Discoversoft