如何让c ++类与Windows Form文本框进行通信

时间:2014-11-12 10:43:59

标签: forms c++-cli

我目前正在用C ++ / CLI编写程序。我有一个Windows窗体作为用户界面。现在我要做的是声明一个单独的c ++类,并让它访问表单上的文本框。

表单在MyForm.h文件中声明 该类由头文件和cpp文件定义,让我们调用它们myClass.cpp和myClass.h

程序的功能应该如下:程序应该通过当前可用的所有串行端口,然后尝试打开它们并轮询它们以获取数据。如果串口有一个很好的答案,那么它应该结束搜索并保持连接到这个端口。所以在这种情况下,myClass应该检查串口并返回所需端口的名称。我还希望能够在Windows窗体的文本框中跟踪端口搜索线程的进度。我可能只是将端口搜索包含在表单的初始化代码中,但这将非常混乱并且会在单个头文件中导致大量代码。这看起来并不合理。

我知道我无法直接访问Windows窗体文本框并且必须使用Invoke方法,这当前不是问题。问题是我真的不知道如何让两个类相互通信。我已经尝试声明一个指向MyForm对象的指针,但这似乎不起作用。我似乎无法获得头和cpp文件连接。

如果这听起来令人困惑,我很抱歉,我会尝试通过示例和代码进行解释。

仅仅为了概念测试,我制作了一个非常简单的程序,它由一个Windows窗体和一个名为simpleAdder的类组成。

//simpleAdder.h

#pragma once
#include "MyForm.h"

using namespace System;
using namespace simpleClassTest;

public ref class simpleAdder
{
private:
    Int16 a;
    Int16 b;
    MyForm^ m_form;

public:
    simpleAdder(Int16 x,Int16 y, MyForm^ form);
    Int16 add (void);

};

这是simpleAdder的cpp文件:

//simpleAdder.cpp

#include "MyForm.h"
#include "simpleAdder.h"

using namespace System;
using namespace simpleClassTest;


simpleAdder::simpleAdder(Int16 x,Int16 y, MyForm^ form){

   a = x;
   b = y;
   m_form = form;
}

Int16 simpleAdder::add (void){
   return a+b;

//Try to invoke the textbox method. This is not implemented yet.
}

所以我的想法是,我会有一个指向现有表单的托管指针,通过这个,我可以访问表单本身。加法器类基本上应该尝试将x + y的结果写入表单文本框。

以下是MyForm.h文件中的一些代码

#pragma once
#include "simpleAdder.h"

namespace simpleClassTest {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;


//ref class simpleAdder;

/// <summary>
/// Summary for MyForm
/// </summary>
public ref class MyForm : public System::Windows::Forms::Form
{
public:
    MyForm(void)
    {
        InitializeComponent();
        this->m_add = (gcnew simpleAdder (16,10));
        //
        //TODO: Add the constructor code here
        //
    }

protected:
    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    ~MyForm()
    {
        if (components)
        {
            delete components;
        }
    }

private:
    /// <summary>
    /// Required designer variable.
    /// </summary>

    simpleAdder^ m_add;
private: System::Windows::Forms::Button^  button1;
private: System::Windows::Forms::TextBox^  textBox1;

    System::ComponentModel::Container ^components;

//Here follows the automatically generated code.

问题在于,无论我做什么,我都无法编译。编译器无法识别MyForm类型变量。还有两个包含彼此的标题似乎不对,但我真的不知道还能做什么。我尝试在同一名称空间中声明这两个类,但这也没有帮助。然后我尝试在MyForm头文件中声明simpleAdder类,但这不起作用。

我显然没有c ++ / cli经验,而且我似乎在做一些根本错误的事情。我认为必须有更好的方法来实现这样的事情。我的意思是最后我必须在Windows窗体中添加其他类来显示信息等。必须有一种简单的方法来做到这一点。任何有关这方面的帮助将非常感激。

1 个答案:

答案 0 :(得分:0)

让我们看看包含的顺序:

simpleAdder.cpp包含MyForm.h

MyForm.h包含simpleAdder.h

在easyAdder.h中包含到MyFrom.h被跳过,因为#pragma一次

然后是代码:

public ref class simpleAdder
{
private:
    Int16 a;
    Int16 b;
    MyForm^ m_form;

public:
    simpleAdder(Int16 x,Int16 y, MyForm^ form);
    Int16 add (void);

};

但是在任何地方都没有宣布MyForm。

阅读前瞻性声明。您可以在simpleAdder:

之前声明MyForm
public ref class simpleAdder; // or without public