リッチエディットの内容を編集してみる

今回は、リッチエディットコントロールに編集機能を付けてみましょう。具体的には、テキストの「切り取り」・「コピー」・「貼り付け」や、「元に戻す」などといった操作です。これらの操作は、リッチエディットにメッセージを送信するだけで行なうことができます。

編集用メッセージ

以下に、リッチエディットの編集に関わるメッセージを示します。これらのメッセージは、標準エディットコントロールにも送信することができるものです。

メッセージ 機能
WM_CUT 選択されている範囲の切り取り
WM_COPY 選択されている範囲のコピー
WM_PASTE 選択されている範囲へ貼り付け
WM_CLEAR 選択されている範囲を削除
EM_UNDO アンドゥ(元に戻す操作)

選択範囲の切り取り

現在選択されているテキストの切り取りをするには、リッチエディットに WM_CUT メッセージを送信します。このメッセージは、エディットコントロールの選択されている部分のテキストを削除して、その部分をクリップボードにコピーします。テキストが選択されていない状態では、何も起こりません。

#define WM_CUT           0x0300

WM_CUT
    wParam = 0;
    lParam = 0;

選択範囲のコピー

現在選択されているテキストのコピーをするには、リッチエディットに WM_COPY メッセージを送信します。このメッセージは、エディットコントロールの選択されている部分のテキストをクリップボードにコピーします。テキストが選択されていない状態では、何も起こりません。

#define WM_COPY          0x0301

WM_COPY
    wParam = 0;
    lParam = 0;

選択範囲への貼り付け

テキストの貼り付けをするには、リッチエディットに WM_PASTE メッセージを送信します。このメッセージは、クリップボードにあるテキストをエディットコントロールの現在のカーソル位置にコピーします。テキストが選択された状態のときは、選択されているテキストが削除された後、クリップボードのテキストが貼り付けられます。

#define WM_PASTE         0x0302

WM_PASTE
    wParam = 0;
    lParam = 0;

選択範囲の削除

現在選択されているテキストを削除するには、リッチエディットに WM_CLEAR メッセージを送信します。テキストが選択されていない状態では、何も起こりません。

#define WM_CLEAR         0x0303

WM_CLEAR
    wParam = 0;
    lParam = 0;

アンドゥ

最後に行なわれた操作によって変更されたテキストを元に戻すには、リッチエディットに EM_UNDO メッセージを送信します。テキストがまだ何も変更されていない状態では、何も起こりません。

#define EM_UNDO          0x00C7

WM_UNDO
    wParam = 0;
    lParam = 0;

サンプルスクリプト

今回はリッチエディットにメッセージを送るだけなので、難しいことはあまりないでしょう。とりあえずスクリプトを書いてみることにします。

前回と同様に、今回もまたモジュールを定義しています。リッチエディットコントロールの作成および、各メッセージの送信をモジュール命令で定義しました。

サンプルスクリプト main.as

    #include "llmod.as"

    #module ;#### リッチエディットコントロール作成モジュール ########

    ;===============================================================
    ; リッチエディットコントロールの作成
    ; CreateRichEdit  n1, n2, n3, n4
    ;     n1 : x座標
    ;     n2 : y座標
    ;     n3 : 幅
    ;     n4 : 高さ
    ;   stat : リッチエディットコントロールのハンドルが返る
    ;===============================================================
    #deffunc CreateRichEdit int, int, int, int
    mref cx, 0              ; x位置
    mref cy, 1              ; y位置
    mref sx, 2              ; 幅
    mref sy, 3              ; 高さ
    mref bmscr, 67          ; 描画中ウィンドウのBMSCR構造体
    mref stt, 64            ; stat

    ; RICHEDIT.DLLのロード
    ll_libload@ hdllRichEd, "RICHED32.DLL"

    ; リッチエディットコントロールの作成
    classname = "RichEdit"
    pm.0 = 0
    getptr pm.1, classname
    pm.2 = 0
    pm.3 = 0x50B020C4       ; WS_CHILD | WS_VISIBLE | WS_BORDER
                            ;  | WS_VSCROLL | WS_HSCROLL
                            ;  | ES_MULTILINE | ES_AUTOVSCROLL
                            ;  | ES_AUTOHSCROLL | ES_DISABLENOSCROLL
    pm.4 = cx, cy, sx, sy
    pm.8 = bmscr.13         ; 描画中HSPウィンドウのハンドル
    pm.9 = 0xFF00           ; コントロールID (大きめに指定)
    _get_instance pm.10     ; インスタンスハンドル取得
    pm.11 = 0
    dllproc "CreateWindowExA", pm, 12, D_USER@
    hEdit = stat            ; リッチエディットのハンドル

    ; テキストサイズの上限の設定
    ; EM_EXLIMITTEXT メッセージ送信
    pm = hEdit, 0x0435, 0, 0    ; 64Kバイトに設定
    sendmsg pm

    stt = hEdit
    return

    ;===============================================================
    ; フォント("FixedSys", 白)・背景色(黒)を設定
    ; SetDefaultFormat  n1
    ;     n1 : リッチエディットコントロールのハンドル
    ;===============================================================
    #deffunc SetDefaultFormat int
    mref hEdit, 0           ; リッチエディットコントロールのハンドル

    ; CHARFORMAT 構造体
    dim charfmt, 16
    charfmt.0 = 60                  ; 構造体サイズ
    charfmt.1 = 0x60000000          ; CFM_FACE | CFM_COLOR
    charfmt.5 = 0x00FFFFFF          ; 文字色(白に設定)
    poke charfmt, 26, "FixedSys"    ;フォント名"FixedSys"

    ; EM_SETCHARFORMAT メッセージ送信
    pm = hEdit, 0x0444
    pm.2 = 0x0000               ; SCF_DEFAULT
    getptr pm.3, charfmt        ; CHARFORMAT 構造体のアドレス
    sendmsg pm

    ; EM_SETBKGNDCOLOR メッセージ送信
    pm = hEdit, 0x0443, 0, 0    ; 背景色を黒に
    sendmsg pm
    return

    ;===============================================================
    ; WM_CUT メッセージの送信
    ; CutText  n1
    ;     n1 : リッチエディットコントロールのハンドル
    ;===============================================================
    #deffunc CutText int
    mref hEdit, 0           ; リッチエディットコントロールのハンドル

    ; WM_CUT メッセージ送信
    pm = hEdit, 0x0300, 0, 0
    sendmsg pm
    return

    ;===============================================================
    ; WM_COPY メッセージの送信
    ; CopyText  n1
    ;     n1 : リッチエディットコントロールのハンドル
    ;===============================================================
    #deffunc CopyText int
    mref hEdit, 0           ; リッチエディットコントロールのハンドル

    ; WM_COPY メッセージ送信
    pm = hEdit, 0x0301, 0, 0
    sendmsg pm
    return

    ;===============================================================
    ; WM_PASTE メッセージの送信
    ; PasteText  n1
    ;     n1 : リッチエディットコントロールのハンドル
    ;===============================================================
    #deffunc PasteText int
    mref hEdit, 0           ; リッチエディットコントロールのハンドル

    ; WM_PASTE メッセージ送信
    pm = hEdit, 0x0302, 0, 0
    sendmsg pm
    return

    ;===============================================================
    ; WM_CLEAR メッセージの送信
    ; ClearText  n1
    ;     n1 : リッチエディットコントロールのハンドル
    ;===============================================================
    #deffunc ClearText int
    mref hEdit, 0           ; リッチエディットコントロールのハンドル

    ; WM_CLEAR メッセージ送信
    pm = hEdit, 0x0303, 0, 0
    sendmsg pm
    return

    ;===============================================================
    ; EM_UNDO メッセージの送信
    ; UndoText  n1, n2
    ;     n1 : リッチエディットコントロールのハンドル
    ;===============================================================
    #deffunc UndoText int
    mref hEdit, 0           ; リッチエディットコントロールのハンドル

    ; EM_UNDO メッセージ送信
    pm = hEdit, 0x00C7, 0, 0
    sendmsg pm
    return

    #global ;############# モジュール終わり ########################


    objsize winx/5, 24
    pos 0, 0        : button "Cut", *lb_push    ; Object ID = 0
    pos winx/5, 0   : button "Copy", *lb_push   ; Object ID = 1
    pos winx*2/5, 0 : button "Paste", *lb_push  ; Object ID = 2
    pos winx*3/5, 0 : button "Clear", *lb_push  ; Object ID = 3
    pos winx*4/5, 0 : button "Undo", *lb_push   ; Object ID = 3

    ; リッチエディットコントロールの作成
    CreateRichEdit 0, 24, winx, winy-24
    hEdit = stat

    ; フォント・背景色設定
    SetDefaultFormat hEdit

    stop

*lb_push
    ; ボタンが押された場合(statはボタンのオブジェクトID)
    if stat == 0 : CutText hEdit   : stop
    if stat == 1 : CopyText hEdit  : stop
    if stat == 2 : PasteText hEdit : stop
    if stat == 3 : ClearText hEdit : stop
    if stat == 4 : UndoText hEdit  : stop
    stop