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