「ステップ23 「ステータスバーを使う③」」の編集履歴(バックアップ)一覧はこちら

ステップ23 「ステータスバーを使う③」」(2010/08/07 (土) 21:13:07) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

型の不一致による警告がでるが動作には問題無し。 どうしても気になるならキャストして黙らせてもよいのですが、 読みにくくなるだけだと思われるので、#strictを外すのがいいかもしれない。。
型の不一致による警告がでるが動作には問題無し。 どうしても気になるならキャストして黙らせてもよいのですが、 読みにくくなるだけだと思われるので、#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イベントも前のままです。 これで作業は完了です。コンパイル&実行で確認してみましょう。アイコンがつくだけで、雰囲気がだいぶ変わりますね♪

表示オプション

横に並べて表示:
変化行の前後のみ表示: