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_・・・

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

・・・。

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




記事検索

アーカイブ