;================================================================================ ;モジュール dragdrop ;ver 1.01 ; ドラッグ&ドロップ ; llmod.asが必要です ; ( _ddrop.mcn がいらないよう修正:2002/11/13 ) ;================================================================================ ; dragdropモジュール命令一覧 ; ; dd_accept ドラッグ&ドロップをできるようにする ; dd_reject ドラッグ&ドロップをできないようにする ; ; 計 2個 ;使い方 ;================================================================================ ; dd_accept v1,v2,n3 ドラッグ&ドロップをできるようにする ; ; v1 : ドラッグ&ドロップされたファイル名を入れる変数 ; v2 : ドラッグ&ドロップされたファイル数を入れる変数 ; n3 : ウィンドウID ;================================================================================ ; ;<>説明 ; n3で指定したウィンドウにドラッグ&ドロップ(以下D&D)をできるようにします。 ; ただし、ウィンドウID 1は設定できません。 ; dd_acceptを実行した後、ウィンドウにファイルがD&Dされるとv1で指定した変数に ; D&Dされたファイル名が入ります。 ; v2にはD&Dされたファイルの数、D&Dされた座標、ウィンドウIDが代入されます。 ; ; D&Dされたファイル名は"\n"で区切られています(D&Dされたファイルが1つの場合でも)。 ; 1つのファイル名を取り出したいときはノートパッド命令を使うと便利です。 ; ; dd_accept実行後は、v1,v2に設定した変数はalloc,dim,sdimなどに使用しないで下さい。 ; ;<>例 ; #include "llmod.as" ; #include "dragdrop.as" ; ; alloc buf,1024*64 ;ドラッグ&ドロップされたファイル名を入れる変数 ; dd_accept buf,a ; ;*@ ; wait 1 ; if a { ; cls ; pos 0,0 ; mes "ドラッグ&ドロップされたファイル数:"+a ; mes "ドラッグ&ドロップされたファイル位置 x:"+a.1+" y:"+a.2 ; mes "ドラッグ&ドロップされたウィンドウID :"+a.3 ; mes buf ; a=0 ; aをリセットしてください ; } ; goto @b ; ;<>例2 ; #include "llmod.as" ; #include "dragdrop.as" ; ; alloc buf,1024*64 ;ドラッグ&ドロップされたファイル名を入れる変数 ; dd_accept buf,a ; ;*@ ; wait 1 ; if a { ; notesel buf ; repeat a ; noteget file,cnt ; exec file,16 ;ドラッグ&ドロップされたファイルを実行 ; loop ; a=0 ; } ; goto @b ; ;================================================================================ ; dd_reject n1,n2 ドラッグ&ドロップをできないようにする ; ; n1 : ウィンドウID ; n2 : フラグ ;================================================================================ ; ;<>説明 ; ドラッグ&ドロップをできないようにします。 ; dd_acceptを実行していない場合には効果がありません。 ; n2を1にするともう一度ドラッグ&ドロップをできるようにします。 ; ;module始め>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #module "dragdrop" ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;_drag_accept_files ;................................................................................ *_drag_accept_files dllproc "DragAcceptFiles",prm,2,D_SHELL return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;dd_accept ; ;................................................................................ #deffunc dd_accept val,val,int mref v1,24 ;buffer mref v2,17 ;buffer for retrieve count of files dropped mref v3,2 ;window id v2=0 #define MCN_FILE_SIZE 192 #define MAX_WND_ID 32 if init=0 { init=1 alloc procs,MCN_FILE_SIZE*MAX_WND_ID alloc proc_org,MAX_WND_ID*4 _ddrop_mcn="_ddrop.mcn" } ;exist _ddrop_mcn : if strsize=-1 : dialog _ddrop_mcn+"が見つかりません" : return if v3=1 : return ;scrren 1は使用しない getptr p,v1 ;pointer to buffer getptr p.1,v2 wnd_id=v3 mref bmscr,67 wnd_id.1=bmscr.18 ;現在アクティブなウィンドウID gsel wnd_id mref bmscr,67 gsel wnd_id.1 ;プロシージャが既にセットされていればここでリターン if proc_org.wnd_id : return prm=bmscr.13,1 gosub _drag_accept_files ;プロシージャの取得 ;#define GWL_WNDPROC -4 prm=bmscr.13 ;hwnd prm.1=-4 ;GWL_WNDPROC setwndlong prm,1 ;GetWindowLong proc_org.wnd_id=stat ;プロシージャの作成 a=MCN_FILE_SIZE/4*wnd_id dup buf,procs.a getptr p_proc,buf dll_getfunc func ,"CallWindowProcA",D_USER dll_getfunc func.1,"DragQueryFileA",D_SHELL dll_getfunc func.2,"DragFinish",D_SHELL dll_getfunc func.3,"DragQueryPoint",D_SHELL ;exist _ddrop_mcn ;bload _ddrop_mcn,buf,strsize dim mcndata,MCN_FILE_SIZE/4 mcndata.0=$0824448b,$0002333d,$57677500,$7c8b5556,$00be1824,$b8000000,$ffffffff,$57505050 mcndata.8=$000000b8,$8bd0ff00,$0000a3e8,$00b80000,$50000000,$0000b857,$d0ff0000,$000005c7 mcndata.16=$00000000,$684d0000,$00000104,$b8575556,$00000000,$f003d0ff,$0d06c766,$02c6830a mcndata.24=$e275ed85,$570006c6,$000000b8,$5dd0ff00,$74ff5f5e,$74ff1024,$74ff1024,$74ff1024 mcndata.32=$00681024,$b8000000,$00000000,$10c2d0ff,$00000000 a=MCN_FILE_SIZE*wnd_id memcpy procs, mcndata, MCN_FILE_SIZE, a #define PK_BUF 19 #define PK_DQF 33 #define PK_BUF_N 42 #define PK_POINT 47 #define PK_DQP 54 #define PK_BUF_W 62 #define PK_WNDID 66 #define PK_DQF2 80 #define PK_DFF 105 #define PK_OPROC 131 #define PK_CWP 136 ll_poke4@ p, p_proc+PK_BUF ;buffer ll_poke4@ func.1, p_proc+PK_DQF ;DragQueryFiles ll_poke4@ p.1, p_proc+PK_BUF_N ;buffer for count of files dropped ll_poke4@ p.1+4, p_proc+PK_POINT ;buffer for POINT ll_poke4@ func.3, p_proc+PK_DQP ;DragQueryPoint ll_poke4@ p.1+12, p_proc+PK_BUF_W ;buffer for hwnd ll_poke4@ wnd_id, p_proc+PK_WNDID ;HSP window ID ll_poke4@ func.1, p_proc+PK_DQF2 ;DragQueryFiles ll_poke4@ func.2, p_proc+PK_DFF ;DragFinish ll_poke4@ proc_org.wnd_id,p_proc+PK_OPROC ;Original WndProc ll_poke4@ func, p_proc+PK_CWP ;CallWindowProc ;プロシージャのセット prm=bmscr.13 ;hwnd prm.1=-4 ;GWL_WNDPROC prm.2=p_proc setwndlong prm return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;dd_reject ;ドラッグ&ドロップをできないようにする ;................................................................................ #deffunc dd_reject int mref v1 ;window id mref v2,1 wnd_id=v1 mref bmscr,67 wnd_id.1=bmscr.18 ;現在アクティブなウィンドウID gsel wnd_id mref bmscr,67 gsel wnd_id.1 if proc_org.v1=0 : return ;dd_acceptが使われていない prm=bmscr.13,v2 gosub _drag_accept_files return ;module終わり>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #global