EDIT控件自动滚动最后行

来源:互联网 发布:智能数据分析系统 编辑:程序博客网 时间:2024/05/29 23:48
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) /* 用于替换的文本 */