我是在一个BCG的bar里放了一个CEdit对象,想实现类似VC的编译过程输出窗口的效果,定义如下:
class COutputBar : public CBCGPDockingControlBar
{
public:
COutputBar();
CEdit m_editOutput;
virtual ~COutputBar();
protected:
//{{AFX_MSG(COutputBar)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
然后在view类里对利用下面方法对m_editOutput的内容进行更新。
        //下面4行是先把m_editOutput原有的内容全部删除
        CMainFrame* pMainFrm = (CMainFrame*)AfxGetMainWnd();
int len1 = pMainFrm->m_wndOutput.m_editOutput.GetWindowTextLength();
pMainFrm->m_wndOutput.m_editOutput.SetSel(0,-1);
pMainFrm->m_wndOutput.m_editOutput.Clear();
        //下面是往m_editOutput里写入新内容,其中的sleep(1000)是代替了一段对要输出的abcdef变量的复杂计算所消耗的时间。
        for (int i=0;i<5;i++) {
int len = pMainFrm->m_wndOutput.m_editOutput.GetWindowTextLength();
CString strtext;
Sleep(1000);
strtext.Format("i=%li  j=%li  x=%lf  y=%lf  z=%lf  f=%li\r\n",a,b,c,d,e,f); pMainFrm->m_wndOutput.m_editOutput.SetSel(len,len);
pMainFrm->m_wndOutput.m_editOutput.ReplaceSel(addtext);
}
问题1:
问题现象:如果不加sleep函数,那么能正常将原m_editOutput控件内的内容全部清空然后写入新内容。如果加上sleep函数(也就是加上复杂的计算后)m_editOutput就变成一行一行更新。。我想先一次把m_editOutput所有内容全部清空,然后再一行一行写新内容的。请问该如何实现??
问题2:
程序对m_editOutput进行更新时就跟死机一样,无法进行操作,只能看着m_editOutput刷新。如何才能做到像vc那样,编译代码时刷新编译窗口的内容而且不影响其他操作???
问题3:
m_editOutput写入一定数量的字符时就“满”了,无法往里面再写,这该如何处理?我想要显示的内容还没完全写完。。
感谢高手解答!!!!

解决方案 »

  1.   

    Sleep独占了CPU时间,在此期间别的进程只有干瞪眼的份
      

  2.   

    问题1已经解决:只要在clear()后面把这个outputbar重画一次即可,即调用redrawwindow()
    问题2 问题3仍然期待有人能解答
      

  3.   

    开个线程来处理
    //定义
    DWORD WINAPI WorkThead(LPVOID data)
    {
        CEdit* m_pEditOutPut = (CEdit*)data;
        //就可以用m_pEditOutPut对编辑框操作了 
        m_pEditOutPut->SetSel();
        m_pEditOutPut->ClearSel();
        ....
        return 0;
    }
    //在你上面的代码那里换成创建线程
    HANDLE hThread;
    hThread = CreateThread(NULL, 0, WorkThead, (LPVOID)&pMainFrm->m_wndOutput.m_editOutput, 0, NULL);
    CloseHandle(hThread);
      

  4.   

    创建的线程在函数运行完就会自动删除的。
     可以传入多个参数的,自己定义一个结构体,例如struct test
    {
       CEdit* pEdit;
       CButton* pButton;
       
    };test a;对a的几个成员赋值, 然后把a的地址做创建线程时对应的参数就可以了,在线程里取出几个参数也很容易。
      

  5.   

    对于问题3, 你的edit控件是不是有字数限制?用CEdit::GetLimitText( )查查看
      

  6.   

    m_editOutput写入一定数量的字符时就“满”了,无法往里面再写,这该如何处理?
    //多少数据?
      

  7.   

    大概就是长度:xxx=0.00000 xxx=0.00000 xxx=0.00000 xxxx=0.00000 xxxx=0.00000/r/n这样的显示不到100行