Version 10.16
ステータスバーを使ってみる・ SDK 編
「前回はステータスバーそのものを作ってみました」
『っつーか作っただけだね』
「うん、それだともちろん意味ないから、これからステータスバーを使って
みます」
『ステータスバーって Version 9.13 ( No.174 ) で使ってみたよね。あれ
と似てる?』
「ある程度似てるから参考になる部分はあるよ。比較しつつやってみるのも
いいかも。じゃあ、まずは試してみようか。まず、 #include の下くらいに
次の行を追加して」
HWND g_hStetusBarWnd;
『何これ』
「グローバル変数って言って、どこからでも使える変数」
『うん、それはなんとなく分かるんだけど』
「ここに、ステータスバーのウィンドウハンドルを入れておきます。実際に
入れる部分はこれ」
// ウィンドウが作られます。
LRESULT OnCreate
( HWND p_hWnd
, WPARAM p_wParam
, LPARAM p_lParam
)
{
g_hStetusBarWnd = CreateStatusWindow
( WS_CHILD | WS_VISIBLE
, "テスト"
, p_hWnd
, 100
);
if( g_hStetusBarWnd == NULL )
{
// ステータスバーが作られませんでした。
return -1;
}
return 0;
}
『この前のステータスバーを作ってた部分だね。あ、
CreateStatusWindow() の戻り値をさっきの変数に入れてる』
「 CreateStatusWindow() は、戻り値にステータスバーのウィンドウハンド
ルを返すんです」
『それを取っとくってこと?』
「そういうこと。で、ステータスバーに文字列をセットするときには、この
ウィンドウハンドルにメッセージを送ります。ちょっと手抜きして、前に
作ったメニュー用の関数をこう修正して」
// ID_MENU_TEST が選択されました。
LRESULT OnMenuTest
( HWND p_hWnd
, WPARAM p_wParam
, LPARAM p_lParam
)
{
SendMessage
( g_hStetusBarWnd
, SB_SETTEXT
, 0
, (LPARAM)"OnMenuTest()"
);
return 0;
}
『メッセージ送るのはいつもの SendMessage() ね。送り先はさっきのス
テータスバーのウィンドウハンドル、 SB_SETTEXT は初めて見る……よね』
「うん、これはステータスバー専用のメッセージだから。最初の S は
StatusBar の S だから。でも」
『でも?』
「 Version 5.29 ( No.094 ) で出てきた、ウィンドウのタイトルを変える
メッセージ WM_SETTEXT に似てるかな」
『あ、そういえば』
「全部同じじゃないけど、あれに近いかも」
『文字列を LPARAM に渡して、 LPARAM にキャストしてるのなんか同じだ
ね』
「違うところは WPARAM だね。 WM_SETTEXT は 0 を渡すことになってるけ
ど、 SB_SETTEXT はここに値を渡すことができます。たとえばこんなふう
に」
// ID_MENU_TEST が選択されました。
LRESULT OnMenuTest
( HWND p_hWnd
, WPARAM p_wParam
, LPARAM p_lParam
)
{
SendMessage
( g_hStetusBarWnd
, SB_SETTEXT
, SBT_POPOUT
, (LPARAM)"OnMenuTest()"
);
return 0;
}
『 SBT_POPOUT って渡してるね。ビルドして実行! あ”、なんかでっぱっ
た』
「こういうふうに、ステータスバーのスタイルを変えるフラグを渡せます。
これは、さっきの MFC 版の方で出てきた、 CStatusBarCtrl::SetText() の
第3引数に渡しているものと同じ」
『あ、この辺は MFC も同じなんだ』
「 MFC の方が、この SB_SETTEXT を使いやすくしてるってところかな」
『あ、質問! MFC でステータスバー使った時ってなんか配列使ったけ
ど、あれってないの?』
「あるけど、微妙に違うかな。 SDK の方は、ステータスバーを区切る時に
使います」
// ウィンドウが作られます。
LRESULT OnCreate
( HWND p_hWnd
, WPARAM p_wParam
, LPARAM p_lParam
)
{
// ステータスバーを作ります。
g_hStetusBarWnd = CreateStatusWindow
( WS_CHILD | WS_VISIBLE
, "テスト"
, p_hWnd
, 100
);
if( g_hStetusBarWnd == NULL )
{
// ステータスバーが作られませんでした。
return -1;
}
// ステータスバー枠用配列。
int iAry[3];
iAry[0] = 100;
iAry[1] = 200;
iAry[2] = -1;
// ステータスバーに枠を追加します。
SendMessage
( g_hStetusBarWnd
, SB_SETPARTS
, 3
, (LPARAM)iAry
);
return 0;
}
『お、今度はステータスバーを作ったらそのあと配列作って、さらにステー
タスバーにメッセージ送ってる』
「 SB_SETPARTS は、ステータスバーをいくつかの枠に分けるメッセージ。
LPARAM に配列渡してるでしょ」
『うん、これだね』
// ステータスバー枠用配列。
int iAry[3];
iAry[0] = 100;
iAry[1] = 200;
iAry[2] = -1;
「これは、ステータスバーを3つに区切る場合の例。最初の 100 は、左か
ら 100 ピクセルまで、 200 は、左から 200 ピクセルまで、 -1 は右端ま
で」
『ん??? よくわかんないんだけど』
「イメージとしては、こんな感じ」
100
[ 0 ] 200
[ 1 ] -1 (画面端)
[ 2 ]
「これが全部重なって」
100 200 -1 (画面端)
[ 0 ][ 1 ][ 2 ]
「ってなってるって感じ」
『なんとなく分かるけど……』
「っていうか、実際に使って見た方が早いかも。
// ID_MENU_TEST が選択されました。
LRESULT OnMenuTest
( HWND p_hWnd
, WPARAM p_wParam
, LPARAM p_lParam
)
{
SendMessage( g_hStetusBarWnd, SB_SETTEXT
, 0 | SBT_POPOUT, (LPARAM)"いち" );
SendMessage( g_hStetusBarWnd, SB_SETTEXT
, 1 | SBT_POPOUT, (LPARAM)"にぃ" );
SendMessage( g_hStetusBarWnd, SB_SETTEXT
, 2 | SBT_POPOUT, (LPARAM)"さん" );
return 0;
}
『うお、三段重ね! ビルドして実行、いちにぃさん! こうなるのねー』
「補足をふたつ。 SB_SETTEXT の WPARAM の」
2 | SBT_POPOUT
「の左側が分けたステータスバーのどこに出力するか。右側はさっきのス
テータスバーのスタイル」
『 | でくっつけるって、フラグくっつけるのと似てるね』
「一応同じなんだけど、ちょっと特殊かも。もうひとつ、 SB_SETPARTS の
WPARAM の 3 は、枠の数」
『それって配列の中身の数ってことでいいんだよね』
「うん、それと同じ」
/*
Preview Next Story!
*/
『あれ、すぱっと終わったね』
「次にも続くから」
『って、 MFC の時は2回じゃなかったっけ?』
「 SDK だけの方が教えることは多いからね」
『便利じゃないから?』
「融通が利くから」
『融通?』
「というわけで次回」
< Version 10.17 ステータスバーをクリック! >
『につづく!』
「クリックなんてのも簡単にできます」
『 MFC の時はできなかったの?』
「試してない……」
『ダメジャン』