2009-05-21 6 views
4

私はHWNDしか知りませんが、特定のアプリケーションの内部で動作するプラグイン(C++/CLI DLL)を開発しています。私のプラグインは、主なアプリケーションの子として振る舞いたいと思うさまざまな.NETフォームを表示します(例えば、メインウインドウの中心に置くなど)。.NETフォームをHWNDに子孫化する

// MyDialog.h 
public ref class MyDialog : public System::Windows::Forms::Form { 
    public: 
     MyDialog(const int parentHWND); 

    private: 
     IntPtr parent_; 
}; 

// MyDialog.cpp 
// Attempt1: Use SetParent and CenterParent 
MyDialog::MyDialog(const int parentHWND) : parent_(parentHWND) { 
    SetParent(reinterpret_cast<HWND>(this->Handle.ToPointer()), reinterpret_cast<HWND>(parent_.ToPointer())); 

    this->StartPosition = FormStartPosition::CenterParent; 
} 

これは、子としてMyDialog行為をするために表示されます(つまり、あなたがメインのアプリなどの外に移動することはできません)が、CenterParentへの呼び出しは、所望の結果を持っていない:ここで私が試したものです。

私はHWNDからのNativeWindowを作成して(表示するためにそれを渡すことをお勧め(SOを含む)、オンラインいくつかのアイデアを)見つけ:

// in MyDialog.h 
void Show() new; 

// MyDialog.cpp 
// ... 
void MyDialog::Show() { 
    NativeWindow^ nw = gcnew NativeWindow(); 
    nw->AssignHandle(parent_); 
    this->Show(nw); 
} 

しかし、これは、私がテストすることができ、すべての場合で、クラッシュに表示されますメインアプリケーション(私のダイアログを表示した後、興味深い)。私はそれを得ることができる場合、クラッシュ情報で投稿を更新します。

希望の動作を一貫して達成する方法に関する提案を探しています。私が必要とするのは、メインウィンドウにモードレスダイアログを配置し、それを子として動作させることだけです。

ご協力いただければ幸いです。

+0

を持っていませんか? – Weeble

+0

種類...私のメモを見ると、.NETのFormStartPosition :: CenterParentモードの実装に関する問題がありました。代わりに、私はFormStartPosition :: Manualを使い、親のRECTを使って画面上の位置を計算しています。 – Ryan

+1

私はあなたの問題を解決した場合、答えとしてあなたのソリューションを投稿します。そうすれば、他の人は簡単に見つけてそれに投票することができます。 –

答えて

0

私は同様の問題を持っていた...あなたはForm.OnLoadをオーバライドしてMyBase.OnLoadを呼び出さない場合、StartPosition.CenterParentはあなたがこれを理解しました何の効果