MFC
いろんなハンドルを取得する


HomeProgramming TipsMFC Tips[MFC-020]

Windows プログラミングをする上でハンドルを扱うことは必須です。
また、基本クラス、ウィンドウクラス(フレーム、ビュー)と構成された MFC では、
各クラスのポインタ取得もよく使います。
そこで、私が比較的よく使っている各種ハンドル、ポインタの取得について記載しておきます。


■ インスタンスハンドルを取得する

SDK プログラミングなどでは、たまにしか使わないインスタンスハンドルのために
グローバル変数として確保する事も多いと思いますが、MFC では、下記の関数で取得すると良いでしょう。


    HINSTANCE hInst = AfxGetInstanceHandle();

※ 参考までに (HINSTANCE)::GetModuleHandle(NULL);とすると、SDK でもインスタンスハンドルが取得できます。


■ ウィンドウハンドルを取得する

自分のウィンドウハンドルを取得するだけなら下記の関数で一発です。

    HWND hWnd = GetSafeHwnd();


他のウィンドウのウィンドウハンドルは、そのウィンドウクラスのメンバ呼び出しをすれば取得できます。
例えば、baseWnd というウィンドウクラスからハンドルを取得するのなら下記のようになります。

    HWND hWnd = baseWnd.GetSafeHwnd();



■ アプリケーションポインタを取得する

MFC のもっともベースにあるのがアプリケーションクラスです。
通常 CWinApp 単体で使うことはなく、派生して使用しますので、取得したポインタもキャストして使用します。
例えば、CWinApp から派生された CFooApp アプリケーションクラスのポインタを取得するには下記のようにします。

    CFooApp* pApp = (CFooApp*)AfxGetApp();



■ メインウィンドウのポインタを取得する

m_pMainWnd から取得している人も多いかもしれませんが、実は関数一発なのです。
これまた通常は派生されていますのでキャスト必須です。
例えば、CWnd から派生した CBaseWnd のポインタを取得するには下記のようにします。

    CBaseWnd* pWnd = (CBaseWnd*)AfxGetMainWnd();



■ 親ウィンドウのポインタを取得する

親ウィンドウの取得には GetParent()を使っている人も多いかと思います。
これ、実は、オーナーウィンドウを戻す場合があり危険です。…実際、ハマりました。orz
代わりに下記の関数をお勧めしておきます。やっぱり通常はキャストします。

    CWnd* pParent = GetAncestor(GA_PARENT);





 Copyright 2005 VALGUS. All Rights Reserved.