Edit Controlの操作方法

Win32 APIで、Edit Controlを操作する方法です。
大した事じゃないですが、本当に英語が読めないって不便です・・・。
大まかなことはわかっても詳細がわかりません。で、いろいろ困ったので記録を残します。

・任意の場所(今回は最後)に1行追加する。
・任意の1行を取得する。
の2点を今回やろうとしてました。


・任意の場所(今回は最後)に1行追加する。
早速サンプルから。
//Edit Controlの最後に1行追加する
void AddLine(HWND hWnd,TCHAR *string)
{
DWORD len;
TCHAR buffer[128];

//エディットすべての文字列の長さを取得
len = SendDlgItemMessage(hWnd,IDC_EDIT,WM_GETTEXTLENGTH,0,0);
//一番最後にカーソルを移動
SendDlgItemMessage(hWnd,IDC_EDIT,EM_SETSEL,(WPARAM)len,(LPARAM)len);
//文字列を挿入(置き換え)
SendDlgItemMessage(hWnd,IDC_EDIT,EM_REPLACESEL,(WPARAM)false,(LPARAM)string);
//改行を追加
SendDlgItemMessage(hWnd,IDC_EDIT,EM_REPLACESEL,(WPARAM)false,(LPARAM)TEXT("\r\n"));
}
ポイントは「EM_REPLACESEL」メッセージです。
選択範囲を置き換えるのですが、選択をしていない場合は「挿入」になるのです。
あと、「EM_SETSEL」です。
基本は選択するメッセージですが、選択範囲の最初と最後を一緒にすれば単純にカーソルが移動します。


・任意の1行を取得する。
引き続きサンプルから。
int count;
int len,getlen;
int lineindex;
TCHAR *temp;

//行数取得
count = SendDlgItemMessage(hWnd,IDC_RESULT_ED,EM_GETLINECOUNT,(WPARAM)0,(LPARAM)0);
for(int i=0;i<count;i++){
//その行の先頭文字のインデックス
lineindex = SendDlgItemMessage(hWnd,IDC_RESULT_ED,EM_LINEINDEX,(WPARAM)i,(LPARAM)0);
//行の文字数
len = SendDlgItemMessage(hWnd,IDC_RESULT_ED,EM_LINELENGTH,(WPARAM)lineindex,(LPARAM)0);
temp = new TCHAR[len+1];
//重要:バッファの長さを2バイト使用して指定すること
*(WORD *)temp = (WORD)len;
//1行取得(Nullターミネータなし)
getlen = SendDlgItemMessage(hWnd,IDC_RESULT_ED,EM_GETLINE,(WPARAM)i,(LPARAM)temp);
//Nullターミネータ追加
temp[len] = TEXT('\0');
/* ------------------
このあたりで、適当な出力などをどうぞ
------------------ */

delete [] temp;
}
今回のポイントは「EM_LINEINDEX」メッセージで、取得したい行の先頭文字の インデックス(よーするに一番最初からの文字数)を取得する必要があることです。
と「EM_GETLINE」を使用する時に、値を返してもらうバッファの先頭2バイトを 使用して1行の長さを指定することです。
あと、返ってきた文字列にNullはありませんので注意してください。