TForm隐藏在主窗口后面

时间:2014-10-02 18:06:17

标签: c++ c++builder vcl tform owlnext

我有一个用OwlNext创建的主表单,它调用在vcl中创建的Dialog。

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();
}
}

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

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

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

1 个答案:

答案 0 :(得分:2)

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

tf->Parent为NULL,因为使用tf->ParentWindow(BTW,您可以将parent->Handle传递给TForm(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);