EDIT控件自动滚动最后行

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


你可能感兴趣的:(C++,windows)