我是在一个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写入一定数量的字符时就“满”了,无法往里面再写,这该如何处理?我想要显示的内容还没完全写完。。
感谢高手解答!!!!
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写入一定数量的字符时就“满”了,无法往里面再写,这该如何处理?我想要显示的内容还没完全写完。。
感谢高手解答!!!!
问题2 问题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);
可以传入多个参数的,自己定义一个结构体,例如struct test
{
CEdit* pEdit;
CButton* pButton;
};test a;对a的几个成员赋值, 然后把a的地址做创建线程时对应的参数就可以了,在线程里取出几个参数也很容易。
//多少数据?