私は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);
}
しかし、これは、私がテストすることができ、すべての場合で、クラッシュに表示されますメインアプリケーション(私のダイアログを表示した後、興味深い)。私はそれを得ることができる場合、クラッシュ情報で投稿を更新します。
希望の動作を一貫して達成する方法に関する提案を探しています。私が必要とするのは、メインウィンドウにモードレスダイアログを配置し、それを子として動作させることだけです。
ご協力いただければ幸いです。
を持っていませんか? – Weeble
種類...私のメモを見ると、.NETのFormStartPosition :: CenterParentモードの実装に関する問題がありました。代わりに、私はFormStartPosition :: Manualを使い、親のRECTを使って画面上の位置を計算しています。 – Ryan
私はあなたの問題を解決した場合、答えとしてあなたのソリューションを投稿します。そうすれば、他の人は簡単に見つけてそれに投票することができます。 –