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