vc 如何动态显示变量于编辑框
vc如何动态显示变量于编辑框悬赏分:10-离问题结束还有14天22小时新建一个基于MFC对话框的应用程序,在界面上只放了两个控件:按钮和编辑框(变量名m_A),点击按钮,...
vc 如何动态显示变量于编辑框
悬赏分:10 - 离问题结束还有 14 天 22 小时
新建一个基于MFC对话框的应用程序,在界面上只放了两个控件:按钮和编辑框(变量名m_A),点击按钮,消息响应函数:
void CShiyan2Dlg::OnOK()
{
// TODO: Add extra validation here
for(int i = 0;i< 10;i++)
{
m_A+=i;
Sleep(100);
UpdateData(FALSE);//由里到外
}
}
为何“一下子”就出现了45了?
m_A是int型的。 展开
悬赏分:10 - 离问题结束还有 14 天 22 小时
新建一个基于MFC对话框的应用程序,在界面上只放了两个控件:按钮和编辑框(变量名m_A),点击按钮,消息响应函数:
void CShiyan2Dlg::OnOK()
{
// TODO: Add extra validation here
for(int i = 0;i< 10;i++)
{
m_A+=i;
Sleep(100);
UpdateData(FALSE);//由里到外
}
}
为何“一下子”就出现了45了?
m_A是int型的。 展开
7个回答
展开全部
有个误区,首先默认的mfc工程是一个基于消息的单线程程序。
单线程是关键,这就意味着代码要一步一步的执行,在一个函数没有执行完毕的时候不会切换到其他函数中。
楼主的程序就是这样,程序执行时候不会去执行重绘等函数,也不会去调用什么更新,重新显示,他会一直循环10次,把ok函数彻底运行完毕后才会去做别的事情。这时候就会发现 m_A的值已经是 45了,所以显示了出来。
------------------------------------
你要是想实现这种渐变的显示过程,要用到线程,单开一个线程去做你的事情。
void CShiyan2Dlg::OnOK()
{
CWinThread* pThread=AfxBeginThread(ThreadFun,this);
}
UINT ThreadFun(LPVOID para)
{
CShiyan2Dlg* pDlg = (CShiyan2Dlg*)para;
for(int i = 0;i< 10;i++)
{
pDlg->m_A+=i;
Sleep(100);
CString strText;
strText.Format(_T("%d"),pDlg->m_A);
pDlg->SetDlgItemTextW(IDC_EDIT1,strText);
}
return 0;
}
线程里调用dlg指针有一些限制,比如UpdateData函数就无法使用,会引起指针自检时候的错误
单线程是关键,这就意味着代码要一步一步的执行,在一个函数没有执行完毕的时候不会切换到其他函数中。
楼主的程序就是这样,程序执行时候不会去执行重绘等函数,也不会去调用什么更新,重新显示,他会一直循环10次,把ok函数彻底运行完毕后才会去做别的事情。这时候就会发现 m_A的值已经是 45了,所以显示了出来。
------------------------------------
你要是想实现这种渐变的显示过程,要用到线程,单开一个线程去做你的事情。
void CShiyan2Dlg::OnOK()
{
CWinThread* pThread=AfxBeginThread(ThreadFun,this);
}
UINT ThreadFun(LPVOID para)
{
CShiyan2Dlg* pDlg = (CShiyan2Dlg*)para;
for(int i = 0;i< 10;i++)
{
pDlg->m_A+=i;
Sleep(100);
CString strText;
strText.Format(_T("%d"),pDlg->m_A);
pDlg->SetDlgItemTextW(IDC_EDIT1,strText);
}
return 0;
}
线程里调用dlg指针有一些限制,比如UpdateData函数就无法使用,会引起指针自检时候的错误
展开全部
“楼主的程序就是这样,程序执行时候不会去执行重绘等函数,也不会去调用什么更新,重新显示,他会一直循环10次,把ok函数彻底运行完毕后才会去做别的事情。这时候就会发现 m_A的值已经是 45了,所以显示了出来。”
致cknight123:
为什么在OnOk中不会调用更新呢?为什么说要等到OnOk彻底运行完毕后才会去做别的事情?不是在OnOk中还有对UpdateData(FALSE)的调用吗?
如果说是线性的,那么执行到UpdateData时,会进入UpdateData中,这个函数中究竟做了什么呢?难道就不能在这个函数中对控件进行更新?(跟踪了下,调用了SetWindowText)
最后魔高丈所说的静态编辑框的确是更新了!!
我也没找到答案,只是做了测试:
对 for(int i = 0;i< 10;i++)中调用UpdateData(FALSE)时,编辑框控件捕捉不到OnEnUpdate和OnEnChange,也没有任何消息被捕捉到,静态文本框控件也没有任何消息。
如果改为SetDlgItemInt,则编辑框控件能捕捉到OnEnUpdate和OnEnChange,但还是没有任何消息被捕捉到,静态文本框控件也没有任何消息。
尽管编辑框有OnEnChange说明编辑框是被SetDlgItemInt更新了,可结果还是意料之外,编辑框的确没有在OK按钮按下后未弹起前,内容被重画过。
至于sleep一百个毫秒,肉眼是能看到变化的,因此不需要sleep更长时间。
致cknight123:
为什么在OnOk中不会调用更新呢?为什么说要等到OnOk彻底运行完毕后才会去做别的事情?不是在OnOk中还有对UpdateData(FALSE)的调用吗?
如果说是线性的,那么执行到UpdateData时,会进入UpdateData中,这个函数中究竟做了什么呢?难道就不能在这个函数中对控件进行更新?(跟踪了下,调用了SetWindowText)
最后魔高丈所说的静态编辑框的确是更新了!!
我也没找到答案,只是做了测试:
对 for(int i = 0;i< 10;i++)中调用UpdateData(FALSE)时,编辑框控件捕捉不到OnEnUpdate和OnEnChange,也没有任何消息被捕捉到,静态文本框控件也没有任何消息。
如果改为SetDlgItemInt,则编辑框控件能捕捉到OnEnUpdate和OnEnChange,但还是没有任何消息被捕捉到,静态文本框控件也没有任何消息。
尽管编辑框有OnEnChange说明编辑框是被SetDlgItemInt更新了,可结果还是意料之外,编辑框的确没有在OK按钮按下后未弹起前,内容被重画过。
至于sleep一百个毫秒,肉眼是能看到变化的,因此不需要sleep更长时间。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
整型,检查下使用前有没有初始化。不可以的话按我说的办法,把变量设置成CEdit型的,然后用SetWindowText。
m_A,从命名看不出你的变量类型。按你的描述应该是CString类型的,建议命名遵循匈牙利表示法。
在你的对话框中添加一个整型变量m_nCount,构造函数中初始化为0.
void CShiyan2Dlg::OnOK()
{
// TODO: Add extra validation here
for(int i = 0;i< 10;i++)
{
m_nCount+=i;
m_A.Format(_T("%d",m_nCount));
Sleep(100);
UpdateData(FALSE);//由里到外
}
}
m_A,从命名看不出你的变量类型。按你的描述应该是CString类型的,建议命名遵循匈牙利表示法。
在你的对话框中添加一个整型变量m_nCount,构造函数中初始化为0.
void CShiyan2Dlg::OnOK()
{
// TODO: Add extra validation here
for(int i = 0;i< 10;i++)
{
m_nCount+=i;
m_A.Format(_T("%d",m_nCount));
Sleep(100);
UpdateData(FALSE);//由里到外
}
}
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
新建一个基于MFC对话框的应用程序,在界面上只放了两个控件:按钮和编辑框(变量名m_A),点击按钮,消息响应函数:
void CShiyan2Dlg::OnOK()
{
// TODO: Add extra validation here
for(int i = 0;i< 100;i++)
{
UpdateData(TRUE);
m_A+=m_A;
Sleep(1);
UpdateData(FALSE);
}
结果,运行通过,却看不到动态显示,编辑框中只有0
void CShiyan2Dlg::OnOK()
{
// TODO: Add extra validation here
for(int i = 0;i< 100;i++)
{
UpdateData(TRUE);
m_A+=m_A;
Sleep(1);
UpdateData(FALSE);
}
结果,运行通过,却看不到动态显示,编辑框中只有0
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这种要设置定时器来做的。
添加WM_TIMER消息。然后更新编辑控件,记得加UpdateData函数。
添加WM_TIMER消息。然后更新编辑控件,记得加UpdateData函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询