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) /* 用于替换的文本 */