0

我有一个使用 OwlNext 创建的主窗体,它调用在 vcl 中创建的对话框。

MyOtherFormClass Form2=new Form2();
void MyMainForm::ShowForm2(void) {
    Form2->ShowDialog(this);
}
class MyOtherFormClass {
    [...]
    TForm *myForm;

  void ShowDialog(TWindow* parent){

    TForm* tf = new TForm((HWND)NULL);
    tf->ParentWindow=parent->Handle;

    myForm= new TForm(tf);
    myForm->Parent=tf->Parent;
    myForm->Caption = "Form2";
    myForm->Height = 950;
    myForm->Width = 1350;
    myForm->BorderIcons << biMinimize << biMaximize << biSystemMenu;
    myForm->BorderStyle = bsSizeable;
    myForm->Show();
}
}

现在我的两个窗口都有一个新的任务栏条目。
当我单击那里的主窗口时,它会出现在 Form2 的前面。
但是当我单击 Form2 时,它停留在 Main 后面。
此外,当 Form2 发出警报时,关闭警报将关注 Main 而不是 Form2。

MessageBox(NULL, "An Alert!", "!", MB_OKCANCEL)

你能告诉我我在这里做错了什么吗?

4

1 回答 1

2

为什么要创建 2 个TForm对象?你只需要1。

tf->Parent是NULL,因为tf->ParentWindow使用(顺便说一句,你可以传递parent->HandleTForm(HWND)构造函数),所以myForm没有分配父窗口,只是一个你没有跟踪的所有者。所有者和父母是两个不同的东西。您可能希望MainForm成为 Form2 窗口的父级。

至于你的MessageBox()电话,你没有给它一个所有者窗口。您需要这样做,以便它知道要留在哪个窗口前面,更重要的是,当它关闭时要关注哪个窗口。

试试这个:

MyOtherFormClass *Form2 = new MyOtherFormClass();

void MyMainForm::ShowForm2(void) {
    Form2->ShowDialog(this);
}

class MyOtherFormClass {
    //...
    TForm *myForm;

    void ShowDialog(TWindow* parent) {
        myForm = new TForm(parent->Handle);
        myForm->Caption = "Form2";
        myForm->Height = 950;
        myForm->Width = 1350;
        myForm->BorderIcons = TBorderIcons() << biMinimize << biMaximize << biSystemMenu;
        myForm->BorderStyle = bsSizeable;
        myForm->Show();
    }
};

MessageBox(myForm->Handle, "An Alert!", "!", MB_OKCANCEL);
于 2014-10-02T20:45:33.990 回答