2012-05-04 12 views
1

奇妙な問題が見つかりました。私のMFCアプリケーションでは、CEnditにCWndポインタをキャストしようとしています。 GetFocus関数を介してCWndポインタを取得します。 dynamic_cast<CEdit*>(pWnd)を実行すると、0が返されます。MndでCWndのCEditポインタへのポインタをキャスト

+0

あなたの 'CWnd'ポインタは実際に' CEdit'コントロールへのポインタですか? –

+0

Yeap。私はそれがCEditコントロールを指していることを確認しました。 GetDlgCtrlIDを呼び出すと、コントロールのIDが返されます。 – besworland

+0

RTTIが有効になっていますか?これはC++コンパイラの設定で確認できます – msteiger

答えて

5

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

第二に、CWnd::FromHandleによって返さCWnd*は、いずれかの現存CWndある、またはどれも、HWND周りフライ級ラッパーが存在しない場合。フライウェイトラッパーが返された場合、HWNDがエディットコントロールを参照していても、CEditになりません。

HWNDを保持するためにCEditを既に作成している場合は、CEditが表示されます。

あなたはCWnd*あなたが得るがHWNDに添付するAttachを呼び出して、明示的に作成する必要がありCEdit*を取得するにはCWnd::FromHandlePermanent

を使用して、既存のオブジェクトのためのものであることを知りたい場合。

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

+0

実際はstatic_castがうまく動作します。唯一のポイントは、どのような種類の要素に焦点が当てられているかを確認する必要があることです。だから私はあなたにdynamic_castできると思った。 – besworland

+4

いいえ、あなたは 'GetClassName(HWND)'をする必要があります。 – Ben

+0

GetClassNameは良い方法です!ありがとうございました! – besworland

関連する問題