如何从子表单

时间:2018-04-17 16:32:46

标签: c++ forms clr

我用C ++(CLR)编写应用程序。它是一个带有表单的应用程序。

我有两种表单:MainFormExtensionsForm。程序启动时会显示MainForm。单击该按钮后,将创建ExtensionsForm

我也有这些文件:MainForm.hMainForm.cppExtensionsForm.hExtensionsForm.cpp

要创建表单ExtensionsForm,我已将其添加到文件MainForm.h的开头:

#pragma once
#include "ExtensionsForm.h" // <-- added

MainForm按钮onClick事件处理程序中打开ExtensionsForm我添加了这个:

ExtensionsForm^ extensionsForm = gcnew ExtensionsForm();
extensionsForm->ShowDialog();

此代码正常运行。

但是,点击MainForm中的按钮后,我需要对ExtensionsForm的外观进行一些更改。我该如何正确实现?

提前谢谢!

我的尝试

我已在MainForm中创建了方法(功能),并尝试在ExtensionsForm中调用此方法。我可以使用构造函数来传递引用,但无论如何我有一个错误: enter image description here

如何解决这个问题?

我的解决方案

我在*.h文件中包含了所有Main.cpp个文件。在Main.cpp里面我有这个:

#include "MainForm.h"
#include "ExtensionsForm.h"

之后,如果我想在另一个表单上进行更改(例如,我可以按ExtensionsForm上的按钮并且更改必须出现在MainForm),我可以这样做:

  1. 我可以在public中创建MainForm.h方法,这会对此表单进行一些更改。我的例子:

    public: void updateButton(int amount, int maxAmount) {
        button->Text = amount + " / " + maxAmount;
    }
    public: void updateTextBox(String^ text) {
        textBox->Text = text;
    }
    
  2. 要显示新表单,我可以使用MainForm.cpp中的方法。我的例子:

    #include "MainForm.h"
    #include "ExtensionsForm.h"
    
    namespace FileFinder {
    
        [STAThreadAttribute]
        int main(array<System::String ^> ^args)
        {
            Application::EnableVisualStyles();
            Application::SetCompatibleTextRenderingDefault(false);
            FileFinder::MainForm mainForm;
            Application::Run(%mainForm);
            return 0;
        }
        void MainForm::buttonExtensions_Click(System::Object^  sender, System::EventArgs^  e) {
            ExtensionsForm^ extensionsForm = gcnew ExtensionsForm();
            extensionsForm->Owner = this;
            extensionsForm->ShowDialog();
        }
    }
    

    此处实现(定义)方法buttonExtensions_Click。它还有MainForm.h中的定义:

    private: void buttonExtensions_Click(System::Object^ sender, System::EventArgs^ e);

    这非常有效,但您必须在*.cpp文件中实现(定义)您的方法,该文件包含您的*.h文件或此*.h文件(定义必须存在)。您也可以在此方法中看到extensionsForm->Owner = this;。这对于下一步是必要的。

  3. 在这之后,您可以在ExtensionsForm.h

    中使用类似的内容
    private: void buttonConfirmExtensions_Click(System::Object^  sender, System::EventArgs^  e) {
        MainForm^ mainForm = (MainForm^)this->Owner;
        mainForm->updateButtonExtensions(checkedExtensionsCount, extensionsCount);
        mainForm->updateTextBoxExtensions(textBoxExtensionsString);
        this->Close();
    }
    

    您可以通过MainForm获取Owner并使用此表单中定义的public方法。这就是全部。

1 个答案:

答案 0 :(得分:-1)

通过将一些代码重新定位到.cpp文件来解决这个问题。

Hans Passant,谢谢你的建议。