S-JIS[2002-07-27]

ステータスバーの使い方

ステータスバーというのは(大抵は)ウィンドウの下の方にある、 簡単な説明が表示されたりするやつです。


AppWizardで作成したMFCアプリケーションでは、途中で「初期ステータスバー」をオンにしておくと 自動的にステータスバーが表示されるようになります。

これによって作られるのは以下のコードなので、自分で後から追加するのは容易です。
なお、ステータスバーはフレームウィンドウに属するものなので、CMainFrameで作成します。 MDIの子ウィンドウにステータスバーを付けたい時は、 CChildFrameに同様のコーディングをすれば出来ます。

MainFrm.h:
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_CAPSCaps Lock キャップス ロックが かかっているかどうか
ID_INDICATOR_NUM Num Lock ナンバー ロックが かかっているかどうか
ID_INDICATOR_SCRLScroll 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);
	}
}

VC++ページへ戻る / 技術メモへ戻る
メールの送信先:ひしだま