这类问题应该用多线程技术,或者用多个窗口的交互,才能达到“即时”显示的要求。
如果在一个窗体内,比如对话框,不会有即时的效果,只能显示最后的结果。因为窗口的工作是按顺利响应消息队列的窗口消息的方式来执行的,如果复制文件是响应某个按钮来执行的操作,那么整个对话框的一定是在这个按钮的响应函数OnButtonX()完成之后,或者其子窗口获得焦点(比如调用MessageBox),才能继续响应其消息队列的其他消息。而m_E5.SetWindowsText()这个函数执行后,只是这个编辑框对象更新了数据,并通过消息机制在对话框窗口队列排队等候处理,真正在对话框中得到显示必须由对话框响应该消息后才能执行。所以在你的代码中,一定是等到while循环执行完毕,复制文件的消息响应完毕后,才能够处理编辑框的显示要求,而此时编辑框对象的数据已经是最后的结果了。所以直接显示了最后的结果。windows窗口的重复消息如果来不及响应,系统将会合并,也就是说,系统在一直来不及响应编辑框显示的消息的情况下,会将该类消息合并,最后只处理一次。所以在复制完文件后,也只会显示一次,将最后的结果显示出来。
解决办法有多种,这里列出两种:
1、多线程:将文件的复制操作使用一个独立的线程来完成,在线程的循环中,将size_E5的值传递到对话框对象中,向对话框投递自定义的消息(PostMessage),为对话框编写响应该消息的函数,在函数中调用m_E5.SetWindowText();
2、多窗口:创建一个不可见的窗口,将文件的复制操作作为这个不可见窗口的消息函数来实现,函数在复制文件的循环中,将size_E5的值传递到对话框对象中,向对话框投递自定义的消息(PostMessage),为对话框编写响应该消息的函数,在函数中调用m_E5.SetWindowText();由对话框的按钮响应操作来启动这个不可见窗口的相关操作,同样用PostMessage来启动;
仅供参考。