从visual c ++中的类控制表单元素

时间:2012-05-25 04:20:50

标签: visual-c++ user-interface

我创建了这个自定义测试类:

#include "Form1.h"

class Demo
{
public:
    void sayHello()
    {
        System::Windows::Forms::Form1->Text = "Hello Form!"; // does not work
        Form1->Text = "Hello Form!"; // does not work
        Form1.Text = "Hello Form!"; // does not work
    }
};

我基本上得到了这个编译错误:

c:\users\pieter kubben\documents\visual studio 2010\projects\testclassref\testclassref\Demo.h(8): error C2065: 'Form1' : undeclared identifier
c:\users\pieter kubben\documents\visual studio 2010\projects\testclassref\testclassref\Demo.h(8): error C2227: left of '->Text' must point to class/struct/union/generic type

所以我猜它没有看到Form1。反过来说,单击Form1中的按钮时调用sayHello()函数也没问题。

我注意到我的main()函数(由IDE自动生成)包含以下行: Application::Run(gcnew Form1());

因此,我认为在编译器启动时尚未创建Form1,尽管Form1.h确实存在(当然)。

如何从自定义类中访问Form1元素?例如。改变Form1.Text?

2 个答案:

答案 0 :(得分:1)

创建一个全局变量来保存表单对象并更改生成的IDE以显示表单 像这样

Form1 frm=gvnew Form1();
Application::Run(frm);

现在frm是form1类的引用,你可以访问它来访问Form1类成员。如果要访问Main函数之外的frm对象,则声明一个全局变量并访问它。

答案 1 :(得分:0)

error C3145: 'form' : global or static variable may not have managed type 

当您尝试制作Form1 ^frm;Form1 ^frm = gcnew Form1();

等表单的全局变量时,这就是我所得到的

所以我为它创建了容器,这对我来说很好。 有一个例子

ref class FormContainer{
public:
    static MyForm ^form;
};
void Main(array<String^>^ args)
{
    FormContainer::form = gcnew MyForm();
    Application::Run(FormContainer::form);
}

现在你可以访问公共成员了,所以一定要做出你需要的getter和setter。

void SayHello(){
  FormContainer::form->label1->Text = "Hello";
}

P.S。我正在使用VS 2013.