- ベストアンサー
ウィンドウの破棄について
アプリの中から動的に新規にウィンドウを作っています。 この新規に作ったウィンドウをそのウィンドウのクライアント領域を右クリックして破棄したいと思います。 とりあえず以下のようにしてみましたが、不正な処理で落ちてしまいます。 どこが悪いのでしょうか? よろしくお願いいたします。 ********************** void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point) { ::DestroyWindow(m_hWnd); CWnd::OnRButtonDown(nFlags, point); }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
これでどうでしょう? void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point) { CWnd::OnRButtonDown(nFlags, point); ::DestroyWindow(m_hWnd); }
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>CWndとDestroyWindowで検索したら山ほどヒットして確認できません。 CWnd::DestroyWindowでは? これで実装の部分が検索されるはずですけど。
お礼
検索できました。 まだまだレベルが低いようです。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>::DestroyWindow(m_hWnd); なぜAPIを直接呼ぶんですか? CWndにメンバ関数あるんですから。 MFCのウィンドウはAttachでサブクラス化されています。 いきなりAPIで破棄したら落ちるのは当然です。 メンバ関数のDestroyWindow()の実装を見て 単純にAPIをコールしているだけではないことを確認してください。 void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point) { DestroyWindow(); CWnd::OnRButtonDown(nFlags, point); }
お礼
回答ありがとう御座います。 >なぜAPIを直接呼ぶんですか? 以前教えていただいたメンバ変数を使って実験的に 試してみました。 DestroyWindow(); も質問前には確認しましたが、CWnd::OnRButtonDown(nFlags, point); と順番が入れ替わっていたため、やはり落ちてしまい、質問時は深く考えずAPIの方で聞いてしまいました。 >いきなりAPIで破棄したら落ちるのは当然です。 順番を変えることでAPI関数でも落ちなくなりました。(一応報告です) >メンバ関数のDestroyWindow()の実装を見て 教えに従い、ぜひ確認したいのですが確認の方法がわかりません。 CWndとDestroyWindowで検索したら山ほどヒットして確認できません。 CWnd.hを検索しましたがヒットしませんでした。 デバッグモードではフリーズしていまいうまく行きませんでした。 なにか別の良い方法があるのでしょうか? >単純にAPIをコールしているだけではないことを確認してください。 アドバイスに従い、安易にAPIを使わないようにします。
補足
補足です。 DestroyWindow(); CWnd::OnRButtonDown(nFlags, point); この順番では落ちます。 CWnd::OnRButtonDown(nFlags, point); DestroyWindow(); この順番では落ちません。 >メンバ関数のDestroyWindow()の実装を見て 別のコードでデバッグして確認しました。 コードの内容全てはわかりませんが、単純にAPIを呼んでいるわけではないことは確認しました。
- driverII
- ベストアンサー率27% (248/913)
WM_CLOSEを自分に送るんじゃなかったっけ。 破棄ではなく、「閉じる」
お礼
回答ありがとう御座います。 やりたいことは、閉じるのではなく破棄したいのですが、WM_CLOSEでも現象的には期待通りに動きました。
補足
すみません。訂正です。 WM_CLOSEでは、なにも起こらずうまく行きませんでした。
お礼
回答ありがとう御座います。 期待通りに動きました。