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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0907
HSP初心者OleDragDropモジュール(テキスト型専用)2解決


HSP初心者

リンク

2016/9/7(Wed) 18:37:03|NO.76809

検索したものの情報が古いためか見つからず
せっかく自作したので公開します


#ifndef OleDragDrop #module OleDragDrop //IDROPTARGET_NOTIFY_MSG #enum IDROPTARGET_NOTIFY_DRAGENTER = 0 #enum IDROPTARGET_NOTIFY_DRAGOVER #enum IDROPTARGET_NOTIFY_DRAGLEAVE #enum IDROPTARGET_NOTIFY_DROP // IDROPTARGET_NOTIFY_DRAGENTERの際にIDROPTARGET_NOTIFYのdwEffectに代入する。このモジュールはコピーと移動のみ #define DROPEFFECT_COPY 1 #define DROPEFFECT_MOVE 2 //D&Dで扱う形式。このモジュールはテキスト形式のみ #define CF_TEXT 1 //アプリケーションが使用するのに使うことのできるメッセージ #define WM_APP 0x8000 #uselib "OleDragDrop.dll" #func OLE_IDropTarget_RegisterDragDrop "OLE_IDropTarget_RegisterDragDrop" int,int,var,int #func OLE_IDropTarget_RevokeDragDrop "OLE_IDropTarget_RevokeDragDrop" int #uselib "kernel32.dll" #cfunc GlobalLock "GlobalLock" int #func GlobalUnlock "GlobalUnlock" int #define global RegisterDragDrop(%1,%2=-1,%3=0) TempVarLabel=%1:_RegisterDragDrop TempVarLabel,%2,%3 #deffunc _RegisterDragDrop var Label, int WinID, int Mode SelectedWinID = ginfo(3) //現在の操作先ウィンドウIDを保存 if(WinID != -1) : gsel WinID //第二引数が指定されていたら操作先ウィンドウIDに指定 WinMessage = WM_APP + 100 + MesCount //WM_APP以降は自由にメッセージに使用できるはず。とりあえず100を足した値とする oncmd gosub *DandD, WinMessage //メッセージを受け取ったらサブルーチンへジャンプ dim cFormat : cFormat = CF_TEXT //D&Dで受け取るクリップボードフォーマットの型。このモジュールはテキスト形式のみ OLE_IDropTarget_RegisterDragDrop hwnd, WinMessage, cFormat, length(cFormat) //D&Dを受け取れるように設定する _stat = stat //戻り値を保存 DandDlabel(MesCount) = Label //ジャンプ先のラベルを保存 DandDMode(MesCount) = DROPEFFECT_COPY : if(Mode != 0) : DandDMode(MesCount) = DROPEFFECT_MOVE //コピーか移動かの処理を保存 MesCount++ //カウントを一つ増やす gsel SelectedWinID //以前の操作先ウィンドウIDに戻す return _stat *DandD GetMesCount = iparam - WM_APP - 100 //割り込みメッセージを逆算すると受け取ったウィンドウが分かる Res = -1 //戻り値に使用 dupptr IDROPTARGET_NOTIFY,lParam,24 //lParamにD&Dされた情報が格納されたIDROPTARGET_NOTIFY構造体のポインタが代入されている switch wParam //wParamにD&Dの状態が入っている case IDROPTARGET_NOTIFY_DRAGENTER //ドラッグイン switch IDROPTARGET_NOTIFY(3) //ここにクリップボードフォーマットの型が代入されている case CF_TEXT //テキスト形式ならば IDROPTARGET_NOTIFY(1) = DandDMode(GetMesCount) //ドロップ時の処理を代入 Res = IDROPTARGET_NOTIFY_DRAGENTER //戻り値を変更 swbreak swend swbreak case IDROPTARGET_NOTIFY_DRAGOVER //ドラッグ中 Res = IDROPTARGET_NOTIFY_DRAGOVER //戻り値を変更 swbreak case IDROPTARGET_NOTIFY_DRAGLEAVE //ドラッグ中にウィンドウ外に出た Res = IDROPTARGET_NOTIFY_DRAGLEAVE //戻り値を変更 swbreak case IDROPTARGET_NOTIFY_DROP //ドロップ switch IDROPTARGET_NOTIFY(3) //ここにクリップボードフォーマットの型が代入されている case CF_TEXT //テキスト形式ならば dupptr TempPtr, GlobalLock(IDROPTARGET_NOTIFY(4)), 1, 2 //文字列が保存されているメモリのアドレスへのクローン変数を作成 mref _refstr,65 : _refstr = TempPtr //refstrのクローン変数? を作成して代入 GlobalUnlock IDROPTARGET_NOTIFY(4) //D&D情報のメモリのロックを解除 dim TempPtr //クローン変数を初期化。必要? swbreak swend Res = IDROPTARGET_NOTIFY_DROP //戻り値を変更 swbreak swend if(Res != -1) { //戻り値が変更されていたら mref _stat, 64 : _stat = Res //statのクローン変数? を作成してD&Dの状態を代入 gosub DandDlabel(GetMesCount) //受け取ったウィンドウ用のサブルーチンへジャンプ } return #define global RevokeDragDrop(%1=-1) _RevokeDragDrop %1 #deffunc _RevokeDragDrop int WinID if(WinID != -1) { //引数が指定されていたら SelectedWinID = ginfo(3) //現在の操作先ウィンドウIDを保存 gsel WinID //ウィンドウのハンドルを取得するため操作先ウィンドウIDに指定 } OLE_IDropTarget_RevokeDragDrop hwnd //D&D解除 gsel SelectedWinID //以前の操作先ウィンドウIDに戻す return stat #global #endif



この記事に返信する


HSP初心者

リンク

2016/9/7(Wed) 18:42:34|NO.76810

ヘルプも作成したものの規約に反していると投稿できませんでした
使い方は模索してください



弱テン翼

リンク

2016/9/29(Thu) 02:02:08|NO.77022

OleDragDrop.dllを使用する方法がわからず悩んでいましたが、このモジュールのおかげで解決しました。
通常テキストをコピー&ペーストする場合、範囲選択→CTRL+C→コピー先をクリック→CTRL+Vという4回
のアクションが必要ですが、Oleなら範囲選択→対象のウィンドウにD&Dで済むためとても快適です。

ただ一つ気になった点があり、D&Dを繰り返すとsublev(ネストレベル)が増え続けてしまうバグがあるようです。
(gosubからreturnせずに次のgosubに飛んでしまうため?)


if(Res != -1) { //戻り値が変更されていたら mref _stat, 64 : _stat = Res //statのクローン変数? を作成してD&Dの状態を代入 ;gosub DandDlabel(GetMesCount) //受け取ったウィンドウ用のサブルーチンへジャンプ }

上の箇所をコメントアウトすれば増え続けることはなくなりますが、そもそもD&Dのときにoncmdで必ず呼ばれ
るためDandDlabelへのジャンプは必要ないような気もします。



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