HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
1121
takaEM_REPLACESELをUNDOできるのでしょうか?2解決


taka

リンク

2018/11/21(Wed) 13:36:36|NO.85853

下記URLなどで教えていただきながら,リッチエディットを作成しています。
http://hsp.tv/play/pforum.php?mode=all&num=85748

貼り付けをEM_REPLACESELで処理した後にUNDO(EM_UNDO,WM_UNDO)を行いたいのですができません。

貼り付けをWM_PASTEを用いて処理するとUNDOできるのですが,できればEM_REPLACESELを用いて,
貼り付け処理を行いたいと考えています。根本的に不可能なのか,プログラムを改善することで
実現可能なのかも分からず困っている状態です。

どなたかご示唆いただけたら幸いです。
ソースを下記に張っておきます。


#include "user32.as" #include "kernel32.as" // エファクトの定数 #const CFM_FACE $20000000 #const CFM_BOLD $00000001 ; CFE_BOLD #const CFM_ITALIC $00000002 ; CFE_ITALIC #const CFM_UNDERLINE $00000004 ; CFE_UNDERLINE #const CFE_BOLD $00000001 ; 太字体で表示されます。 #const CFE_ITALIC $00000002 ; イタリック体で表示されます。 #const CFE_UNDERLINE $00000004 ; アンダーラインを引きます。 #const CFM_COLOR $40000000 ; crTextColorメンバとdwEffectsメンバのCFE_AUTOCOLOR値が有効 #const SCF_SELECTION $00000001 ; #const style 0x50b00004 /*WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL|ES_MULTILINE*/ #define EM_EXLIMITTEXT 0x0435 //コマンドの定数 #define EM_REPLACESEL $C2 #define EM_UNDO 0x00C7 #define WM_UNDO $304 #define WM_PASTE $302 onexit*exit // libraryを動的ロード LoadLibrary "RICHED20.DLL" plib = stat // 色操作 objsize 80,20 tx="赤","緑","青" repeat 3 button tx.cnt,*col loop // エファクト操作 tx = "太字","斜体","下線" effvalM = CFM_BOLD,CFM_ITALIC,CFM_UNDERLINE effvalE = CFE_BOLD,CFM_ITALIC,CFM_UNDERLINE pos ,ginfo_cy+5 teff=stat+1 repeat 3 button tx.cnt,*eff loop // フォント操作 fontface = msGothic,msmincho,"メイリオ" pos ,ginfo_cy+5 tface=stat+1 repeat 3 button fontface.cnt,*fon loop // clear pos ,ginfo_cy+5:button "clear",*clr //文字数チェック pos ,ginfo_cy+20:button "size check",*size_check //置換での貼り付け pos ,ginfo_cy+20:button "貼り付け",*replace_paste //元に戻す pos ,ginfo_cy+5:button "元に戻す",*undo // リッチエディット作成 pos 80,0 winobj "RichEdit20A","リッチエディットコントロール、書式切替テスト",0,style,ginfo_winx-80,ginfo_winy hwnd_re = objinfo_hwnd(stat) gsel 0,1 Setfocus hwnd_re dim cf2,21 // CHARFORMAT2構造体 //リッチエディトに対して、格納最大文字数変更(変更後 128kバイト) sendmsg hwnd_re,EM_EXLIMITTEXT,0,131072 stop //文字数チェック用 *size_check sdim tmp_txt,1250304 GetWindowText hwnd_re,varptr(tmp_txt),1250304 txt_len = strlen(tmp_txt) dialog "内部文字列は "+txt_len+"("+(txt_len / 1024)+"KB) 文字数です" stop //置換での貼り付け *replace_paste buf="置換での貼り付けをしました" sendmsg hwnd_re, EM_REPLACESEL, 0, buf stop //元に戻す *undo sendmsg hwnd_re, EM_UNDO ; sendmsg hwnd_re, WM_UNDO stop *col // CHARFORMAT2構造体 の 5 番目の配列に テキストの色を 0xBBGGRR で代入 cf2 = 84,CFM_COLOR,0,0,0, 0xFF<<(stat*8) goto *setcharformat *fon // CHARFORMAT2構造体 の 26byte 目に フォント名を poke か memcpyで代入 cf2 = 84,CFM_FACE poke cf2 , 26 , fontface(stat-tface) goto *setcharformat *eff // CHARFORMAT2構造体 の 1 番目に 上書きされるエファクト情報のマスク // 2番目に ソレが有効に成るか無効に成るかを代入 p=(stat-teff) cf2 = 84,effvalM.p,effvalE.p goto *setcharformat *clr // おまけ // 色と、エファクトをクリア。 cf2 = 84,CFM_COLOR|CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE,0,0,0,0 *setcharformat // 選択されている位置に現在のフォーマットを設定する。 sendmsg hwnd_re,0x444 /*EM_SETCHARFORMAT*/,SCF_WORD|SCF_SELECTION,varptr(cf2) SetFocus hwnd_re stop *exit DestroyWindow hwnd_re // エラーを回避するためには、ウィンドウを削除したのちに FreeLibrary plib // freelibraryを実行して 動的確保されたlibraryのポインタを指定する。そうしなければ、ウィンドウを閉じる事が出来ずにエラーの原因になる。 end stop



この記事に返信する


いののて

リンク

2018/11/21(Wed) 17:28:23|NO.85854

EM_REPLACESELのwParam値を1にするとUndoに記録されるようになります。

https://docs.microsoft.com/en-us/windows/desktop/controls/em-replacesel



taka

リンク

2018/11/21(Wed) 17:37:27|NO.85855

>いののてさん

ありがとうございます。
私の単純な手落ちでした。これで解決に至りそうです。

#include "user32.as" #include "kernel32.as" // エファクトの定数 #const CFM_FACE $20000000 #const CFM_BOLD $00000001 ; CFE_BOLD #const CFM_ITALIC $00000002 ; CFE_ITALIC #const CFM_UNDERLINE $00000004 ; CFE_UNDERLINE #const CFE_BOLD $00000001 ; 太字体で表示されます。 #const CFE_ITALIC $00000002 ; イタリック体で表示されます。 #const CFE_UNDERLINE $00000004 ; アンダーラインを引きます。 #const CFM_COLOR $40000000 ; crTextColorメンバとdwEffectsメンバのCFE_AUTOCOLOR値が有効 #const SCF_SELECTION $00000001 ; #const style 0x50b00004 /*WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL|ES_MULTILINE*/ #define EM_EXLIMITTEXT 0x0435 //コマンドの定数 #define EM_REPLACESEL $C2 #define EM_UNDO 0x00C7 #define WM_UNDO $304 #define WM_PASTE $302 onexit*exit // libraryを動的ロード LoadLibrary "RICHED20.DLL" plib = stat // 色操作 objsize 80,20 tx="赤","緑","青" repeat 3 button tx.cnt,*col loop // エファクト操作 tx = "太字","斜体","下線" effvalM = CFM_BOLD,CFM_ITALIC,CFM_UNDERLINE effvalE = CFE_BOLD,CFM_ITALIC,CFM_UNDERLINE pos ,ginfo_cy+5 teff=stat+1 repeat 3 button tx.cnt,*eff loop // フォント操作 fontface = msGothic,msmincho,"メイリオ" pos ,ginfo_cy+5 tface=stat+1 repeat 3 button fontface.cnt,*fon loop // clear pos ,ginfo_cy+5:button "clear",*clr //文字数チェック pos ,ginfo_cy+20:button "size check",*size_check //置換での貼り付け pos ,ginfo_cy+20:button "貼り付け",*replace_paste //元に戻す pos ,ginfo_cy+5:button "元に戻す",*undo // リッチエディット作成 pos 80,0 winobj "RichEdit20A","リッチエディットコントロール、書式切替テスト",0,style,ginfo_winx-80,ginfo_winy hwnd_re = objinfo_hwnd(stat) gsel 0,1 Setfocus hwnd_re dim cf2,21 // CHARFORMAT2構造体 //リッチエディトに対して、格納最大文字数変更(変更後 128kバイト) sendmsg hwnd_re,EM_EXLIMITTEXT,0,131072 stop //文字数チェック用 *size_check sdim tmp_txt,1250304 GetWindowText hwnd_re,varptr(tmp_txt),1250304 txt_len = strlen(tmp_txt) dialog "内部文字列は "+txt_len+"("+(txt_len / 1024)+"KB) 文字数です" stop //置換での貼り付け *replace_paste buf="置換での貼り付けをしました" sendmsg hwnd_re, EM_REPLACESEL, 1, buf//////////////wParam=1に変更 stop //元に戻す *undo sendmsg hwnd_re, EM_UNDO ; sendmsg hwnd_re, WM_UNDO stop *col // CHARFORMAT2構造体 の 5 番目の配列に テキストの色を 0xBBGGRR で代入 cf2 = 84,CFM_COLOR,0,0,0, 0xFF<<(stat*8) goto *setcharformat *fon // CHARFORMAT2構造体 の 26byte 目に フォント名を poke か memcpyで代入 cf2 = 84,CFM_FACE poke cf2 , 26 , fontface(stat-tface) goto *setcharformat *eff // CHARFORMAT2構造体 の 1 番目に 上書きされるエファクト情報のマスク // 2番目に ソレが有効に成るか無効に成るかを代入 p=(stat-teff) cf2 = 84,effvalM.p,effvalE.p goto *setcharformat *clr // おまけ // 色と、エファクトをクリア。 cf2 = 84,CFM_COLOR|CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE,0,0,0,0 *setcharformat // 選択されている位置に現在のフォーマットを設定する。 sendmsg hwnd_re,0x444 /*EM_SETCHARFORMAT*/,SCF_WORD|SCF_SELECTION,varptr(cf2) SetFocus hwnd_re stop *exit DestroyWindow hwnd_re // エラーを回避するためには、ウィンドウを削除したのちに FreeLibrary plib // freelibraryを実行して 動的確保されたlibraryのポインタを指定する。そうしなければ、ウィンドウを閉じる事が出来ずにエラーの原因になる。 end stop



ONION software Copyright 1997-2023(c) All rights reserved.