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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0106
uinputにドラッグ&ドロップ8解決


u

リンク

2010/1/6(Wed) 08:46:38|NO.29796

inputのみをドラッグ&ドロップ可能にし、ドロップされたらそこにファイル名を表示したいと思っています。
そこでまずDragAcceptFiles関数でinputへのドロップを許可したところまではいいのですが、WM_DROPFILESメッセージが来ません。
inputにドロップしようとするときちんとカーソルも変わるので許可はできているようなのですが・・。
ウインドウハンドルを許可すると普通にメセーッジが飛んでくるようですが。
どのようにすれば良いのでしょうか。



この記事に返信する


u

リンク

2010/1/6(Wed) 08:48:23|NO.29797

ウインドウハンドルは親のウインドウハンドルのことでした。
あとメセーッジはミスです。



begriff

リンク

2010/1/6(Wed) 15:08:46|NO.29798

どうもこんにちは begriffと申します。

この場合 WM_DROPFILES はHSPのウィンドウには来ません
inputのほうに来ます。現状コントロールに届いたメッセージを
親ウィンドウであるHSPのウィンドウが取得する方法は標準ではありません
サブクラス化という方法で通常この問題は解決されますがHSPでそれをするのは困難です。
しようとすると DLLを組むか、マシン語埋め込む必要があります。

ただしトリッキーですがWM_DROPFILESを取得する方法があります。
inputと同じ大きさのbgscrでウィンドウをつくり、
それをHSPのウィンドウの子ウィンドウとし、
(正確にはbgscrのウィンドウの親をHSPのウィンドウとする SetParent)
その子ウィンドウのなかに所定の大きさのinputをつくります。
DragAcceptFilesのターゲットを子ウィンドウとします。
あとはoncmdで取得できます。

同じこと考えてた方がもうすでにいました^^;
http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200901/09030033.txt



Hiroaki Software

リンク

2010/1/6(Wed) 16:54:50|NO.29799

>begriffさん
HSPでサブクラス化は
ちょくとさんが作成したコールバック関数実装プラグイン hscallbk.dll for HSP3
とWindowsAPIのSetWindowLong関数及びCallWindowProc関数
を使えばできますよ

コールバック関数実装プラグイン hscallbk.dll for HSP3は
http://hsp.tv/make/tool1.html で紹介されてますね



Hiroaki Software

リンク

2010/1/6(Wed) 17:15:33|NO.29800

>スレ主さん
NO.29799で紹介しました
コールバック関数実装プラグイン hscallbk.dll for HSP3
を使ってサンプルを書きましたので載せておきます

#include "User32.as" #include "Shell32.as" #include "hscallbk.as" // コールバック関数の関数形式を定義 // ( DLL名および関数名はダミー (空文字列) ) #uselib "" #func InpWndProc "" int,int,int,int // コールバック関数の登録 setcallbk Proc, InpWndProc, *MyInpWndProc #define GWL_WNDPROC (-4) #define WM_DROPFILES 0x0233 sdim inp,262 objmode 2 pos 5,5 input inp,600,25 inpid=stat //入力ボックスにドラッグアンドドロップされたファイルを受け取るように設定 DragAcceptFiles objinfo(inpid,2),1 //入力ボックスのウィンドウプロシージャを //自前の物に変える SetWindowLong objinfo(inpid,2),GWL_WNDPROC,varptr(Proc) //変更前のウィンドウプロシージャのアドレスを取っておく OldWndProc=stat sdim FileAdd,261 stop *MyInpWndProc if callbkarg(1)==WM_DROPFILES{ //1番最初のファイルのアドレスを取得 DragQueryFile callbkarg(2),0,varptr(FileAdd),261 //ドロップファイル用のメモリを解放 DragFinish callbkarg(2) //入力ボックスに1番最初のファイルのアドレスを表示 objprm inpid,FileAdd }else{ //WM_DROPFILES以外のメッセージは元々のウィンドウプロシージャに任せる CallWindowProc OldWndProc,callbkarg(0),callbkarg(1),callbkarg(2),callbkarg(3) } return
尚このサンプルを実行するには
コールバック関数実装プラグイン hscallbk.dll for HSP3
が必要になります
http://hsp.tv/make/tool1.html
から コールバック関数実装プラグイン hscallbk.dll for HSP3
のダウンロードのページに行くことができますのでご自身で導入してください



Kpan

リンク

2010/1/6(Wed) 21:13:04|NO.29801

何か処理多そうでめんどいなら、
ウィンドウをD&D許可にして、マウスの位置で入力ボックス上のみ
反応させる手抜き。(WindowFromPoint関数)


WindowFromPoint ginfo(0), ginfo(1) if stat = hInput { ;hInputは入力ボックスのハンドル objprm 0, パス }



begriff

リンク

2010/1/6(Wed) 22:25:22|NO.29802

Kpanさんのを参考にちょっと違ったベクトルで組んでみました
DragAcceptFilesのループ内での挙動のクセが強いので
すごく騙し騙しです。^^;(OSに依存するかもです)
使い物になりません orz 参考程度にどうぞ

#uselib "user32.dll"
#cfunc WindowFromPoint"WindowFromPoint" int,int #uselib "shell32.dll" #func DragAcceptFiles "DragAcceptFiles" int,int #func DragQueryFile "DragQueryFileA"int,int,int,int #func DragFinish "DragFinish" int #define WM_DROPFILES 0x0233 oncmd gosub *b,WM_DROPFILES a="" objsize 200,21 input a id=stat hwnd_input=objinfo(id,2) _hwnd=hwnd sdim buf,256 repeat accept=0 mhwnd=WindowFromPoint(ginfo_mx,ginfo_my) if(mhwnd=hwnd_input):accept=0 if(mhwnd=_hwnd):accept=1 DragAcceptFiles hwnd,accept wait 5 loop *b hDrop=wParam DragQueryFile hDrop,0,varptr(buf),256 DragFinish hDrop objprm id,buf return



u

リンク

2010/1/7(Thu) 07:29:37|NO.29808

やはりinputに送られてしまう為でしたか・・。
対処法を瞬時に調べ大体理解できました。

>begriffさん
小ウインドウを作るというのは考え付きませんでした。
これは手っ取り早いですね。

>Hiroaki Softwareさん
hscallbk.dllを使うことで解決しました。ありがとうございます。
わざわざサンプルまでありがとうございました。

>Kpanさん,begriffさん
どこでもカーソルが表示されるというのはなんとなく嫌でしたが、
begriffさんが改良したものは面白いですね。この発想はありませんでした。



u

リンク

2010/1/7(Thu) 07:52:56|NO.29809

解決



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