1

奇妙な問題が見つかりました。私の MFC アプリケーションでは、CWnd ポインターを CEdit にキャストしようとしています。GetFocus 関数を使用して CWnd ポインターを取得します。私がやっているときdynamic_cast<CEdit*>(pWnd)、それは0を返します.それは何でしょうか?

4

1 に答える 1

6

まず、MFC ライブラリは RTTI を有効にしてコンパイルされていdynamic_castないため、動作しません。

第 2 に、CWnd*返される byCWnd::FromHandleは現存するCWndであるか、存在しない場合は の周りの flyweight ラッパーHWNDです。flyweight ラッパーが返されたCEdit場合、基になるHWNDものがエディット コントロールを参照していても、それは にはなりません。

を保持する をCEditすでに作成している場合にのみ、 を取得します。CEditHWND

CWnd*取得した が既存のオブジェクトのものであることを知りたい場合は、次を使用しますCWnd::FromHandlePermanent

を取得するには、CEdit*明示的に作成し、 を呼び出しAttachて にアタッチする必要がありますHWND

または、チートしたい場合CEditは、データ メンバーや仮想関数がなく、から直接継承するCWndため、 (理論的には安全ではない) を使用できますstatic_cast。これは、メモリ内レイアウトがまったく同じであるためです。

于 2012-05-04T10:38:28.447 に答える