Version 9.13
ステータスバーを使ってみる!
「前回はツールバーを使ってみたから、今回はステータスバーを使ってみま
す」
『フツーの流れね』
「さて、 Version 9.09 ( No.170 ) の時と同じように Spy++ でステータス
バーを見てみて」
『ウィンドウクラス名を見れば素性がわかるってヤツね。んーと……あ
れ? これって msctls_statusbar32 ってゆーのがひとつあるだけだね』
「うん、そう。小さい窓がいっぱいあるからツールバーみたいになってるよ
うに見えるけど、実はウィンドウひとつだけ」
『 msctls_statusbar32 ってウィンドウクラス名だと、 MFC のじゃな
い……のかな』
「そう、このステータスバーはウィンドウズが提供してくれるコントロール
だから」
『メッセージを使って操作もできるけど、 MFC のクラスもあるってこと
ね』
「そゆこと。じゃ、クラスの方を見ておこうか。ツールバーの時と同じよう
に、 MainFrame.h にある CMainFrame のメンバ変数として m_wndStatusBar
ってメンバ変数が作られてます」
『 CStatusBar クラスの変数なんだね』
「ステータスバーが実際に作られてるのも、ツールバーと同じ
CMainFrame::OnCreate() 。こんなふうに作られてます」
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // 作成に失敗
}
『またわかりにくい……』
「分かりやすく書くと、こんな感じかな?」
if (
!m_wndStatusBar.Create(this)
||
!m_wndStatusBar.SetIndicators
( indicators
, sizeof(indicators)/sizeof(UINT)
)
)
{
TRACE0("Failed to create status bar\n");
return -1; // 作成に失敗
}
『微妙……』
「ま、 if の中でメンバ関数ふたつを呼んでるだけだけどね。まず
m_wndStatusBar.Create() を呼んで、ここでステータスバーを作ってます」
『またよく分かんない this が出てきた……』
「これはまぁまた今度って事で」
『 if の感じがツールバーの時と同じだから、これもショートサーキット
使ってる?』
「使ってます。この Create() が失敗したらその時点で if の中に入って、
成功したら次の m_wndStatusBar.SetIndicators() が呼ばれます」
『こっちは何してるの?』
「これはね、 MainFrame.cpp の上の方に」
static UINT indicators[] =
{
ID_SEPARATOR, // ステータス ライン インジケータ
ID_INDICATOR_KANA,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
「ってあるでしょ。ステータスバー見てもらうと分かるけど、欄が5つある
でしょ」
『それがこれ?』
「そういうこと。実際に CapsLock とか押すと」
『あ! ステータスバーに表示される!』
「今、 CapsLock のは右からみっつめの欄に表示されたでしょ。これを」
static UINT indicators[] =
{
ID_SEPARATOR, // ステータス ライン インジケータ
ID_INDICATOR_KANA,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
ID_INDICATOR_CAPS
};
『あ、 ID_INDICATOR_CAPS が最後に来た』
「こうすれば」
『 CapsLock のが右端に!』
「それに、この数をこんなふうに減らせば」
static UINT indicators[] =
{
ID_SEPARATOR, // ステータス ライン インジケータ
};
『あ、欄がなくなった!』
「これでメニューとかのプロンプトだけが表示されるようになります」
『こっちの方がシンプルでいいかもね。それにしても……なんかこの辺さ
らっとやってるけど、結構難しくない?』
「うん、配列の部分とか、教えてないのがあるからね……その辺は来週に持
ち越しってことで。で、話を戻すと、この機能は MFC のだから」
『 MFC のなんだー』
「っていうか、こんなキー表示をしても意味ない気もするんだけどね」
『確かに……』
「ま、実際、この機能もそうだし、ステータスバーの一番左の欄はメニュー
とかのプロンプトが自動的に出力されるだけだから」
『ステータスバーってリソースもないし、もしかしてすることない?』
「ま、基本的にはね。でも、操作することはできるよ? ツールバーの時み
たいに」
『あー、コントロール取得して……って、ステータスバーはそういうふうに
包まれてなかったから違うか』
「ところがどっこい、実はその辺の仕組みはツールバーの時と同じなんで
す。実際にコード見た方が早いかな」
void CMainFrame::OnMenuTest()
{
// ステータスバーコントロールを取得します。
CStatusBarCtrl &rcStatusBarCtrl
= m_wndStatusBar.GetStatusBarCtrl();
// テキストをセット。
rcStatusBarCtrl.SetText
( "ステータスバーですよ?"
, 0
, SBT_NOBORDERS
);
}
『いつものテスト用のメンバ関数ね』
「まず最初の」
CStatusBarCtrl &rcStatusBarCtrl
= m_wndStatusBar.GetStatusBarCtrl();
『これはまさにツールバーの時と同じね』
「そう、詳しくは Version 9.12 ( No.173 ) つまり前回を見てもらえば分
かると思うけど、 CStatusBar からは直接ステータスバーを操作できなく
て」
『中に操作するための CStatusBarCtrl クラスのメンバ変数をスレイブとし
て飼ってるわけね』
「……嫌とか言ってた割りには……」
『まーそれは置いといて、この rcStatusBarCtrl って参照を使えばステー
タスバーを操作できるわけね』
「それが」
rcStatusBarCtrl.SetText
( "ステータスバーですよ?"
, 0
, SBT_NOBORDERS
);
「の部分。まず第1引数が出力する文字列」
『あ、試しとこうっと。ビルドして実行、この前のツールバーを押して……
うん、〈ステータスバーですよ?〉って左端の欄に出た!』
「第2引数の 0 は、出力する欄。 0 だから左端に出たけど」
『ってことは 1 にすれば左から2番目のに出るのね。ビルドして実行、
お、出た。スペース狭くて1文字くらいしか見えないけど……』
「最後の SBT_NOBORDERS は、表示するスタイル。 SBT_NOBORDERS だと縁の
ない形式で表示されて、 0 を渡すと縁のある状態で表示されます」
『あれ? でも、左から2番目って元々縁あるけど、縁消えないよ?』
「……そうだね。なんでだろう……一応」
rcStatusBarCtrl.SetText
( "ステータスバーですよ?"
, 0
, 0
);
「って感じに左端で 0 を渡せば」
『お、これはちゃんと縁有りになるんだね』
「ま、そーゆーことで」
『テキトー……』
「で、こういうふうにステータスバーに文字列を表示することはできるけ
ど、基本的には MFC の機能を使った方が楽かな」
『そりゃそうよねー、メニューとかのプロンプトを設定すればそれがそのま
ま表示されるんだから』
「有効化/無効化の話もそうだけど、 SDI アプリになるととたんに面倒な
ことが増えてくるから、どうしても MFC 使った方が楽になるんだよね」
『使ってもいいんじゃないの?』
「うん、まぁそうなんだけど、初めはどこまでがウィンドウズのコントロー
ルでどこからが MFC かって判りにくいでしょ」
『うん、今回のも……結局は、 Ctrl って付いてるクラス名のは、直接コン
トロールを操作する、ってことでいいんだよね』
「そゆこと。そういうクラスはメッセージをコントロールに送る、それくら
いの機能しかないからね」
『で、 Ctrl が付いてないクラスの方で色々管理すると』
「その辺が MFC の役立ってるところかな」
『で、直接操作するときには Get なんたら Ctrl() ってメンバ関数呼べば
参照が返ってくるからそれを操作すればいい、と』
「その辺は MFC の中では比較的統一されてるから、難しくないと思うよ」
『ま、なんとなくはわかるかなー』
「なんとなく?」
『なんとなく』
/*
Preview Next Story!
*/
『何となくでいーのかなー』
「いいと思うよ」
『そなの?』
「難しく考えてたら、プログラムいっぱい書けないでしょ」
『それはそうだけどね』
「もちろん細かい部分は押さえつつ、って前提はあるけど」
『やっぱそうなのね……』
「というわけで次回」
< Version 9.14 配列を読み解く >
『につづく!』
「次回はそういう細かい所」
『それが何となく分かればいい?』
「そういうこと」