• ベストアンサー

非表示のメインウィンドウを表示させるには?

環境 WIN98 VC++6.0 MFC SDIにて タスクトレイに常駐するアプリにおいて 1.起動時にメインウィンドウを非表示にしています。 2.起動時と同時にダイアログを表示しています。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; } 3.このような場合に、ダイアログのボタン押し下げにて、メインウィンドウを表示させるには、どうすれば良いでしょうか? 以下のようにしてみましたが、不正な処理で落ちてしまいます。 void CInput::OnButton1() { CWnd* mywnd = (CWnd*)GetParent(); mywnd->ShowWindow(SW_SHOW); }

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

落ちるのでしたらmywndの内容チェックをしましょう。 おそらくGetParent()の戻り値がNULLなんでしょうけど。 で、メインウィンドウを取得するならこれでしょう。 AfxGetMainWnd() http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_mfc_afxgetmainwnd.asp

VitaminBB
質問者

お礼

回答ありがとうございます。 AfxGetMainWnd() で出来ました。

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>OnInitDialog() 内で読み込んだデータをグローバル変数でプロジェクト名.cppに渡してプロジェクト名.cpp内の関数で処理することにしました。 オブジェクト指向の観点から言うとあまりよくない方法ですねぇ。 アプリケーション全体で使用するデータは、CWinAppの派生クラスで管理するべきです。 また、グローバル変数の乱用は、ソースの可読性も落とします。 こういうときのために、MFCのグローバル関数があるんですから、ぜひ活用してください。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_mfc_application_information_and_management.asp AfxGetApp()を使えばグローバル変数を使用する必要ないですよね?

VitaminBB
質問者

お礼

回答ありがとうございます。 AfxGetApp()を使う仕様に変更しました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>メインウィンドウとダイアログの作成される順番を考えると無理なようですね。 これの解決方法としては、ウィンドウやダイアログが完全に作成されてから処理を行うですね。 簡単な方法は、OnCreateやOnInitDialogでPostMessageで自ウィンドウに対して自分で定義したメッセージを送信します。 こうすることで、OnCreateやOnInitDialogによるウィンドウの作成が終了した後に確実に処理を行うことができます。 #MFCで、独自メッセージのメッセージハンドラの定義方法、忘れちゃいました(^^; ヘルプには書いてあるはずですけど。

VitaminBB
質問者

お礼

OnInitDialog() 内で読み込んだデータをグローバル変数でプロジェクト名.cppに渡してプロジェクト名.cpp内の関数で処理することにしました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

おまけ GetParent()で何でだめかは、これだけでは不明です。 自分で調べるのでしたら、 dlg->Create(IDD_DIALOG1); からMFCのソースをデバッグしていって、CreateDialogなんとかって APIの親ウィンドウハンドルの値がどのようにセットされているかを調べればわかるかも。 あと、GetParent()の中も。 #どうしてGetParentの戻り値をCWnd*でキャストしてるのですか?

VitaminBB
質問者

お礼

回答ありがとうございます。 今度は、ダイアログのボタン押し下げではなく、ダイアログのBOOL CInput::OnInitDialog() 内から、メインウィンドウを表示させたいのですがうまく行きません。 BOOL CInput::OnInitDialog() 内でxxx.txtファイルを開いてデータを読み込みデータが1だったらメインウィンドウを表示させようとしています。

VitaminBB
質問者

補足

お礼後の記述です。 メインウィンドウとダイアログの作成される順番を考えると無理なようですね。 別途考えます。

関連するQ&A