mfc程序运行中提示语输出?(控制台编程习惯了cout了啊!!)

u_lever 2012-02-20 05:13:32
一直都是用控制台编程,但是最近为了能用mfc的数据库接口,转到了mfc下。
控制台编程时习惯了随手cout,程序执行到什么环节,把当前的信息显示出来,这样运行到哪里都有个反馈。

但是到了mfc底下,这个事却变难了。

开始尝试了单文档。就是把我原来控制台的程序搞到一个菜单响应里,点击菜单执行。我想在文本区输出相应的提示信息,自己写了个功能函数,但是显示总是不正常。而且最关键的是,由于放到菜单响应里的执行挺复杂,运行个半小时也正常。这就造成了点了菜单后文档取就假死了,更别说显示提示语了……

void mfc_display_prompt( CDC * pDC, int * y, CString Words, int nHeight/*=40*/,LPCTSTR lpszFacename/*="宋体"*/, int nWeight/*=FW_NORMAL*/,BYTE bItalic/*=0*/, BYTE bUnderline/*=0*/ )
{
if (print_on)
{
CFont ftext;
TEXTMETRIC tm;
int nLineHeight;

//////////////////////////////////////////////////////////////////////////
ftext.CreateFont(nHeight,0,0,0,nWeight,bItalic,bUnderline,0,
DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH|FF_ROMAN,lpszFacename);

pDC->SelectObject(&ftext);

pDC->TextOut(0,*y,Words);

pDC->GetTextMetrics(&tm);
nLineHeight=tm.tmHeight;
*y -= nLineHeight;

}
}

请各位指点应该咋办?
1、如何正常显示
2、有其他思路能满足我cout的愿望就行,对话框模式下给个文本框如果能解决问题也行。
...全文
286 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
vrace 2012-02-23
  • 打赏
  • 举报
回复
楼主,在程序开始用

AllocConsole();
freopen("CONOUT$", "w+t", stdout);

建立控制台,

然后就可以看到 cout 或者 printf 的内容了
tuccty 2012-02-21
  • 打赏
  • 举报
回复
额...好吧,我把多线程给忘了.
u_lever 2012-02-20
  • 打赏
  • 举报
回复
上网查了一下多线程,有一个博文回答了我的疑问。感兴趣的朋友也可以看一下。
http://www.vckbase.com/code/downcode.asp?id=2973

下为引用:

编写一个耗时的单线程程序:

  新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下:

void CSingleThreadDlg::OnSleepSixSecond()
{
Sleep(6000); //延时6秒
}

  编译并运行应用程序,单击“延时6秒”按钮,你就会发现在这6秒期间程序就象“死机”一样,不在响应其它消息。为了更好地处理这种耗时的操作,我们有必要学习——多线程编程。

zO_Oz 2012-02-20
  • 打赏
  • 举报
回复
很不扯淡的说————断点调试。
u_lever 2012-02-20
  • 打赏
  • 举报
回复
11楼:
那看来真的搞两个线程么?把我的计算放到一个线程里,窗口响应放到另一个里?

14楼:
这方法我也想到了,但是程序没运行完,我老打开log文件查看当前算到哪了,又怕影响程序继续写入啥的带来不稳定。
tuccty 2012-02-20
  • 打赏
  • 举报
回复
或者你可以做一个Log文件.具体其他的方法我倒是暂时没想到.
tuccty 2012-02-20
  • 打赏
  • 举报
回复
你的菜单响应函数没处理完自然不会去运行其它的消息响应函数.
tuccty 2012-02-20
  • 打赏
  • 举报
回复
额..这个自然阿.程序处理消息是一条一条处理的.
u_lever 2012-02-20
  • 打赏
  • 举报
回复
9楼:
关键是一运行,窗口区就是假死状态,资源管理器中显示的是未响应。要等整个菜单响应函数(全部计算过程)执行完了,才能活过来。我很费解……
tuccty 2012-02-20
  • 打赏
  • 举报
回复
或者你可以考虑下程序下方的状态栏.
u_lever 2012-02-20
  • 打赏
  • 举报
回复
7楼:
你看我写的那段函数mfc_display_prompt,就是试图用DC网view里textout啊,但是

mfc_display_prompt(DC,&y,"computing sum");
c=a+b;
...
mfc_display_prompt(DC,&y,"computing multiply");
c=a*b;
...
还是不行,实际程序中不是加减乘除这样的运算,是很复杂的运算逻辑和过程。所以一运行,窗口区就假死了。

难道还要用到多线程啥的么?控制台转过来的,对线程没大有概念。
mzlogin 2012-02-20
  • 打赏
  • 举报
回复
如果是文档工程的话,创建一个DC对View区域TextOut吧,
如果是Dialog工程,那使用一个文本控件,然后SetDlgItemText或者SetItemText即可。
u_lever 2012-02-20
  • 打赏
  • 举报
回复
3楼:
messageBox会弹出对话框,然后你得点确定才能继续……有点纠结

难道那么大片的文本区没有什么方便的方法能根据当前程序进度动态输出提示么
u_lever 2012-02-20
  • 打赏
  • 举报
回复
1楼:
我说的输出信息不是为了方便调试,而是在release版运行时也能看到。

int a=1,b=2;
int c;

cout<<"computing sum"<<endl;
c=a+b;
...
cout<<"computing multiply"<<endl;
c=a*b;
...

大概是这样的意思
mzlogin 2012-02-20
  • 打赏
  • 举报
回复
wenhongang 2012-02-20
  • 打赏
  • 举报
回复
用messageBox吧,和cout一样的自动执行
tuccty 2012-02-20
  • 打赏
  • 举报
回复
TRACE.和printf类似.不过只在DEBUG模式下输出到OUTPUT内的样子.
shentujun 2012-02-20
  • 打赏
  • 举报
回复
TRACE或OutputDebugString

64,631

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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