EDITコントロールが最終行を自動的にスクロール

1565 ワード

	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はテキスト終了まで移動する.再検索REPLACESELは、読み込んだばかりのキャッシュに書き込み、結果的には少しフラッシュがかかったが、SetWindowText後のSetSelよりも若干EM_SETSEL(Set Selection)は、Edit入力コントロールにテキスト選択を設定ためのものである.呼び出し方式SendMessage(HWND hWnd,/*Edit入力ボックスのハンドル*/EM_SETSEL,/*メッセージ*/WPARAMnStart,/*テキスト選択の開始位置*/LPARAM nEnd)/*テキスト選択の終了位置*/すべてを選択するとnStart=0,nEnd=-1となる.nEndは-1で、nStartが開始した後のすべての部分を選択することを示します.EM_REPLACESELは、現在選択されているテキストを指定したテキストで置き換えます.呼び出し方式SendMessage(HWND hWnd,/*Edit入力ボックスのハンドル*/EM_REPLACESEL,/*メッセージ*/WPARAMbUndo,/*Undoを許可するかどうか、0はUndoを許可しない、その他は*/LPARAM newStringを許可する)/*置換用テキスト*/