一个基于模态的对话框工程。
主窗口 CMyAppDlg MyAppDlg 通过按钮 IDC_BN_OUTPUT(OnBnOutput()函数)打开子窗口 COutputDlg OutputDlg。
子窗口 OutputDlg 里有个 Edit 控件(绑定 CEdit m_eOutput)。
和主窗口 MyAppDlg 一起启动的还有一个线程(CProcess m_Process)。
线程 m_Process 运行过程中会产生各种后台输出的日志消息(LOG),都需要输出到 OutputDlg 的 m_eOutput 控件里。问题是 OutputDlg 并不是一直保持打开的状态,通过按钮打开后要求子窗口也可以关闭。而且,无论 OutputDlg 处于关闭还是打开状态,要求 m_eOutput 里的消息依然能够更新,再次打开 OutputDlg 时依然能看到之前的日志(LOG)。
另外一个要求是在打开 OutputDlg 窗口的情况下能够看到 m_eOutput 的动态刷新。我有两个思路:
1.线程 m_Process 运行时将日志存储在 public CString 的成员变量中。OutputDlg 实例化时读取这个变量将消息写入 m_eOutput。
但是这样是一次性读取,日志的变化只在每次打开 OutputDlg 时才会呈现,也无法做到动态更新输入框。
2.在 OutputDlg 中设置 public Output(LPCTSTR)函数用来处理将字符串送入 m_eOutput。在实例化主窗口时建立子窗口的对象,但是子窗口先不 Modal(),也就是先不显示,线程 m_Process 需要输出日志时调用 Output()函数。但是模态化的对话框无法隐藏,因此只要通过按钮打开了子窗口再将之关闭,那么这个 OutputDlg 对象也就被销毁了。也不能做到日志在窗口关闭时还能持续更新。大家帮忙设计一下,我再总结一下需求:
1.主进程产生的日志信息在子窗口还没打开或者子窗口已被关闭时仍然能够存储在内存里并更新。
2.在子窗口打开时,不仅能载入之前的日志,还能继续处理主进程新产生的日志信息并动态刷新显示。
3.变量的存储不涉及外存。

解决方案 »

  1.   

    不用这么麻烦  COutputDlg OutputDlg的创建还是添加一个字符型的参数,这个参数赋值给CEdit m_eOutput线程中每次更新调用COutputDlg 的一个公有函数,刷新显示就行(刷新时需要判断窗口句柄是否存在)。
      

  2.   

    在domodal之前,先把当前的日志信息传递给m_eOutput,弹出子窗口后,在主进程中,用SendMessage去刷新子窗口(OutputDlg)中的编辑框就可以了……
      

  3.   

    请您看看我的理解对不对:
    1.线程中设置一变量(和该线程等同生命周期)用于存储和更新全部日志,实例化窗口时将该变量传入 Edit 控件显示。
    2.COutputDlg 类添加 public 函数用于刷新显示,主线程判断窗口存在就调用该函数。
      

  4.   

    请您看看我的理解对不对:
    1.线程中设置一变量(和该线程等同生命周期)用于存储和更新全部日志,实例化子窗口时将该变量传入 m_eOutout 显示。
    2.主进程每次更新日志就 SendMessage 到 Edit 控件里。需不需要先判断窗口是否存在?或是对象存在即可?