如何在一个CPP文件中,调用另外一个对话框中的控件?以及如何显示多行信息?

flyingba 2015-08-27 02:06:19
请教各位大神两个问题:

1、用VS2010的VC++,建立MFC的应用程序,选择对话框形式,然后在对话框上添加一个BUTTON控件,一个EDIT控件。
对BUTTON增加一个“点击”事件,内容是把一个数据输出到EDIT控件上,这个没问题。
但是,如果另外新增加一个CPP文件,在这个新增加的CPP文件中,要输出信息到EDIT控件,则怎么都编译出错,通不过。
请教,如何在一个CPP文件中,调用另外一个对话框中的控件?

2、因为要监视程序运行过程中的输出,但是这个EDIT控件永远只能显示一行,要显示多行该怎么办?
或者要显示多行该用哪个控件?
因为以前用的是C++ Builder,可以用其中的MEMO控件。但是VS2010 没有MEMO控件。

请各位大神指点。
谢谢。
...全文
419 1 收藏 25
写回复
25 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zengxyong 2015-08-29
写个回调函数,或者使用消息。这样可以把cpp和dlg分开,cpp做计算,dlg做显示。把显示的代码写在dlg中,output函数调用回调函数指针或者sendmessage。
回复
flyingba 2015-08-28
这是正常使用中的一个功能,为什么一定要用dedug版本才行呢? 我不相信VC++连这个正常使用的功能都没有,只是我这个业余程序员不懂而已。
回复
brk1985 2015-08-28
汗,为什么就不用debug版本吧,,debug只是生成信息多点、生成exe文件大点,,,发布前用debug肯定更好
回复
flyingba 2015-08-28
1、TRACE 宏只有在调试状态下才有所输出。我要的是程序在正常运行状态下能够使用,即在RELEASE状态下能够使用。 2、把中间过程结果写入到一个文件。但是这个文件,在程序运行的时候,应该是不能去打开的吧?如果在程序结束后,才能去打开文件看结果,就失去了意义。 3、设置断点,进行调试。这个不是我需要的,我不是在调试程序,是在正常运行程序期间,需要监视几个变量的变化情况。这在多变量寻优计算中是一种常用的方法,因为寻优计算可能收敛,也可能发散。一个计算可能要花20-30小时,如果看到开头的结果就不太秒,就可以人为中断,不进行下去了。 看样子,这个VC++的确没有这个功能。
回复
brk1985 2015-08-28
引用 17 楼 flyingba 的回复:
大神,不是在调用结束(output计算出结果)后将结果输出来,而是在调用过程中,将中间结果输出来,为的是看这个调用的函数的计算过程是否正确。 在 C++ Builder中,这是很简单的。 猜想在VC++中应该也能办到,只是我这个业余程序员不懂怎么办到。
这个容易,,,可以在output计算结果的函数里,实时输出计算结果 1、TRACE("中间结果:%d", sum);//可以类似这样的语句,debug版本可以在“Output”控制台看到。。。 2、写入到文件,把想要关注的变量写入到文件; 3、设置断点,进行调试,随时观察变量变化;
回复
zhusg 2015-08-28
你应该这样做,output(CEdit *edit) 把对话框上CEdit的指针传给这个函数,在这个函数里可以直接改变edit显示的值
回复
flyingba 2015-08-28
按照zhusg大神指点的方法,搞定了!!! 感谢zhusg!!! 感谢brk1985、感谢VisualEleven。 另外请教,给分是怎么操作的?
回复
zhusg 2015-08-28
引用 22 楼 flyingba 的回复:
这是正常使用中的一个功能,为什么一定要用dedug版本才行呢? 我不相信VC++连这个正常使用的功能都没有,只是我这个业余程序员不懂而已。
看一下18楼,可以让其他CPP中的信息输出到编辑框中
回复
flyingba 2015-08-27
引用 8 楼 brk1985 的回复:
[quote=引用 7 楼 brk1985 的回复:] [quote=引用 6 楼 flyingba 的回复:] 比如想实现这样一个功能: 1、名为Study的对话框上有一个BUTTON控件和一个EDIT控件,另外建立一个名为Output的cpp文件,该文件里面有一个名为 int Output()的函数。 2、想按下BUTTON,就调用Outout.cpp文件里面的Output函数,Output函数的内容是输出一个双精度实型变量a的值到EDIT控件。 请版主及众位大神指点如何实现上述设想,请尽量详细。我是VS2010的菜鸟,原来用的是C++ Builder。在C++ Builder里,这样的功能很容易实现。现在这个VS2010的实现,折腾我两周了,查了很多资料,也没有进展。 谢谢。
COutput temp; temp.Output(); 在按钮触发函数中,写上以上语句不行吗?[/quote]
引用 7 楼 brk1985 的回复:
[quote=引用 6 楼 flyingba 的回复:] 比如想实现这样一个功能: 1、名为Study的对话框上有一个BUTTON控件和一个EDIT控件,另外建立一个名为Output的cpp文件,该文件里面有一个名为 int Output()的函数。 2、想按下BUTTON,就调用Outout.cpp文件里面的Output函数,Output函数的内容是输出一个双精度实型变量a的值到EDIT控件。 请版主及众位大神指点如何实现上述设想,请尽量详细。我是VS2010的菜鸟,原来用的是C++ Builder。在C++ Builder里,这样的功能很容易实现。现在这个VS2010的实现,折腾我两周了,查了很多资料,也没有进展。 谢谢。
COutput temp; temp.Output(); 在按钮触发函数中,写上以上语句不行吗?[/quote] Output()只要返回一个double就好了,然后在按钮触发函数中,把double数据显示在编辑框。。。将编辑框与变量m_Value关联起来(给编辑框添加double类型变量m_Value),将Output()返回值赋给m_Value,然后UpdateData(FALSE);

	COutput temp;
	m_Value= temp.Output();
	//m_Value=3.1415926;
	UpdateData(FALSE);
[/quote] 恐怕不能这样用。因为其实我的本意并非只是想输出一个a变量的值这么简单,如果这样简单,只在按钮的触发函数里面直接输出就是了。 本意是在Output这个函数里,做一个比较耗时间的循环迭代优化计算,这个Output函数还会调用其他很多函数,我想在这个循环计算的过程中,监视若干个变量的值,这几个变量的值是循环迭代计算过程中的中间结果,是为了看这个循环迭代优化过程是否正确。 为了结构化看得清楚,所以把所涉及到的大概20个函数,分成了几个cpp文件。 所以,还是要求在Output函数中,如何输出变量的值。并且,猜测用UpdateData(FALSE)可能达不到目的。因为我要看迭代过程的输出,用UpdateData(FALSE)会不会把上次的迭代输出结果冲掉啊? 以前我是用C++ Builder的,的确比VC++在使用方面方便多了。 看样子,C++ Builder是给业余程序员用的,VC++是给专业程序员用的。 我之所以转向VC++,是为了使用OpenMP或者Intel TBB等并行计算功能,加快计算速度。
回复
brk1985 2015-08-27
引用 7 楼 brk1985 的回复:
[quote=引用 6 楼 flyingba 的回复:] 比如想实现这样一个功能: 1、名为Study的对话框上有一个BUTTON控件和一个EDIT控件,另外建立一个名为Output的cpp文件,该文件里面有一个名为 int Output()的函数。 2、想按下BUTTON,就调用Outout.cpp文件里面的Output函数,Output函数的内容是输出一个双精度实型变量a的值到EDIT控件。 请版主及众位大神指点如何实现上述设想,请尽量详细。我是VS2010的菜鸟,原来用的是C++ Builder。在C++ Builder里,这样的功能很容易实现。现在这个VS2010的实现,折腾我两周了,查了很多资料,也没有进展。 谢谢。
COutput temp; temp.Output(); 在按钮触发函数中,写上以上语句不行吗?[/quote]
引用 7 楼 brk1985 的回复:
[quote=引用 6 楼 flyingba 的回复:] 比如想实现这样一个功能: 1、名为Study的对话框上有一个BUTTON控件和一个EDIT控件,另外建立一个名为Output的cpp文件,该文件里面有一个名为 int Output()的函数。 2、想按下BUTTON,就调用Outout.cpp文件里面的Output函数,Output函数的内容是输出一个双精度实型变量a的值到EDIT控件。 请版主及众位大神指点如何实现上述设想,请尽量详细。我是VS2010的菜鸟,原来用的是C++ Builder。在C++ Builder里,这样的功能很容易实现。现在这个VS2010的实现,折腾我两周了,查了很多资料,也没有进展。 谢谢。
COutput temp; temp.Output(); 在按钮触发函数中,写上以上语句不行吗?[/quote] Output()只要返回一个double就好了,然后在按钮触发函数中,把double数据显示在编辑框。。。将编辑框与变量m_Value关联起来(给编辑框添加double类型变量m_Value),将Output()返回值赋给m_Value,然后UpdateData(FALSE);

	COutput temp;
	m_Value= temp.Output();
	//m_Value=3.1415926;
	UpdateData(FALSE);
回复
brk1985 2015-08-27
引用 6 楼 flyingba 的回复:
比如想实现这样一个功能: 1、名为Study的对话框上有一个BUTTON控件和一个EDIT控件,另外建立一个名为Output的cpp文件,该文件里面有一个名为 int Output()的函数。 2、想按下BUTTON,就调用Outout.cpp文件里面的Output函数,Output函数的内容是输出一个双精度实型变量a的值到EDIT控件。 请版主及众位大神指点如何实现上述设想,请尽量详细。我是VS2010的菜鸟,原来用的是C++ Builder。在C++ Builder里,这样的功能很容易实现。现在这个VS2010的实现,折腾我两周了,查了很多资料,也没有进展。 谢谢。
COutput temp; temp.Output(); 在按钮触发函数中,写上以上语句不行吗?
回复
flyingba 2015-08-27
比如想实现这样一个功能: 1、名为Study的对话框上有一个BUTTON控件和一个EDIT控件,另外建立一个名为Output的cpp文件,该文件里面有一个名为 int Output()的函数。 2、想按下BUTTON,就调用Outout.cpp文件里面的Output函数,Output函数的内容是输出一个双精度实型变量a的值到EDIT控件。 请版主及众位大神指点如何实现上述设想,请尽量详细。我是VS2010的菜鸟,原来用的是C++ Builder。在C++ Builder里,这样的功能很容易实现。现在这个VS2010的实现,折腾我两周了,查了很多资料,也没有进展。 谢谢。
回复
flyingba 2015-08-27
请教版主及众位大神,这个cpp文件调用另外一个对话框中的控件,到底应该怎么改呢? 上面一个最简单的文件,没有任何控件,在cpp文件中引入另外一个对话框的指针变量,也不行啊,请指点。 希望能详细些。 歇息。
回复
flyingba 2015-08-27
补充,如果再Output.cpp中增加#include "StudyDlg.h",形成如下文件: #include "stdafx.h" #include "StudyDlg.h" extern CStudyDlg* g_Dlg; int DataOutpit() { double aaa; return (0); } 则编译出现如下错误: 1>------ Build started: Project: Study, Configuration: Debug Win32 ------ 1> DataOutput.cpp 1>d:\testvs2010\study\study\studydlg.h(16): error C2065: 'IDD_STUDY_DIALOG' : undeclared identifier ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
回复
Eleven 2015-08-27
1。 要看你的新类和你的对话框有没有什么关联,比如你新类的对象作为对话框类的成员变量。那么你就可以修改你新类的构造函数,将对话框类的HWND或者CDialog*指针作为构造函数的参数传递给你的新类。 2. Edit控件直接多行属性,对话框编辑器中设置一下即可。
回复
flyingba 2015-08-27
大神,谢谢指点。按照上面的步骤,试了一下,还是不行啊。

1、建立名为Study的MFC对话框程序。在StudyDlg.cpp文件中,设立全局指针CStudyDlg* g_Dlg=NULL,并在OnInitDialog函数里g_Dlg=this。形成如下的文件:

CStudyDlg* g_Dlg=NULL;

BOOL CStudyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

g_Dlg=this;

return TRUE; // return TRUE unless you set the focus to a control
}

2、在"Solution Explorer"页上,找到"Study"下的"Source Files",右击后添加一个cpp文件,名为Output,并在其中添加如下内容:

#include "stdafx.h"

extern CStudyDlg* g_Dlg;

int DataOutpit()
{
double aaa;

return (0);
}

3、按F7编译,出现以下错误信息:

1>------ Build started: Project: Study, Configuration: Debug Win32 ------
1> StudyDlg.cpp
1> DataOutput.cpp
1>d:\testvs2010\study\study\dataoutput.cpp(3): error C2143: syntax error : missing ';' before '*'
1>d:\testvs2010\study\study\dataoutput.cpp(3): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\testvs2010\study\study\dataoutput.cpp(3): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1> Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

请大神指点,该如何修改。

谢谢。
回复
flyingba 2015-08-27
大神,不是在调用结束(output计算出结果)后将结果输出来,而是在调用过程中,将中间结果输出来,为的是看这个调用的函数的计算过程是否正确。 在 C++ Builder中,这是很简单的。 猜想在VC++中应该也能办到,只是我这个业余程序员不懂怎么办到。
回复
brk1985 2015-08-27
1、该对话框cpp设置一个全局对话框指针变量CXXXDlg* g_Dlg=NULL,在OnInitDialog函数里g_Dlg=this; 然后在需要调用该对话框控件的cpp里声明下extern CXXXDlg* g_Dlg; 2、显示多行:把编辑框控件的属性MultiLine改成TRUE,Auto HScroll改成FALSE,Auto VScroll改成TRUE
回复
brk1985 2015-08-27
引用 15 楼 flyingba 的回复:
谢谢大神。 我已经失去信心啦,打算把所有函数都一股脑放进StudyDlg.cpp中,里面由BUTTON的触发函数进行调用。本来是希望按照以前的习惯,所有这些由BUTTON的触发函数进行调用的函数,分别按照功能,放进不同的cpp文件,显得组织有序一点。 感觉VC++就是个“汇编语言”,是由专业程序员用的。俺这类业余程序员,没本事搞定这个VC++。 谢谢各位大神。
其实就函数传递参数问题,,,函数传参数如果熟悉,也比较简单。。。 output类需要的参数,主对话框调用时temp.output()实参传进去,需要获取用来输出的参数用变量作为参数(指针类型或引用类型),,,调用结束(output计算出结果)后该变量就有值了,然后输出来。。。
回复
flyingba 2015-08-27
谢谢大神。 我已经失去信心啦,打算把所有函数都一股脑放进StudyDlg.cpp中,里面由BUTTON的触发函数进行调用。本来是希望按照以前的习惯,所有这些由BUTTON的触发函数进行调用的函数,分别按照功能,放进不同的cpp文件,显得组织有序一点。 感觉VC++就是个“汇编语言”,是由专业程序员用的。俺这类业余程序员,没本事搞定这个VC++。 谢谢各位大神。
回复
加载更多回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2015-08-27 02:06
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……