VC++中的windows窗体应用程序,form1和form2的白痴问题

时间:2022-09-05 08:27:31
ok在VS2008里面
我用vc++创建了一个windows窗体应用程序
自动生成了主窗口Form1
然后我又添加了一个Form2
想实现运行之后在Form1里面点一个按钮,然后Form2就弹出来了
让用户录入一些信息(俩名字而已)
录入结束之后Form2就没用了就关了
但是当然信息需要传递到Form1里面

现在主要的问题就是:
Form1.h和Form2.h我不会建立联系
怎么建立联系呢?
我在Form2.h的开头写了#include"Form1.h"
然后在Form2.h中写的时候
Form1::nameA=this->textBox1->Text;
Form1::nameB=this->textBox2->Text;
貌似没什么问题了(传递信息这一步)

但是怎么在Form1.h中建立与Form2.h的联系呢?
当我也在Form1.h的开头写上#include"Form2.h"的时候
报错:fatal error C1014: 包含文件太多 : 深度 = 1024

请问这个头文件包含什么的到底怎么包含,包含到哪?
然后我想用户点击"新游戏"的时候Form2弹出来,怎么实现
private: System::Void 新游戏ToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
 }

大括号里怎么写?

真心求教,越详细越好,在线等谢谢`

23 个解决方案

#1


啊啊好久了等的

#2


不是还没人会吧?

#3


该回复于2010-10-25 13:17:28被版主删除

#4


form2就是个对话框类,在form1中建立一个form2的类对象就可以吧。form1中建立一个成员函数onbutton{}在函数里建立类对象

#5


1. 头文件
#include "Form2.h"
2. 声明
public ref class Form1 : public System::Windows::Forms::Form
{
  public:

Form1(void)
{
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
}
}
3. 调用
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
 fm1->Show(); // 每次点击都能显示一个Form2窗口
 fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}

#6


5L
首先谢谢你,按你的方法我添加的Form2出来了.

在Form1.h里面
1. 头文件
#include "Form2.h"
然后2. 声明是不是该写上
public ref class Form1 : public System::Windows::Forms::Form
{
public:
       Form^ fm1;
      Form^ fm2;
 //感觉你好像这个地方漏了呵呵

Form1(void)

//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
}
}
3. 调用
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
fm1->Show(); // 每次点击都能显示一个Form2窗口
fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}



运行之后点击button2成功召唤出了Form2.
但是怎么在Form1和Form2之间传递数据呢?
我在Form1.h中有这样一个public变量String^ nameA
我希望在Form2中给nameA赋值
比如nameA=this->textBox1->Text;
但直接这样写会出现
错误----   error C2065“nameA”: 未声明的标识符

如果我在Form2.h的头部也加上
#include "Form1.h"
又会出现另一个错误
fatal error C1014: 包含文件太多 : 深度 = 1024

怎么在Form2中操作Form1.h中的变量呢?
谢谢!

#7


我从别的地方看见的 你自己试试 我没试
1、在form1中写函数
public void setdata(string str)
{
this.textbox1.text=str;
}

2、产生第二个窗体
form2 f=new form2();
f.owner=this; //这句很关键
f.show();

3、从第二个窗体返回参数
((form1)this.owner).setdata(this.textbox1.text);

二、直接从第二个窗体对第一个窗体的控件进行操作
1、首先将form1中的textbox1的modifiers属性设置为public

2、产生第二个窗体
form2 f=new form2();
f.owner=this; //这句很关键
f.show();

3、直接从form2操作form1中的文本框
((form1)this.owner).textbox1.text=this.textbox1.text;

#8


http://bbs.bccn.net/thread-176345-1-1.html
可能会有参考

#9


托管的和C井差别好象不是很大,还以为是NATIVE的呢.

#10


该回复于2010-11-01 10:28:51被版主删除

#11


得了我还是贴出来吧
Form1.h:
 
#include"Form21.h"
#pragma once



namespace KeyBoardgame {

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

/// <summary>
/// Form1 摘要
///
/// 警告: 如果更改此类的名称,则需要更改
///          与此类所依赖的所有 .resx 文件关联的托管资源编译器工具的
///          “资源文件名”属性。否则,
///          设计器将不能与此窗体的关联
///          本地化资源正确交互。
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
static String^ nameA;
static String^ nameB;
Form^ fm1;
Form^ fm2;

......中间没用的省了

public:
Form1(void)
{
InitializeComponent();
//
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();

//
level=3;
}

......中间再省一部分没关系的code

private: System::Void 新游戏ToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
 fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}

......这样点击"新游戏"Form2就出现了

然后Form2.h的
#pragma once

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



namespace KeyBoardgame {

/// <summary>
/// Form2 摘要
///
/// 警告: 如果更改此类的名称,则需要更改
///          与此类所依赖的所有 .resx 文件关联的托管资源编译器工具的
///          “资源文件名”属性。否则,
///          设计器将不能与此窗体的关联
///          本地化资源正确交互。
/// </summary>
public ref class Form2 : public System::Windows::Forms::Form
{
public:
Form2(void)
{
InitializeComponent();
//
//TODO: 在此处添加构造函数代码
//
}

protected:
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
~Form2()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^  button1;
protected: 

private:
/// <summary>
/// 必需的设计器变量。
/// </summary>
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
void InitializeComponent(void)
{
......省了
}
#pragma endregion
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
 Form1::nameA=this->button1->Text;
                                 //这句到底怎么写,总错  }
};
}

#12


继续等,郁闷死我了,跪求高人指点

#13


我帮你看看 不一定能解决呢 呵呵 

#14


继续等.我感觉这个很常见呀.很多程序运行之后不是都会弹出一个窗口让你输入账号密码嘛,这种传递应该很常用的怎么网上怎么找都找不到.郁闷again

#15


继续等....第三天了

#16


把工程文件的cpp贴上,不是Form1.h和Form2.h

#17



// KeyBoardgame.cpp: 主项目文件。

#include "stdafx.h"
#include "Form1.h"


using namespace KeyBoardgame;


[STAThreadAttribute]
int main(array<System::String ^> ^args)
{



// 在创建任何控件之前启用 Windows XP 可视化效果
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false); 

// 创建主窗口并运行它
Application::Run(gcnew Form1());
return 0;
}


或者你直接+我Q说吧,393422044

#18


form1 (主form)

#include "form_test.h"
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
 String^ nameA = L"new game";
 form_test^ fm = gcnew form_test(nameA);
 //fm->Owner = this;
 fm->ShowDialog();
 }


form_test(form2)

public:
form_test(String^ str)
{
InitializeComponent();
textBox1->Text = str;
//
//TODO: 在此处添加构造函数代码
//
}


利用构造函数

#19


网上关于这块的东西挺多的 你自己看看 
http://blog.csdn.net/wesleyluo/archive/2008/11/13/3292077.aspx

#20


该回复于2010-10-27 10:36:16被版主删除

#21


可以结贴了.18楼的看懂了不过只能从父窗口往子窗口传
然后看了很多我自己也想了想,折腾出两种从子窗口往父窗口传递的方法
其实都很简单不过自己想想还真用了3,4天,呵呵
下面分享一下

首先form1.h里面的开头需要#include"Form2.h"   //废话...
方法一.同样利用构造函数,实现回传

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
 
String^ nameA = "new game";//弄一个String型的对象
                Form2^ fm = gcnew Form2(&nameA);//把这个对象的 引用 传递到子窗口里面
                fm->ShowDialog();//子窗口以对话框的形式调出来(Form2关闭前nameA已被重赋值)
this->button1->Text=nameA;//然后在子窗口中通过指针nameA已经被重新赋值
}

然后当然了,Form2.h中的构造函数需要重写

Form2(String^ *str)//重载Form2的构造函数,在Form1中创造Form2的时候通过构造函数传递信息
{
InitializeComponent();
//传递的是一个String型的指针.这样可以实现Form1与Form2之间的双向信息传递!!
this->button2->Text=*str;//从父传到子窗口(如18楼方法)
*str=this->button1->Text;//从子窗口传到父窗口,父窗口中str的值被改变了
}


其实和18楼的方法相比,只有一点不同,就是传递的不是String型变量,而是String型指针变量,这样就可以实现双向的传递了



方法二.这个方法似乎更简单...
先在从Form2.h说
在Form2类中写一个String型的变量,或者静态变量都可以(本人没发现区别..)

public ref class Form2 : public System::Windows::Forms::Form
{
public:static String ^strr;//在Form2类中声明一个String型静态变量(或者普通变量)

然后在需要的地方,比如Form2中点击按钮的时候给strr赋值

private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
strr="能行吗?";//在子窗口中,对Form2的静态变量赋值
//然后在父窗口中可以再调用子窗口中的这个静态变量,从而实现子->父的信息传递
}


然后要怎么把这些传回Form1呢
记得之前在Form1.h的开头有include"Form2.h"的对吧
然后就这样

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                Form2^ fm = gcnew Form2();
                fm->ShowDialog();//子窗口以对话框的形式调出来
this->button2->Text=fm->strr;//然后这样就传了..
}


就这样,也许大家都一样吧,每个人都会遇到对自己困难的问题,别人的帮助不可少,自己的钻研同样也是.谢谢各位,尤其是yaohuang306  liuyj 多谢!

#22


引用 21 楼 fkrfkr32865 的回复:
可以结贴了.18楼的看懂了不过只能从父窗口往子窗口传
然后看了很多我自己也想了想,折腾出两种从子窗口往父窗口传递的方法
其实都很简单不过自己想想还真用了3,4天,呵呵
下面分享一下

首先form1.h里面的开头需要#include"Form2.h" //废话...
方法一.同样利用构造函数,实现回传

C/C++ code

private: System::Void but……

哈哈,聪明的娃~~ 大家相互学习~加油~

#23


你在form2中写一个函数专门用于获取数据,你在form1中构造对象。只要都form的click事件你就调用这个函数就可以把数据传递过来呢!

#1


啊啊好久了等的

#2


不是还没人会吧?

#3


该回复于2010-10-25 13:17:28被版主删除

#4


form2就是个对话框类,在form1中建立一个form2的类对象就可以吧。form1中建立一个成员函数onbutton{}在函数里建立类对象

#5


1. 头文件
#include "Form2.h"
2. 声明
public ref class Form1 : public System::Windows::Forms::Form
{
  public:

Form1(void)
{
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
}
}
3. 调用
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
 fm1->Show(); // 每次点击都能显示一个Form2窗口
 fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}

#6


5L
首先谢谢你,按你的方法我添加的Form2出来了.

在Form1.h里面
1. 头文件
#include "Form2.h"
然后2. 声明是不是该写上
public ref class Form1 : public System::Windows::Forms::Form
{
public:
       Form^ fm1;
      Form^ fm2;
 //感觉你好像这个地方漏了呵呵

Form1(void)

//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
}
}
3. 调用
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
fm1->Show(); // 每次点击都能显示一个Form2窗口
fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}



运行之后点击button2成功召唤出了Form2.
但是怎么在Form1和Form2之间传递数据呢?
我在Form1.h中有这样一个public变量String^ nameA
我希望在Form2中给nameA赋值
比如nameA=this->textBox1->Text;
但直接这样写会出现
错误----   error C2065“nameA”: 未声明的标识符

如果我在Form2.h的头部也加上
#include "Form1.h"
又会出现另一个错误
fatal error C1014: 包含文件太多 : 深度 = 1024

怎么在Form2中操作Form1.h中的变量呢?
谢谢!

#7


我从别的地方看见的 你自己试试 我没试
1、在form1中写函数
public void setdata(string str)
{
this.textbox1.text=str;
}

2、产生第二个窗体
form2 f=new form2();
f.owner=this; //这句很关键
f.show();

3、从第二个窗体返回参数
((form1)this.owner).setdata(this.textbox1.text);

二、直接从第二个窗体对第一个窗体的控件进行操作
1、首先将form1中的textbox1的modifiers属性设置为public

2、产生第二个窗体
form2 f=new form2();
f.owner=this; //这句很关键
f.show();

3、直接从form2操作form1中的文本框
((form1)this.owner).textbox1.text=this.textbox1.text;

#8


http://bbs.bccn.net/thread-176345-1-1.html
可能会有参考

#9


托管的和C井差别好象不是很大,还以为是NATIVE的呢.

#10


该回复于2010-11-01 10:28:51被版主删除

#11


得了我还是贴出来吧
Form1.h:
 
#include"Form21.h"
#pragma once



namespace KeyBoardgame {

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

/// <summary>
/// Form1 摘要
///
/// 警告: 如果更改此类的名称,则需要更改
///          与此类所依赖的所有 .resx 文件关联的托管资源编译器工具的
///          “资源文件名”属性。否则,
///          设计器将不能与此窗体的关联
///          本地化资源正确交互。
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
static String^ nameA;
static String^ nameB;
Form^ fm1;
Form^ fm2;

......中间没用的省了

public:
Form1(void)
{
InitializeComponent();
//
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();

//
level=3;
}

......中间再省一部分没关系的code

private: System::Void 新游戏ToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
 fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}

......这样点击"新游戏"Form2就出现了

然后Form2.h的
#pragma once

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



namespace KeyBoardgame {

/// <summary>
/// Form2 摘要
///
/// 警告: 如果更改此类的名称,则需要更改
///          与此类所依赖的所有 .resx 文件关联的托管资源编译器工具的
///          “资源文件名”属性。否则,
///          设计器将不能与此窗体的关联
///          本地化资源正确交互。
/// </summary>
public ref class Form2 : public System::Windows::Forms::Form
{
public:
Form2(void)
{
InitializeComponent();
//
//TODO: 在此处添加构造函数代码
//
}

protected:
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
~Form2()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^  button1;
protected: 

private:
/// <summary>
/// 必需的设计器变量。
/// </summary>
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
void InitializeComponent(void)
{
......省了
}
#pragma endregion
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
 Form1::nameA=this->button1->Text;
                                 //这句到底怎么写,总错  }
};
}

#12


继续等,郁闷死我了,跪求高人指点

#13


我帮你看看 不一定能解决呢 呵呵 

#14


继续等.我感觉这个很常见呀.很多程序运行之后不是都会弹出一个窗口让你输入账号密码嘛,这种传递应该很常用的怎么网上怎么找都找不到.郁闷again

#15


继续等....第三天了

#16


把工程文件的cpp贴上,不是Form1.h和Form2.h

#17



// KeyBoardgame.cpp: 主项目文件。

#include "stdafx.h"
#include "Form1.h"


using namespace KeyBoardgame;


[STAThreadAttribute]
int main(array<System::String ^> ^args)
{



// 在创建任何控件之前启用 Windows XP 可视化效果
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false); 

// 创建主窗口并运行它
Application::Run(gcnew Form1());
return 0;
}


或者你直接+我Q说吧,393422044

#18


form1 (主form)

#include "form_test.h"
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
 String^ nameA = L"new game";
 form_test^ fm = gcnew form_test(nameA);
 //fm->Owner = this;
 fm->ShowDialog();
 }


form_test(form2)

public:
form_test(String^ str)
{
InitializeComponent();
textBox1->Text = str;
//
//TODO: 在此处添加构造函数代码
//
}


利用构造函数

#19


网上关于这块的东西挺多的 你自己看看 
http://blog.csdn.net/wesleyluo/archive/2008/11/13/3292077.aspx

#20


该回复于2010-10-27 10:36:16被版主删除

#21


可以结贴了.18楼的看懂了不过只能从父窗口往子窗口传
然后看了很多我自己也想了想,折腾出两种从子窗口往父窗口传递的方法
其实都很简单不过自己想想还真用了3,4天,呵呵
下面分享一下

首先form1.h里面的开头需要#include"Form2.h"   //废话...
方法一.同样利用构造函数,实现回传

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
 
String^ nameA = "new game";//弄一个String型的对象
                Form2^ fm = gcnew Form2(&nameA);//把这个对象的 引用 传递到子窗口里面
                fm->ShowDialog();//子窗口以对话框的形式调出来(Form2关闭前nameA已被重赋值)
this->button1->Text=nameA;//然后在子窗口中通过指针nameA已经被重新赋值
}

然后当然了,Form2.h中的构造函数需要重写

Form2(String^ *str)//重载Form2的构造函数,在Form1中创造Form2的时候通过构造函数传递信息
{
InitializeComponent();
//传递的是一个String型的指针.这样可以实现Form1与Form2之间的双向信息传递!!
this->button2->Text=*str;//从父传到子窗口(如18楼方法)
*str=this->button1->Text;//从子窗口传到父窗口,父窗口中str的值被改变了
}


其实和18楼的方法相比,只有一点不同,就是传递的不是String型变量,而是String型指针变量,这样就可以实现双向的传递了



方法二.这个方法似乎更简单...
先在从Form2.h说
在Form2类中写一个String型的变量,或者静态变量都可以(本人没发现区别..)

public ref class Form2 : public System::Windows::Forms::Form
{
public:static String ^strr;//在Form2类中声明一个String型静态变量(或者普通变量)

然后在需要的地方,比如Form2中点击按钮的时候给strr赋值

private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
strr="能行吗?";//在子窗口中,对Form2的静态变量赋值
//然后在父窗口中可以再调用子窗口中的这个静态变量,从而实现子->父的信息传递
}


然后要怎么把这些传回Form1呢
记得之前在Form1.h的开头有include"Form2.h"的对吧
然后就这样

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                Form2^ fm = gcnew Form2();
                fm->ShowDialog();//子窗口以对话框的形式调出来
this->button2->Text=fm->strr;//然后这样就传了..
}


就这样,也许大家都一样吧,每个人都会遇到对自己困难的问题,别人的帮助不可少,自己的钻研同样也是.谢谢各位,尤其是yaohuang306  liuyj 多谢!

#22


引用 21 楼 fkrfkr32865 的回复:
可以结贴了.18楼的看懂了不过只能从父窗口往子窗口传
然后看了很多我自己也想了想,折腾出两种从子窗口往父窗口传递的方法
其实都很简单不过自己想想还真用了3,4天,呵呵
下面分享一下

首先form1.h里面的开头需要#include"Form2.h" //废话...
方法一.同样利用构造函数,实现回传

C/C++ code

private: System::Void but……

哈哈,聪明的娃~~ 大家相互学习~加油~

#23


你在form2中写一个函数专门用于获取数据,你在form1中构造对象。只要都form的click事件你就调用这个函数就可以把数据传递过来呢!