;---------- ---------- ---------- ---------- ---------- ; 作成者のURL ---> http://www.setsuki.com/ ;---------- ---------- ---------- ---------- ---------- ; 最終更新日:2014/09/29 ; Ctrl+F9 で exe 作成 #packopt type 0 #packopt name "clipbord_list" #packopt runtime "hsp3c.hrt" #packopt hide 0 #include "kernel32.as" #include "user32.as" #include "gdi32.as" #define global CF_TEXT 1 #define global CF_BITMAP 2 #define global CF_METAFILEPICT 3 #define global CF_SYLK 4 #define global CF_DIF 5 #define global CF_TIFF 6 #define global CF_OEMTEXT 7 #define global CF_DIB 8 #define global CF_PALETTE 9 #define global CF_PENDATA 10 #define global CF_RIFF 11 #define global CF_WAVE 12 #define global CF_UNICODETEXT 13 #define global CF_ENHMETAFILE 14 #define global CF_HDROP 15 #define global CF_LOCALE 16 #define global CF_MAX 17 #define global CF_OWNERDISPLAY 0x0080 #define global CF_DSPTEXT 0x0081 #define global CF_DSPBITMAP 0x0082 #define global CF_DSPMETAFILEPICT 0x0083 #define global CF_DSPENHMETAFILE 0x008E #module ;---------- ---------- ---------- ---------- ---------- ; 変数のサイズを減少させるためのマクロ #define data bm #define ref bm #define size i #define off i #define hdc_mem aval #define pText aval #define pbit aval ;---------- ---------- ---------- ---------- ---------- #defcfunc clipname int p1 if( p1 == CF_TEXT ) : return "CF_TEXT" if( p1 == CF_BITMAP ) : return "CF_BITMAP" if( p1 == CF_METAFILEPICT ) : return "CF_METAFILEPICT" if( p1 == CF_SYLK ) : return "CF_SYLK" if( p1 == CF_DIF ) : return "CF_DIF" if( p1 == CF_TIFF ) : return "CF_TIFF" if( p1 == CF_OEMTEXT ) : return "CF_OEMTEXT" if( p1 == CF_DIB ) : return "CF_DIB" if( p1 == CF_PALETTE ) : return "CF_PALETTE" if( p1 == CF_PENDATA ) : return "CF_PENDATA" if( p1 == CF_RIFF ) : return "CF_RIFF" if( p1 == CF_WAVE ) : return "CF_WAVE" if( p1 == CF_UNICODETEXT ) : return "CF_UNICODETEXT" if( p1 == CF_ENHMETAFILE ) : return "CF_ENHMETAFILE" if( p1 == CF_HDROP ) : return "CF_HDROP" if( p1 == CF_LOCALE ) : return "CF_LOCALE" if( p1 == CF_MAX ) : return "CF_MAX" if( p1 == CF_OWNERDISPLAY ) : return "CF_OWNERDISPLAY" if( p1 == CF_DSPTEXT ) : return "CF_DSPTEXT" if( p1 == CF_DSPBITMAP ) : return "CF_DSPBITMAP" if( p1 == CF_DSPMETAFILEPICT ) : return "CF_DSPMETAFILEPICT" if( p1 == CF_DSPENHMETAFILE ) : return "CF_DSPENHMETAFILE" sdim tmp,256 GetClipboardFormatName p1,varptr(tmp),256 return tmp ;---------- ---------- ---------- ---------- ---------- #defcfunc clipformat str p1 sdim tmp, 256 : tmp = p1 RegisterClipboardFormat varptr(tmp) return stat ;---------- ---------- ---------- ---------- ---------- #deffunc clipget var p1, int p2, int p3 if( p2 > 0 ): size = p2 : else : size = 64 if( p3 == 0 ): format = CF_TEXT : else : format = p3 ;指定したフォーマットの存在を検索 IsClipboardFormatAvailable format if( stat == 0 ): return ;クリップボードを開く OpenClipboard hwnd if( stat == 0 ): return ;ポインタ取得 GetClipboardData format hClip = stat if( hClip != 0 ){ ; サイズ取得 GlobalSize hClip : if( stat > size ): sdim p1, stat size = stat if( size != 0 ){ ;クリップボードのデータを読み込み dupptr data, hClip, size, 2 ;クリップボードのデータを変数に保存 memcpy p1, data, size } dim bm, 24 : hBitmap = 0 ; DIBビットマップオブジェクトの場合 if( format == CF_DIB ){ memcpy bm, p1, 24 : pbit = bm.0 if( bm.3 <= 0x8FFFF ): pbit += ( 1<<( (bm.3>>16)&0xFF ) )*4 if( bm.4 == 3 ): pbit += 12 ;ビットマップを作成 CreateDIBitmap hdc, hClip, 4, hClip+pbit, hClip, 0 hBitmap = stat } ; ビットマップオブジェクトの場合 if( format == CF_BITMAP ){ ;ビットマップオブジェクト情報取得 GetObject hClip,24,varptr(bm) hBitmap = hClip } if( hBitmap != 0 ){ ;メモリデバイスコンテキストを作成 CreateCompatibleDC hdc hdc_mem = stat ;ビットマップオブジェクトを選択 SelectObject hdc_mem, hBitmap hOldBitmap = stat ;画像情報をコピー BitBlt hdc,ginfo_cx,ginfo_cy,bm.1,bm.2,hdc_mem,0,0,$CC0020 redraw ;オブジェクトを元に戻す SelectObject hdc_mem, hOldBitmap ;メモリデバイスコンテキストを削除 DeleteDC hdc_mem if( hClip != hBitmap ){ ;ビットマップを削除 DeleteObject hBitmap } size = 1 } ; アイコンデータの場合 ;if( format == clipformat("Delphi Icon") ){ ;} ; 戻り値をデータサイズに設定 hClip = size } ;クリップボードを閉じる CloseClipboard return hClip ;---------- ---------- ---------- ---------- ---------- #deffunc clipset var p1, int p2, int p3 size = p2 : if( size < 1 ): size = strlen(p1)+1 ;グローバルメモリを作成、ロックする GlobalAlloc 0x2002, size : hClip = stat GlobalLock hClip : pText = stat ;グローバルメモリにコピー dupptr data, pText, size, 2 memcpy data, p1, size ;ロックの解除 GlobalUnlock hClip ;クリップボードを開く OpenClipboard 0 if( stat == 0 ): return ;クリップボードを空にする EmptyClipboard ;クリップボードに値を設定する SetClipboardData p3, hClip if( stat == 0 ): pText = 0 : else : pText = 1 ;クリップボードを閉じる CloseClipboard ;グローバグメモリを閉じる GlobalFree hClip return pText ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SJIS -> UTF-8Nコードに変換 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc SJIStoUTF8 var utf, var sjis #define CP_UTF8 65001 ;バッファに必要なサイズを調べる ;MultiByteToWideChar 932,0,varptr(sjis),-1,0,0 : len = stat len = strlen(sjis) : sdim tmp, len*2 ;一度UniCodeに変換 MultiByteToWideChar 932,0,varptr(sjis),-1,varptr(tmp),len ;バッファに必要なサイズを調べる WideCharToMultiByte 65001,0,varptr(tmp),len,0,0,0,0 len = stat : memexpand utf, len+1 ;UTF-8に変換 WideCharToMultiByte 65001,0,varptr(tmp),len,varptr(utf),len,0,0 return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; UTF-8N -> SJISコードに変換 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc UTF8toSJIS var sjis, var utf ;バッファに必要なサイズを調べる MultiByteToWideChar 65001,0,varptr(utf),-1,varptr(tmp),0 len = stat : sdim tmp,len*2 ;一度UniCodeに変換 MultiByteToWideChar 65001,0,varptr(utf),-1,varptr(tmp),len ;バッファに必要なサイズを調べる WideCharToMultiByte 932,0,varptr(tmp),-1,varptr(sjis),0,0,0 len = stat : memexpand sjis, len+1 ;UTF-8に変換 WideCharToMultiByte 932,0,varptr(tmp),-1,varptr(sjis),stat,0,0 return ;---------- ---------- ---------- ---------- ---------- #defcfunc noteint int p1 sdim tmp, 1024 : noteget tmp, p1 off = instr(tmp, 0, ":") + 1 if( off > 0 ){ return int( strmid(tmp, off, strlen(tmp)-off) ) } return int( tmp ) ;---------- ---------- ---------- ---------- ---------- #deffunc noteadd2 str p1, str p2, int p3 sdim tmp, 1024 noteget tmp, p3 if( instr(tmp, 0, p1) == 0 ): size = 1 : else : size = 0 noteadd p1 + p2, p3, size return ;========== ========== ========== ========== ========== ; コンボボックス #define CB_GETCURSEL 0x147 ;現在選択中のインデックス番号取得 #define CB_GETLBTEXT 0x148 ;選択項目の文字列取得 ; リストボックス #define LB_GETCURSEL 0x188 ;現在選択中のインデックス番号取得 #define LB_GETTEXT 0x189 ;選択項目の文字列取得 ;---------- ---------- ---------- ---------- ---------- #deffunc getcombox int p1, var p2 if( lparam != objinfo(p1,2) ): return 0 ;wparamの上位ワードは通知コード ( 通知コード1 = 選択状態変化 ) if( ( ( wparam >> 16 )& $FFFF ) != 1 ){ return 0 } mref ref, 65 sendmsg objinfo(p1,2), CB_GETCURSEL, 0, 0 : p2 = stat sendmsg objinfo(p1,2), CB_GETLBTEXT, p2, varptr(ref) return 1 ;---------- ---------- ---------- ---------- ---------- #deffunc getlistbox int p1, var p2 if( lparam != objinfo(p1,2) ): return 0 ;wparamの上位ワードは通知コード ( LBN_SELCHANGE ) if( ( ( wparam >> 16 )& $FFFF ) != 1 ){ return 0 } mref ref, 65 sendmsg objinfo(p1,2), LB_GETCURSEL, 0, 0 : p2 = stat sendmsg objinfo(p1,2), LB_GETTEXT, p2, varptr(ref) return 1 ;---------- ---------- ---------- ---------- ---------- #global #ifdef _debug #undef dir_exe dir_exe = dir_cur #endif file = "test.html" #define global WM_ACTIVATE 0x0006 #define global WM_COMMAND 0x0111 #define EM_SETSEL $B1 #define EM_REPLACESEL $C2 #define WM_CUT $300 #define WM_COPY $301 #define WM_PASTE $302 #define WM_CLEAR $303 #define WM_UNDO sdim list, 1024 sdim ans, 65535 sdim tmp, 1024 objsize 200 : objmode 2 listbox flag, ginfo_winy, list : hList = stat objsize 120 : objmode 1 pos 200, 0 : button gosub "クリップボード登録", *Clipbord_SaveData pos 320, 0 : button gosub "HTML書き出し", *Htmlfile_Save pos 200, 24 mesbox ans, ginfo_winx-200,ginfo_winy-ginfo_cy : hMesbox = stat gosub *Clipbord_GetList gosub *Htmlfile_Get oncmd gosub *OnCommand, WM_COMMAND oncmd gosub *OnActivate, WM_ACTIVATE stop *OnCommand getlistbox 0, flag : if( stat != 1 ): return tmp = refstr split tmp, ": ", tmp, format_name if( tmp == file ): goto *Htmlfile_Get format_uint = int( "$"+tmp ) *Clipbord_GetData sdim html, 65535 pos 200, 24 : color 255,255,255 : boxf 200, 24 clipget html, 65535, format_uint html_size = stat *Clipbord_ViewData if( format_name == "HTML Format" ){ UTF8toSJIS ans, html notesel ans startHTML = noteint(1) endHTML = noteint(2) StartFragment = noteint(3) EndFragment = noteint(4) } else { if( 65535 < html_size ): sdim ans, html_size memcpy ans, html, html_size } if( format_name == "CF_BITMAP" )||( format_name == "CF_DIB" ){ ShowWindow objinfo(hMesbox, 2), 0 } else { ShowWindow objinfo(hMesbox, 2), 5 } title format_name+" ("+html_size+" bytes)" objprm hMesbox, ans return *OnActivate if( ( wparam&0xFFFF ) == 0 ): return *Clipbord_GetList list = "" : format_uint = 0 notesel list noteadd file OpenClipboard hwnd repeat 100 EnumClipboardFormats format_uint : if( stat == 0 ): break format_uint = stat noteadd strf("%04X: ", format_uint)+clipname(format_uint) loop CloseClipboard objprm hList, list return *Clipbord_SaveData dialog "この「"+format_name+"」形式のデータを\nクリップボードに、登録しますか?", 2, "確認" if( stat == 6 ){ clipset html, html_size, clipformat(format_name) if( stat == 0 ): dialog "クリップボードへの登録に失敗しました" } return *Htmlfile_Save if( peek(html, html_size-1) == 0 ): minus = 1 : else : minus = 0 bsave file, html, html_size - minus dialog file+" に、保存しました。", 0, "保存完了" return *Htmlfile_Get format_name = "HTML Format" format_uint = clipformat(format_name) sdim html : notesel html exist file if( strsize > 0 ){ noteload file : html_size = strsize } noteadd2 "Version:", "0.9", 0 noteadd2 "StartHTML:", strf("%010d", 0), 1 noteadd2 "EndHTML:", strf("%010d", 0), 2 noteadd2 "StartFragment:", strf("%010d", 0), 3 noteadd2 "EndFragment:", strf("%010d", 0), 4 StartHTML = instr(html, 0, "") : if( StartHTML < 0 ): StartHTML = 0 EndHTML = instr(html, 0, "") : if( EndHTML < 0 ): EndHTML = 0 : else : EndHTML += strlen("") StartFragment = instr(html, 0, "") : if( StartFragment < 0 ): StartFragment = 0 : else : StartFragment += strlen("") EndFragment = instr(html, 0, "") : if( EndFragment < 0 ): EndFragment = 0 noteadd "StartHTML:"+ strf("%010d", StartHTML), 1, 1 noteadd "EndHTML:"+ strf("%010d", EndHTML), 2, 1 noteadd "StartFragment:"+ strf("%010d", StartFragment), 3, 1 noteadd "EndFragment:"+ strf("%010d", EndFragment), 4, 1 html_size = strlen(html) + 1 goto *Clipbord_ViewData