Rich Edit で文字列を置き換える

Rich Edit Control のテキストを EM_REPLACESEL で置き換えます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. ウインドウに貼り付けた RichEdit の文字列を検索して置き換えます。
    見つけた文字列を赤色で表示して、MessageBox の応答により置き換えます。
    文字列の検索は Rich Edit で文字列を検索する を参照して下さい。
  2. cfm は見つけたキーワードを赤色で表示するための CHARFORMAT 構造体です。
    Find はキーワードを検索するための FINDTEXT 構造体です。
    Pos は検索したキーワードのインデックスです。
    g_buf は RichEdit に表示するテキストデータです。
    HWND        g_hREdit= NULL;
    HMODULE     hRtLib= NULL;
    CHARFORMAT  cfm;            //CHARFORMAT 構造体
    FINDTEXT    Find;           //FINDTEXT 構造体
    int         Pos;            //検索位置
    
    LPSTR      g_buf=
    {  "0123key4567key89\n"
       "abcKEYkeydefg\n"
       "hijklmn\n"
       "opqrstuvwxyz\n"
       "ABCDEFGHkeyIJKLMN\n"
       "keyk07 入力長\n"
       "ファイル名 Key\n"
       "KEYTEST DATA\n"
       "1    2   3   key 4   5   6   7\n"
       "8    9   10  KEY\n"
       "999999key\n"
    };
    
  3. 文字列を検索して、置き換える Search() 関数です。
    EM_FINDTEXT で文字列を検索します。
    Pos には見つけたキーワードの位置が格納されます。
    大文字小文字を区別するときは FR_MATCHCASE を、しないときは FR_NOUPDOWN を指定します。
    見つけた文字列を選択状態にして、EM_SETCHARFORMAT で赤色に変えます。
    MessageBox() で置き換えの確認を行います。
    文字列の置き換えを行わないときは、cpMin に Pos+3 を設定して次の検索に移ります。
    文字列の置き換えをする処理です。
    選択状態になっている文字列("key")を EM_REPLACESEL で "*newKEY*" に置き換えます。
    "*newKEY*" の長さに合わせて cpMin を Pos+8 に設定します。
    文字列全体の長さが変わるので、cpMax に 5 を加えます。
    void Search()
    {   int     id;
    
        while(1)
        {   //Pos= (int)SendMessage(g_hREdit,EM_FINDTEXT,FR_MATCHCASE,(LPARAM)&Find);
            //大文字小文字を区別しないとき
            Pos= (int)SendMessage(g_hREdit,EM_FINDTEXT,FR_NOUPDOWN,(LPARAM)&Find);
            if (Pos==-1)    return;
            SendMessage(g_hREdit,EM_SETSEL,Pos,Pos+3);
            if (SendMessage(g_hREdit,EM_SETCHARFORMAT,SCF_SELECTION|SCF_WORD,(LPARAM)&cfm)==0)
                MessageBox(NULL,"EM_SETCHARFORMAT 失敗です", "Error", MB_OK);
            id= MessageBox(NULL,"置き換えますか","確認", MB_OKCANCEL | MB_ICONQUESTION);
            if (id!=IDOK)
            {   Find.chrg.cpMin= Pos+3;
                continue;
            }
            //キーの置換
            cfm.crTextColor= RGB(255,0,0);
            SendMessage(g_hREdit,EM_REPLACESEL,TRUE,(LPARAM)"*newKEY*");
            Find.chrg.cpMin= Pos+8;
            Find.chrg.cpMax+= 5;
        }
    }
    

超初心者のプログラム入門(Win32API C++)