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はテキスト終了まで移動する.再検索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を許可する)/*置換用テキスト*/