• ベストアンサー

ウィンドウの破棄について

アプリの中から動的に新規にウィンドウを作っています。 この新規に作ったウィンドウをそのウィンドウのクライアント領域を右クリックして破棄したいと思います。 とりあえず以下のようにしてみましたが、不正な処理で落ちてしまいます。 どこが悪いのでしょうか? よろしくお願いいたします。 ********************** void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point) { ::DestroyWindow(m_hWnd); CWnd::OnRButtonDown(nFlags, point); }

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

  • ベストアンサー
  • mk1234
  • ベストアンサー率30% (20/65)
回答No.1

これでどうでしょう? void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point) { CWnd::OnRButtonDown(nFlags, point); ::DestroyWindow(m_hWnd); }

VitaminBB
質問者

お礼

回答ありがとう御座います。 期待通りに動きました。

その他の回答 (3)

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

>CWndとDestroyWindowで検索したら山ほどヒットして確認できません。 CWnd::DestroyWindowでは? これで実装の部分が検索されるはずですけど。

VitaminBB
質問者

お礼

検索できました。 まだまだレベルが低いようです。

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

>::DestroyWindow(m_hWnd); なぜAPIを直接呼ぶんですか? CWndにメンバ関数あるんですから。 MFCのウィンドウはAttachでサブクラス化されています。 いきなりAPIで破棄したら落ちるのは当然です。 メンバ関数のDestroyWindow()の実装を見て 単純にAPIをコールしているだけではないことを確認してください。 void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point) { DestroyWindow(); CWnd::OnRButtonDown(nFlags, point); }

参考URL:
http://www.okweb.ne.jp/kotaeru.php3?q=624248
VitaminBB
質問者

お礼

回答ありがとう御座います。 >なぜAPIを直接呼ぶんですか? 以前教えていただいたメンバ変数を使って実験的に 試してみました。 DestroyWindow(); も質問前には確認しましたが、CWnd::OnRButtonDown(nFlags, point); と順番が入れ替わっていたため、やはり落ちてしまい、質問時は深く考えずAPIの方で聞いてしまいました。 >いきなりAPIで破棄したら落ちるのは当然です。 順番を変えることでAPI関数でも落ちなくなりました。(一応報告です) >メンバ関数のDestroyWindow()の実装を見て 教えに従い、ぜひ確認したいのですが確認の方法がわかりません。 CWndとDestroyWindowで検索したら山ほどヒットして確認できません。 CWnd.hを検索しましたがヒットしませんでした。 デバッグモードではフリーズしていまいうまく行きませんでした。 なにか別の良い方法があるのでしょうか? >単純にAPIをコールしているだけではないことを確認してください。 アドバイスに従い、安易にAPIを使わないようにします。

VitaminBB
質問者

補足

補足です。 DestroyWindow(); CWnd::OnRButtonDown(nFlags, point); この順番では落ちます。 CWnd::OnRButtonDown(nFlags, point); DestroyWindow(); この順番では落ちません。 >メンバ関数のDestroyWindow()の実装を見て 別のコードでデバッグして確認しました。 コードの内容全てはわかりませんが、単純にAPIを呼んでいるわけではないことは確認しました。

  • driverII
  • ベストアンサー率27% (248/913)
回答No.2

WM_CLOSEを自分に送るんじゃなかったっけ。 破棄ではなく、「閉じる」

VitaminBB
質問者

お礼

回答ありがとう御座います。 やりたいことは、閉じるのではなく破棄したいのですが、WM_CLOSEでも現象的には期待通りに動きました。

VitaminBB
質問者

補足

すみません。訂正です。 WM_CLOSEでは、なにも起こらずうまく行きませんでした。