我正在开发一个在某个应用程序内部运行的插件(C++/CLI DLL),我只知道该应用程序的 HWND。我的插件显示了我希望充当主应用程序子级的各种 .NET 表单(例如,以主窗口为中心等)。这是我尝试过的:
// 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 的调用没有达到预期的结果。
我在网上发现了一些想法(包括 SO ),建议从 HWND 创建 NativeWindow 并将其传递给 Show():
// in MyDialog.h
void Show() new;
// MyDialog.cpp
// ...
void MyDialog::Show() {
NativeWindow^ nw = gcnew NativeWindow();
nw->AssignHandle(parent_);
this->Show(nw);
}
但是,在我可以测试的所有情况下,这似乎都会导致主应用程序崩溃(有趣的是,在显示我的对话框之后)。如果我能获得崩溃信息,我将更新该帖子。
我正在寻找有关如何始终如一地实现所需行为的建议。我所需要的只是能够将无模式对话框置于主窗口的中心,并让它充当子窗口。
如有任何帮助,我们将不胜感激。
最佳答案
我遇到了类似的问题...如果您覆盖 Form.OnLoad 并且不调用 MyBase.OnLoad 则 StartPosition.CenterParent 无效
关于.net - 将 .NET 表单设置为 HWND 的父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/892512/