RichEditの装飾をプログラム制御する

Delphiコードのみ用いたものと、Windows APIを用いたものを併記。速度はWindows APIの方が速い。

装飾範囲を指定

  • Delphi
    RichEdit1.SelStart  := 2; // 開始位置
    RichEdit1.SelLength := 3; // 範囲量
    
  • Windows API
    uses Windows, RichEdit;
    :
    :
    var
      ChrRng: TCharRange;
    :
    :
      ChrRng.cpMin := 2; // 開始位置
      ChrRng.cpMax := 2 + 3; // 終了位置
      RichEdit1.Perform(EM_EXSETSEL, 0, lParam(@ChrRng)); // 範囲を選択
    //  SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, lParam(@ChrRng)); // 範囲を選択
    

文字色変更

  • Delphi
    // 事前に範囲を指定しておくこと。
    RichEdit1.SelAttributes.Color := clRed; // TColor型
    
  • Windows API
    uses Windows, RichEdit;
    :
    :
    var
      ChrFmt: TCharFormat;
    :
    :
      ChrFmt.cbSize := SizeOf(ChrFmt); // メモリを予約
    :
    :
    // 事前に範囲を指定しておくこと。
      ChrFmt.dwMask      := CFM_COLOR; // 変更可能な書式はColorのみ
      ChrFmt.crTextColor := ColorToRGB(clRed); // 文字色を指定
      RichEdit1.Perform(EM_SETCHARFORMAT, SCF_SELECTION, lParam(@ChrFmt)); // 変更
    //  SendMessage(RichEdit1.Handle, EM_SETCHARFORMAT, SCF_SELECTION, lParam(@ChrFmt)); // 変更
    

 EM_SETCHARFORMAT は「文字の書式指定」操作を意味する。続くパラメータは「操作範囲, 書式情報」。
 操作範囲の SCF_SELECTION は「事前に指定した範囲」。SCF_ALL で全範囲指定。
 書式情報の lParam(@ChrFmt) は、書式設定 ChrFmt のアドレス。

文字装飾変更

  • Delphi
    // 事前に範囲を指定しておくこと。
    RichEdit1.SelAttributes.Style := [fsBold, fsItaric]; // TFont.Style
    
  • Windows API
    uses Windows, RichEdit;
    :
    :
    var
      ChrFmt: TCharFormat;
    :
    :
      ChrFmt.cbSize := SizeOf(ChrFmt); // メモリを予約
    :
    :
    // 事前に範囲を指定しておくこと。
      ChrFmt.dwMask    := CFM_BOLD + CFM_ITALIC; // 変更可能な書式はBoldとItaricのみ
      ChrFmt.dwEffects := CFE_BOLD + CFE_UNDERLINE; // BoldとUnderline装飾を指定
    // dwMask と dwEffects の両方で指定された装飾のみ有効。
    // このプログラムの場合、Boldは有効、ItaricとUnderlineは無効。
      RichEdit1.Perform(EM_SETCHARFORMAT, SCF_SELECTION, lParam(@ChrFmt)); // 変更
    //  SendMessage(RichEdit1.Handle, EM_SETCHARFORMAT, SCF_SELECTION, lParam(@ChrFmt)); // 変更
    

フォント名指定

  • Delphi
    // 事前に範囲を指定しておくこと。
    RichEdit1.SelAttributes.Name := 'MS 明朝';
    
  • Windows API
    uses Windows, RichEdit;
    :
    :
    var
      ChrFmt: TCharFormat;
    :
    :
      ChrFmt.cbSize := SizeOf(ChrFmt); // メモリを予約
    :
    :
    // 事前に範囲を指定しておくこと。
      ChrFmt.dwMask     := CFM_FACE; // 変更可能な書式はフォント名のみ
      ChrFmt.szFaceName := 'MS 明朝'; // 半角32文字まで
      RichEdit1.Perform(EM_SETCHARFORMAT, SCF_ALL, lParam(@ChrFmt)); // 変更
    //  SendMessage(RichEdit1.Handle, EM_SETCHARFORMAT, SCF_SELECTION, lParam(@ChrFmt)); // 変更
    

フォント大きさ指定

  • Delphi
    // 事前に範囲を指定しておくこと。
    RichEdit1.SelAttributes.Size := 15; // 単位はpoint
    
  • Windows API
    uses Windows, RichEdit;
    :
    :
    var
      ChrFmt: TCharFormat;
    :
    :
      ChrFmt.cbSize := SizeOf(ChrFmt); // メモリを予約
    :
    :
    // 事前に範囲を指定しておくこと。
      ChrFmt.dwMask      := CFM_SIZE; // 変更可能な書式はフォントサイズのみ
      ChrFmt.yHeight := 300; // 単位は twip(1twip=1/20point=1/1440inch)
      RichEdit1.Perform(EM_SETCHARFORMAT, SCF_ALL, lParam(@ChrFmt)); // 変更
    //  SendMessage(RichEdit1.Handle, EM_SETCHARFORMAT, SCF_SELECTION, lParam(@ChrFmt)); // 変更
    

縦書き

使用フォントに縦書きフォント(フォント名の前に半角@を付けたもの。「MS 明朝」の縦書きフォントは「@MS 明朝」)を指定するだけ。
ただし Windows 2000以降、RichEdit をコントロールする dll から縦書き表示機能が排除されたらしいので、2000以降は縦書きフォントの横向き表示になる(反時計回りに90度回転した状態)。縦書き表示するには、縦書き表示対応の古い dll を使うか、独自に縦書き表示を実装する必要がある。

最終更新:2010年01月11日 23:31