今回は、リッチエディットコントロールに編集機能を付けてみましょう。具体的には、テキストの「切り取り」・「コピー」・「貼り付け」や、「元に戻す」などといった操作です。これらの操作は、リッチエディットにメッセージを送信するだけで行なうことができます。
以下に、リッチエディットの編集に関わるメッセージを示します。これらのメッセージは、標準エディットコントロールにも送信することができるものです。
| メッセージ | 機能 |
|---|---|
| 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;
今回はリッチエディットにメッセージを送るだけなので、難しいことはあまりないでしょう。とりあえずスクリプトを書いてみることにします。
前回と同様に、今回もまたモジュールを定義しています。リッチエディットコントロールの作成および、各メッセージの送信をモジュール命令で定義しました。
#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