通常、MDIやSDIのメインフレームのキャプションは、

のように、自動的に「子ウィンドウのタイトル – アプリケーション名」となっています。

たしかに楽なのですが、場合によってはキャプションを全て自分で変更したい場合があります。
(アプリケーション名だけなら、SetTitle()で変更出来ます。)

そんな場合にどうしたらよいかを紹介します。

今回は、「自動的にタイトルを変更する」フラグである(?)「FWS_ADDTOTITLE」を、ウィンドウスタイルから外す事で実現します。
PreCreateWindow関数内でウィンドウスタイルを変更します。

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;

	cs.style^= FWS_ADDTOTITLE;

	return TRUE;
}

あとは、メインフレームからSetWindowTextを呼び出せば、希望通りのキャプションに変更する事が出来ます。

SetWindowText("たかぼーそふと");

MFC AppWizardを使ってMDI/SDIのプロジェクトを作成すると、
デフォルトで1つのツールバーがくっついてきます。
IEのように、ボタン1つ1つにテキストを挿入しようと思い、
ツールバー作成コードのすぐ後へ次のようなコードを書きました。

m_wndToolBar.SetButtonText(0,"新規作成");
m_wndToolBar.SetButtonText(1,"開く");

ところがどっこい、実行してみると・・・

という感じでテキストが埋もれてしまいます。

ここで詰まった方も多いはず。。。

マニュアルにも特に記載されてません。

というわけで、次のが直す方法。

CRect rect;
m_wndToolBar.GetToolBarCtrl().GetItemRect(0,rect);
m_wndToolBar.SetSizes(rect.Size(),CSize(16,15));

これを、テキスト設定後に実行すると、ちゃんと表示されるようになります(CSize(16, 15)はボタン画像のサイズです)。

MFC AppWizardを使ってプロジェクトを作成すると、’C’+プロジェクト名+’App’という感じのクラスが作成されます。
このクラスはCWinAppの派生クラスであり、アプリケーションを管理するクラスとなります。
よく、いろいろなクラスからデータを共有したい場合、グローバル変数を使用するのは嫌われるため、このCWinAppの派生クラスのメンバ変数として宣言します。
この場合、そのメンバ変数へアクセスするために、例えばそのCWinAppの派生クラスが「CMfcTestApp」という名前ならば、

CMfcTestApp *pApp=(CMfcTestApp *)AfxGetApp();
pApp->m_・・・・

とします。

一度で良いならば、

((CMfcTestApp *)AfxGetApp())->m_・・・・

でも良いですね。

ただ、こうした事を何度も書いていると、ソースも見にくくなるし、面倒くさくなってきます。
マクロを使うという手もありますが、今回は別の方法をご紹介します。

MfcTestAppのソースファイルを覗いてみると、こんな記述があります。

/////////////////////////////////////////////////////
// 唯一の CMfcTestApp オブジェクト

CMfcTestApp theApp;

という事は、こいつをどこでも使えるようにすれば、手軽にCMfcTestAppクラスへアクセス出来るわけですね。
というわけで、externを使って、CMfcTestAppのヘッダーファイルの最後の方(クラス宣言が終わった次くらい)へ次のような文字列を埋め込みます。

extern CMfcTestApp theApp;

「CMfcTestApp」というは例なので、自分の派生クラス名にしてください。

こうすれば、あとはどこでも、

theApp.m_・・・

という感じでメンバ変数へアクセス出来るようになるというわけです。

・・・。

やっぱり、こういうやり方って邪道なんでしょうかねぇ(^^;

記事検索

アーカイブ