ステータスバーというのは(大抵は)ウィンドウの下の方にある、 簡単な説明が表示されたりするやつです。
AppWizardで作成したMFCアプリケーションでは、途中で「初期ステータスバー」をオンにしておくと 自動的にステータスバーが表示されるようになります。
これによって作られるのは以下のコードなので、自分で後から追加するのは容易です。
なお、ステータスバーはフレームウィンドウに属するものなので、CMainFrameで作成します。
MDIの子ウィンドウにステータスバーを付けたい時は、
CChildFrameに同様のコーディングをすれば出来ます。
class CMainFrame : public CFrameWnd
{
〜
protected: // コントロール バー用メンバ
CStatusBar m_wndStatusBar;
〜
};
MainFrm.cpp:
static UINT indicators[] = { ID_SEPARATOR, // ステータス ライン インジケータ ID_INDICATOR_KANA, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 〜 if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // 作成に失敗 } 〜 }Createでステータスバーを作成し、SetIndicatorsにインジケータのIDと個数を渡しています。
インジケータが全く不要ならSetIndicatorsの呼び出しを削除してしまえばいいです、と言いたいところですが、 そうするとステータスバーの左側に出ていた説明文まで表示されなくなってしまいます。 インジケータだけ消したい場合は、ID_SEPARATOR以外の全てのIDを削りましょう。
インジケータというのは、ステータスバーの内、右の方に出ている欄で、 「ナンバーロック(NUM)されているか」「キャップスロック(CAP)されているか」等の 情報が表示されます。
ID | キー | 説明 |
---|---|---|
ID_SEPARATOR | 無し | これだけは特殊で、「レディ」とか表示される部分を確保する為に使われているようだ |
ID_INDICATOR_KANA | ? | かな ロックが かかっているかどうか |
ID_INDICATOR_CAPS | Caps Lock | キャップス ロックが かかっているかどうか |
ID_INDICATOR_NUM | Num Lock | ナンバー ロックが かかっているかどうか |
ID_INDICATOR_SCRL | Scroll Lock | スクロール ロックが かかっているかどうか |
ID_INDICATOR_EXT | ? | extended selection indicator何のことやら? |
ID_INDICATOR_OVR | ? | 上書きモードかどうか何のことやら? |
ID_INDICATOR_REC | ? | 記録モードかどうか何のことやら? |
キーが押された時に自動的にインジケータの文字が変わるわけですが、 これはCMainFrameの派生元クラスがデフォルトで動作しているのです。
void CFrameWnd::OnUpdateKeyIndicator(CCmdUI* pCmdUI)
ここで渡されるCCmdUIの実体はCStatusCmdUIというクラスであり、 Enable()等がオーバーライドされているため、文字が表示されたりするのです。
自分で好きなように表示できるインジケータは、簡単に作ることが出来ます。
まず、リソースのString Tableに、適当なIDで文字列を作成します。
この文字列は、初期データとして表示されます。インジケータの枠の大きさは
この文字列のサイズにぴったりとなるので、後でもっと長い文字列を表示したいのなら
大きめな文字列にしておくべきでしょう。
次に、以下の様にコーディングします。
MainFrm.cpp:
static UINT indicators[] =
{
ID_SEPARATOR, // ステータス ライン インジケータ
ID_INDICATOR_KANA,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
ID_INDICATOR_ORG, //Stringリソースで作成したID
};
並び順は好きなように変えてください。
これだけで、Stringリソースに指定した文字列が表示されるようになります。
実行時にインジケータに表示する文字を変えるには、以下の様な関数を用意して この関数を呼び出すことによって実現します。
MainFrm.h:
class CMainFrame : public CFrameWnd
{
〜
//オリジナルのインジケータに文字を表示
void PutStatusBarOrg(LPCTSTR str);
〜
};
MainFrm.cpp:
void CMainFrame::PutStatusBarOrg(LPCTSTR str)
{
int n=m_wndStatusBar.CommandToIndex(ID_INDICATOR_ORG);
if(n>=0){
m_wndStatusBar.SetPaneText(n,str);
}
}