while(true) { CHAR lpBuffer[MAX_LINELEN]; DWORD dwRead = 0; memset(lpBuffer, 0, sizeof(lpBuffer) ); if ( 0 == ReadFile( pDlg->hRead, lpBuffer, sizeof(lpBuffer) - 1, &dwRead, NULL ) || dwRead == 0 ){ if(pDlg->hRead) CloseHandle(pDlg->hRead); pDlg->hRead = NULL; return 1; }else{ CString strBuf(lpBuffer); //pDlg->m_lpStrLog = pDlg->m_lpStrLog + strBuf; /*pDlg->m_hEditLog.SetWindowTextW(pDlg->m_lpStrLog);*/ //pDlg->m_hEditLog.SendMessage(WM_VSCROLL, MAKEWPARAM(SB_BOTTOM,0),0); //pDlg->m_hEditLog.SetSel(0,-1); //pDlg->m_hEditLog.ReplaceSel(strBuf); //pDlg->m_hEditLog.ReplaceSel(pDlg->m_lpStrLog); //pDlg->m_hEditLog.SetSel(0,-1); int nLen = ::GetWindowTextLength(pDlg->m_hEditLog); ::SendMessage(pDlg->m_hEditLog, EM_SETSEL, nLen, -1); pDlg->m_hEditLog.ReplaceSel(strBuf); pDlg->m_hEditLog.UpdateData(true); pDlg->m_hEditLog.UpdateWindow();
SendMessage EM_SETSEL 移动到文本结束. 再SendMessage EM_REPLACESEL写入刚读取的缓存, 结果还是有点闪屏,但比SetWindowText 后SetSel 好一些
EM_SETSEL (Set Selection) 是用于对Edit输入控件中设置文本选取.
调用方式
SendMessage(HWND hWnd , /* Edit输入框的句柄 */
EM_SETSEL, /* 消息 */
WPARAM nStart, /* 文本选取的起始位置 */
LPARAM nEnd) /* 文本选取的结束位置 */
如果要选取全部内容,则nStart=0, nEnd = -1 。nEnd为-1 说明选取由nStart开始之后的所有部份。
EM_REPLACESEL 是用指定的文本去替换当前被选取的文本。
调用方式
SendMessage(HWND hWnd , /* Edit输入框的句柄 */
EM_REPLACESEL, /* 消息 */
WPARAM bUndo, /* 是否允许Undo, 0是不允许Undo, 其它是允许 */
LPARAM newString) /* 用于替换的文本 */