vc 窗口中怎样调用同一项目下另一窗口的函数?

lianghong 2018-09-15 01:01:40
我用vc++2008 建立了Form1与Form2两个 windows应用 窗口,启动窗体Form1中有一过程:
 public: System::Void ShowMySub(){
Debug::WriteLine(L"XXXX showmysub");
}


在Form1中 呼出了Form2: 代码如下:
Form2^ Form2=gcnew Form2();
Form2->Name=L" Form2";
Form2->Owner=this;
Form2->Show();

我在 Form2.cpp 中 #include "Form1.h ,并想在Form2的过程中调用 Form1中的过程函数: ShowMySub()
我在Form2中执行的调用代码如下:
Form^ Form1 = (Form^)this->Owner;
Form1->BackColor = Color::Red;
Form1->ShowMySub(); // 出错!

错误 1 error C2825: 'Form1': 当后面跟“::”时必须为类或命名空间 d:\vbgood\myc++projects\vc++2008v\ssamp_c++5\ssamp_c++\FrmTVCTRLpanel.h 532 SSAMP_C++
错误 2 error C2039: “btnTVPlayAndPuse_MouseUp”: 不是“`global namespace'”的成员 d:\vbgood\myc++projects\vc++2008v\ssamp_c++5\ssamp_c++\FrmTVCTRLpanel.h 532 SSAMP_C++
错误 3 error C2146: 语法错误 : 缺少“;”(在标识符“btnTVPlayAndPuse_MouseUp”的前面) d:\vbgood\myc++projects\vc++2008v\ssamp_c++5\ssamp_c++\FrmTVCTRLpanel.h 532 SSAMP_C++
错误 4 fatal error C1903: 无法从以前的错误中恢复;正在停止编译 d:\vbgood\myc++projects\vc++2008v\ssamp_c++5\ssamp_c++\VBalanceBar.h 130 SSAMP_C++



...全文
600 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lianghong 2019-07-06
  • 打赏
  • 举报
回复
几个月了,问题终于自己解决了!
答案:
1:不要在 Form2.h 中#include"Form1.h",也不要在不要在 Form1.h 中#include"Form2.h",要在stdafx.h中#include"Form1.h";#include"Form2.h";
2: 不要在 Form2.h中 直接写调用 Form1.h中过程的语句,可在Form2.h中调用写在Form2.cpp中的一个过程(任意),在 Form2.cpp中的过程(任意)中用 “$(RootNamespace)"::Form1::ShowMySub();的方式 调用 Form1.h中的 过程(Form1.h中的过程ShowMySub必须Public 与static)
3: 写在 Form1.h中的过程 ShowMySub()(必须Public 与static)中调用的 其他过程也必须是 static过程,为避免这个麻烦,可在ShowMySub 引发一个事件,再由这个事件调用你想调用的过程。
wuxia2118 2018-12-23
  • 打赏
  • 举报
回复
最好 采用窗口之间的消息传递。
绿色盒子 2018-11-29
  • 打赏
  • 举报
回复
在 Form2.cpp 中 #include "Form1.h
那么在在Form1中要使用前向声明 Class Form2;
cuilonggang 2018-11-29
  • 打赏
  • 举报
回复
引用 3 楼 lianghong 的回复:
弱弱的问一个,谁能给一个在Form2 中调用Form1中的函数ShowMySub的调用部份示例,我这边怎样试的出错!我明明在 Form2.cpp 中已经 #include "Form1.h ,在Form2中的调用函数ShowMySub的代码改成如下:
Form1^ Form_1 = (Form1^)Application::OpenForms["Form1"];
Form1->ShowMySub();
第一句就出错!
error C2065: “Form1”: 未声明的标识符

Form_1->ShowMySub();
qq_26868981 2018-09-26
  • 打赏
  • 举报
回复
form1头文件
#pragma once
#include "Form2.h"

// CForm1 对话框

class CForm1 : public CDialog
{
DECLARE_DYNAMIC(CForm1)

public:
CForm1(CWnd* pParent = NULL); // 标准构造函数
virtual ~CForm1();

// 对话框数据
enum { IDD = IDD_DIALOG2 };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
CForm2 mform2;
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedButton1();
private:
static CForm1* handleInstance;
public:
static CForm1* GetHandleInstance()
{
if (handleInstance==NULL)
{
handleInstance=new CForm1();
}
return handleInstance;
}
static void DeleteHandleInstance()
{
if (handleInstance!=NULL)
{
delete handleInstance;
handleInstance=NULL;
}
}
};


form1cpp
// Form1.cpp : 实现文件
//

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


// CForm1 对话框
CForm1 *CForm1::handleInstance=NULL;
IMPLEMENT_DYNAMIC(CForm1, CDialog)

CForm1::CForm1(CWnd* pParent /*=NULL*/)
: CDialog(CForm1::IDD, pParent)
{
handleInstance=this;
}

CForm1::~CForm1()
{
}

void CForm1::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CForm1, CDialog)
ON_BN_CLICKED(IDOK, &CForm1::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON1, &CForm1::OnBnClickedButton1)
END_MESSAGE_MAP()


// CForm1 消息处理程序

void CForm1::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//OnOK();
mform2.ShowWindow(SW_SHOW);
}

BOOL CForm1::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: 在此添加额外的初始化
mform2.Create(IDD_DIALOG3,this);
mform2.ShowWindow(SW_SHOW);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

void CForm1::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
MessageBox(_T("调用了form1的函数"));
}


form2头文件
#pragma once


// CForm2 对话框

class CForm2 : public CDialog
{
DECLARE_DYNAMIC(CForm2)

public:
CForm2(CWnd* pParent = NULL); // 标准构造函数
virtual ~CForm2();

// 对话框数据
enum { IDD = IDD_DIALOG3 };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
};


form2cpp
// Form2.cpp : 实现文件
//

#include "stdafx.h"
#include "ZCSIM.h"
#include "Form2.h"
#include "Form1.h"

// CForm2 对话框

IMPLEMENT_DYNAMIC(CForm2, CDialog)

CForm2::CForm2(CWnd* pParent /*=NULL*/)
: CDialog(CForm2::IDD, pParent)
{

}

CForm2::~CForm2()
{
}

void CForm2::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CForm2, CDialog)
ON_BN_CLICKED(IDOK, &CForm2::OnBnClickedOk)
END_MESSAGE_MAP()


// CForm2 消息处理程序

void CForm2::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//OnOK();
CForm1 *form1=CForm1::GetHandleInstance();
form1->OnBnClickedButton1();
}


l357630798 2018-09-21
  • 打赏
  • 举报
回复
引用 3 楼 lianghong 的回复:
弱弱的问一个,谁能给一个在Form2 中调用Form1中的函数ShowMySub的调用部份示例,我这边怎样试的出错!我明明在 Form2.cpp 中已经 #include "Form1.h ,在Form2中的调用函数ShowMySub的代码改成如下: Form1^ Form_1 = (Form1^)Application::OpenForms["Form1"]; Form1->ShowMySub(); 第一句就出错! error C2065: “Form1”: 未声明的标识符
正常! 其实是你Form1要用Form2,你必须Form1中包含Form2的头文件, 然后,你Form2又要用Form1,你就必须Form2中必须包含Form1的头文件。 这样,你需要向前声明!!! 其实,不建议在Cpp代码中使用Cs。 解决办法: 1.使用向前声明看是否能解决? 2.正常做法,发消息。 3.如果不涉及窗口句柄,正常做法,写个包含ShowMySub()方法的基类,然后Form1/ Form2继承之,然后函数随你用。不过,如果涉及到窗口句柄,那就窗口发消息!
sichuanwww 2018-09-21
  • 打赏
  • 举报
回复
发个消息过去,sendMessage(handle2,WM_CHAR,3,0)
在handl2窗口里定义OnChar函数的具体功能
shen_wei 2018-09-20
  • 打赏
  • 举报
回复
做窗口直接的消息传递。。自定义消息!!
lianghong 2018-09-17
  • 打赏
  • 举报
回复
弱弱的问一个,谁能给一个在Form2 中调用Form1中的函数ShowMySub的调用部份示例,我这边怎样试的出错!我明明在 Form2.cpp 中已经 #include "Form1.h ,在Form2中的调用函数ShowMySub的代码改成如下:
Form1^ Form_1 = (Form1^)Application::OpenForms["Form1"];
Form1->ShowMySub();
第一句就出错!
error C2065: “Form1”: 未声明的标识符
蒋晟 2018-09-16
  • 打赏
  • 举报
回复
Form^ Form1 = (Form^)this->Owner;
这里Form1 明明是Form类型不是Form1类型,所以你调用Form1 的成员会出错
schlafenhamster 2018-09-15
  • 打赏
  • 举报
回复
public: System::Void ShowMySub(){
Debug::WriteLine(L"XXXX showmysub");
}
改为 全局 函数 ,不放类中

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧