型の不一致による警告がでるが動作には問題無し。
どうしても気になるならキャストして黙らせてもよいのですが、
読みにくくなるだけだと思われるので、#strictを外すのがいいかもしれない。。

今回はステータスバーの各パーツにアイコンを表示してみます。少し細工を加えるだけで、ちょっとした機能も見栄えが良くなります☆
※Comctl32.dllのバージョンが4.71以降であることが必要です




ということで、上の画像にあるような三つのアイコン(16*16)をstateプロジェクトの中に用意しておきましょう。
icon1.ico(日付用)、icon2.ico(時刻用)、icon3.ico(サイズ用)
※右クリックで「対象をファイルに保存」
ステップ22でstateプロジェクトを作成されている方は今回のプログラムの太字の部分を参考にソースを編集してみて下さい。プロジェクトをこれから作る方は、ノーマルウィンドウベースで、プロジェクトオプションの「コモンコントロールを使う」にチェックを入れて作成しておきましょう。

まずはアイコンリソースを追加

ダウンロード、または自作したアイコンをリソースデータとしてプロジェクトに取り込みます。ProjectViewを開き、Materialタブ内の「Iconリソース」フォルダを右クリックして三つのアイコンを挿入していきます。ここでは、日付アイコンを IDI_ICON1、時刻アイコンを IDI_ICON2、サイズアイコンを IDI_ICON3というID名にセットしておきます。



ここからコーディング作業

MainWnd.sbpに対して、以下のプログラムをコーディングします。

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

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

Const ID_STATUS = 70
Dim hStatusWnd As DWord

Dim hIcon1 As DWord, hIcon2 As DWord, hIcon3 As DWord

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



↑MainWnd.sbpの先頭部分では、3つのアイコン ハンドルを格納するための変数を定義しておきます。

Sub MainWnd_Destroy()
   'アイコンを破棄
   DestroyIcon(hIcon1)
   DestroyIcon(hIcon2)
   DestroyIcon(hIcon3)

   status_DestroyObjects()
   PostQuitMessage(0)
End Sub



↑Destroyイベントでは、DestroyIcon関数を使用して3つのアイコンハンドルをメモリから解放する動作を追加します。

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

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

   'インスタンスハンドルを取得
   hInst=GetModuleHandle(0)

   'アイコンを読み込む
   hIcon1=LoadImage(hInst,IDI_ICON1,IMAGE_ICON,16,16,0)
   hIcon2=LoadImage(hInst,IDI_ICON2,IMAGE_ICON,16,16,0)
   hIcon3=LoadImage(hInst,IDI_ICON3,IMAGE_ICON,16,16,0)

   'ステータスバーを作成
   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)

   'ステータスバーの各パーツにアイコンを設定
   SendMessage(hStatusWnd,SB_SETICON,0,hIcon1)
   SendMessage(hStatusWnd,SB_SETICON,1,hIcon2)
   SendMessage(hStatusWnd,SB_SETICON,2,hIcon3)

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



↑Createイベントでは、アイコンの読み込み、ステータスバーへのセット(SB_SETICONメッセージ)を行います。

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イベントも前のままです。

これで作業は完了です。コンパイル&実行で確認してみましょう。アイコンがつくだけで、雰囲気がだいぶ変わりますね♪