MASATOの開発日記 2000年8月


8/29

 便利な便利なMFC。最初は、MFCが与えてくれた定型通りにしか出来ないと思っていましたが、慣れて来ると、定型外の事も色々と出来るようになってきました。今日紹介するのも定型外の機能の一つです。

(Visual C++)MDIで、子ウィンドウのタイトルを自在に決める方法。

 子ウィンドウとは、WS_CHILDをスタイルに持つとかそういう意味ではなく、いわゆるMDIのChildWindow。って態々明記する必要無いですね。この子ウィンドウ、MFCが勝手に名前を付けてくれます。便利といえば便利な機能ですが、自分で名前をつけたい時もあります。でもPreCreateWindowで指定しても、SetWindowTextで指定しても、いつのまにか勝手に名前が置き換わってしまいます。次に紹介する手法は、MFCに勝手に名前を決めなくさせる手法です。ほっとけば名無しWindowになるので、どこかで適当にSetWindowTextでも使って指定してやって下さい。
  1. まず、CChildFrameに、次のようなvirtual関数を作成します。

  2. -----
    virtual void OnUpdateFrameTitle(BOOL bAddToTitle);
    -----
     
  3. この関数の定義は次のようにします。

  4. ----
    void CChildFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
    {
        GetMDIFrame()->OnUpdateFrameTitle(bAddToTitle);
    }
    ----
これだけで完了です。GetMDIFrame()なんたらかんたらは、メインウィンドウのタイトルはちゃんと変更させる為に必要となります。OnUpdateFrameTitleは他にも色々な使い方が出来そうですし。奥が深いですね〜。
 

8/12

 アプリケーションのデバッグ作業をしていて、この時点でこの変数がどうなっているか知りたい!と思った時にMFCのTRACEマクロはかなり便利です。標準出力に出しても良いのですが、VC++の機能としてデバッグ用の出力窓があるので、それにさくっと出力したい所です。このデバッグ出力、MFCの機能ってわけではないらしく(恐らくはOSの機能)、非MFCアプリケーションでもバッチリ利用できます。

(Visual C++)非MFCアプリケーションでのデバッグウィンドウへの出力方法。

 まず、OutputDebugStringというAPIを用いれば文字列を出力できます。ですが、これではただの文字列だけです。TRACEのようにフォーマット付きで出力するにはどうすれば?という時に用いるのが_RPT系のマクロです。引数の方はMSDNを見て下さい。固定数引数なのでTRACEよりは不便ですが・・・。なお、これを使うには<crtdbg.h>をインクルードする必要があります。  _CrtSetReportModeを用いれば、出力先をファイルやメッセージボックスにする事も出来るようです。もちろんリリースモードではこれらの関数は無視されます。

(Visual C++)非MFCアプリケーションでのメモリリークの検出方法。

 メモリリーク、すなわち、newしたのにdeleteしてないといったあれですね。バグの元になるので発見できるに越したことはありません。以下の方法を使うと、プログラムのどこでnewしたものがdeleteされていないのか、ソースファイル名と行番号がきっちり分かります。だからといって簡単に直せるものでもないのがメモリリークというものですが、多少はきっかけになるでしょう。
  1. ソースファイルの先頭に次のように記述します。

  2. -----
    #include <crtdbg.h>
     

    #ifdef _DEBUG
    #define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
    #define malloc(p1) _malloc_dbg(p1,_NORMAL_BLOCK,__FILE__,__LINE__)
    #endif
    -----
    malloc&freeのメモリリークも検出できるようになってますが、そんなもの使わないよという人は削っても良いでしょう。
     

  3. さらに、プログラムのどこか(初期化あたり)に、次のように記述します。

  4. -----
    _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
    -----
    これにより、プログラム終了時に発生している全てのメモリリークを(通常は)デバッグ出力に出してくれます。
この二つの方法があれば、バグなんてあっさり検出できます!すみません。嘘です。でも多少の手助けにはなると思いますのであとはひたすら気合でデバッグしましょう。


戻る
トップページへ
masato@mb.kcom.ne.jp