モードレスダイアログ ボックスの破棄について

このQ&Aのポイント
  • VC++6.0でアプリケーションを開発していますが、モードレスダイアログの破棄の事で困っています。
  • 膨大な数の画面とコントロールを持つアプリケーションで、子ダイアログボックスを使いたいと思っていますが、その破棄方法について分からないです。
  • CWnd::DestroyWindow関数を使ってダイアログボックスを破棄することができるようですが、メモリの解放も同時に行われるのかが不明です。ご教示いただけますか?
回答を見る
  • ベストアンサー

モードレスダイアログ ボックスの破棄について

はじめまして。 VC++6.0でアプリケーションを開発していますが、モードレスダイアログの破棄の事で困っています。 まずアプリケーションの状況から説明します。 メインフレームを親として、複数の子ダイアログボックスが大量にある状態です。 1つのプロセスで使用している画面数、コントロール数とも膨大な為、子ダイアログを使うたびに作成→破棄(メモリの解放)を繰り返すようにしたいと思っています。 Create 関数で作成したダイアログ ボックスを破棄するには、CWnd::DestroyWindow 関数を使えばいいようですが、この関数を使用すればメモリの解放もされているのでしょうか? タスクマネージャを見る限り、メモリの使用量は減っていないようなのですが・・・ NSDNなどで色々調べたのですが、CWnd::PostNcDestroy関数も合わせて使用し、delete this としないとメモリの解放は出来ないのかどうかが、いまいち良く分かりません。 残り時間がほとんどなく、本当に困っています。 どなたかよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jx-word
  • ベストアンサー率40% (38/94)
回答No.1

だいぶ前に同じようなことを調べた記憶があります。 確かOSによって挙動が異なって、Win2Kの場合はダイアログ破棄と同時にメモリは元に戻ります。 一方WinXPの場合はダイアログを破棄してもその時点では使用メモリは減りません。 が、ダイアログの生成/破棄を繰り返していると、ある時どさっと減ることが分かりました。 面倒なのでそれ以上の調査はしてませんが、同じ現象ではないでしょうか。

mTULIPm
質問者

お礼

jx-wordさん、回答ありがとうございました。 その後自分でも、ダイアログの生成/破棄を繰り返しやってみたところ、ある程度するとメモリの増減がある事が分かりました。 なので、とりあえずDestroyWindowだけで解放されているようですね。

関連するQ&A

  • VC++でモードレスダイアログ

    突然で申し訳ありません。 VC++でアプリケーションを作成しているのですが、 メインフレームからモードレスダイアログを表示するまではよかったのですが、モードレスダイアログボックスの裏に隠れたメインフレームをどうやっても表に表示できません。リソースファイルでの設定がいろいろあるようで、やってみたのですが、うまくいきません。 どなたか知っている方がいらっしゃいましたら、無知な私にご教授願えないでしょうか。 宜しくお願いいたします。 因みにダイアログのプロパティは 「タイトルバー」と「システムメニュー」をチェックしてあるだけです。。。。。 お願いします。

  • モードレスダイアログをクリックして親を表示したくない

    初めまして。 VC++ win32で開発をしていますが、 モードレスダイアログをCreateDialogで作成し、ShowWindow(TRUE)で表示後、 他のアプリケーションを別プロセスで使用しているときにTOPMOSTで表示している上記ダイアログをクリックすると、親のウィンドウが表示されてしまいます。 これを抑止することはできないのでしょうか。 C#.NETだとできるようなのですが。 よろしくお願いいたします。

  • 複数のModelessDialogの終了

    メインダイアログと複数のモードレスダイアログがあるアプリがあります。 そのうちの一つのモードレスダイアログに終了ボタンがあり、ボタンが押されるとメインダイアログにSendMessageにて通知して、メインダイアログからモードレスダイアログをDestroyWindowにて終了させ、各モードレスダイアログの変数にNULLをセットするのですが、その後終了ボタン処理に戻ってしまい、Access Violationとなってしまいます。 普通こういう構成のアプリケーションの場合、どういった手段を用いるのが妥当でしょうか。 例えばSendMessageではなくPostMessageを使う等…。 「自分ならこうする」でも結構ですので教えて頂ければと思います。 環境:Windows7+VC9

  • インスタンス破棄時にメモリが解放されるようにしたい

    C++言語でプログラムを作成しています あるクラスでインスタンス生成時に動的にメモリを割り当てた後 インスタンスが破棄されるまでそれを使用し インスタンス破棄時に解放するにはどうしたらいいでしょうか デストラクタで解放処理を実装すると 明示的にデストラクタが呼ばれた際に解放されてしまい インスタンスが破棄されるまで使用できませんでした

  • モードレスダイアログのキー入力について

    VC++6.0で親ダイアログで作成した子ダイアログをモードレスで表示しています。(ShowWindowで表示した後、子ダイアログが終了するまでループ) 両方のダイアログに、OKボタンとキャンセルボタンしかない時には、リターンキー・ESCキーを押せば子ダイアログが終了していました。(親ダイアログにフォーカスがあるときには親ダイアログが終了) ところが、子ダイアログが表示されている間、親ダイアログ上でプログレスバーを表示・更新ようにしたら、とたんにリターンキー・ESCキーが効かなくなり、マウスのクリックでしか終了することができなくなりました。 WEBで調べてPreTranslateMessageを追加して、この関数にブレイクポイントを設定しましたが、呼ばれている様子がありません。 子ダイアログをマウスのボタンクリックで終了させた後は、親ダイアログのPreTranslateMessageでイベントが取得できます。 何をどうしたらリターンキー・ESCキーのイベントが取得できるようになるのでしょうか?

  • バックグラウンドカラーを変更したいのですが。。

    VisualC++でプログラムを組んでいる者です。 ダイアログベース上に定義したコンボボックスとエディットボックスに対して、あるトリガーがひかれると、背景色を赤色に変更したいと思っているのですが、うまく出来ません。 CWnd::OnCtlColor関数を使用するべきなのかなとは思っているのですが、書き方が理解できてないです。 アドバイス宜しくお願いします。

  • "今後このダイアログボックスを表示しない。"を再表示させるには?

    Windowsで、各種アプリケーションを立ち上げたり使用しているときに出てくるダイアログボックスの中で、"今後このダイアログボックスを表示しない。"という項目があるものがあります。チェックボックスにチェックを入れると、次回からはそのダイアログボックスは出てこなくなりますが、このダイアログボックスを再び表示するようにさせたい場合に何か方法はあるのでしょうか。出来れば再インストールは避けたいのですが.....

  • 別スレッドからメインダイアログのコントロールにアクセスする方法

    VC++2005 MFC WindowsXPを使用しています。 メインダイアログに作成したエディットボックスに フォーカスをセットしたいのですが、 別スレッドから行うにはどのようにすればよいのでしょうか? メインダイアログにあるボタンを押すと別スレッドの処理に入り、 その中でメインダイアログのコントロールを操作しようとしています。 //フォーカスをセット CWnd* MyEdit = ( CWnd* )this->GetDlgItem( IDC_EDIT1 ); MyEdit->SetFocus(); 宜しくお願い致します。

  • ダイアログボックスからファイル名の取得をしたい(ACCESS97)

    コマンドボタンを押すと「ファイル名を選択」ダイアログボックスが開き、 そこで選んだファイル名がテキストボックスに表示される、という フォームをACCESS97で作成したいのですが、ダイアログボックスを表示させる ために何という関数を使えば良いのかが分かりません。 宜しくお願いいたします。

  • MFCのCDialogクラスについて、、、

    環境:VC6.0、MFC、WinNT4.0 普通のモードレスダイアログを作成して、メニューから呼び出すようにしました。 デフォルトについてくる「OK」「Cancel」ボタンは要らないので削除しました。 ところが、アプリケーションを実行して作成したダイアログを呼び出した後、「Enter」或いは「Esc」キーを押すとダイアログが消えてしまいます。 それが消えないようにしたいのですが、、、 ご指導お願いします。

専門家に質問してみよう