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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1228
今地区所リストビューからリストビューへのドラッグ&ドロップについて5解決


今地区所

リンク

2012/12/28(Fri) 12:41:09|NO.51505

やりたいことは
http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+200806/08060011.txt
で書いてあることと同じです。

リンク先ではWM_LBUTTONDOWNとWM_LBUTTONUP、WM_MOUSEMOVEの組み合わせ
または、LVN_BEGINDRAGとLVN_ENDDRAGの組み合わせでできると解決されていますが、
hspでやろうとするとWM_LBUTTONDOWNとWM_LBUTTONUP、WM_MOUSEMOVEはリストビュー上では検出できません。
またLVN_BEGINDRAGは検出できたんですが、LVN_ENDDRAGはWINDOWS XPでは実装されておらず、
ドラッグを検出できてドロップを検出できない状態にあります。
どうしたらいいんでしょうか?



この記事に返信する


fortunehill

リンク

2012/12/28(Fri) 14:07:40|NO.51509

/*ヒントに成るかしら?*/

winobj "SysListView32", "", $200,$50000000,200,200 oncmd gosub *label,$4E ;WM_NOTIFY stop *label dupptr NMHDR,lparam,12 switch NMHDR(2) case -2 :title "l-lick" :swbreak ;NM_CLICK case -3 :title "d-click" :swbreak ;NM_DBLCLK case -5 :title "r-click" :swbreak ;NM_RDBLCLK ; case -109 :title :swbreak ;LVN_BEGINDRAG swend return



今地区所

リンク

2012/12/28(Fri) 20:06:05|NO.51519

お返事ありがとうございますfortunehillさん
いまllmodでリストビューを作っているのですが、winobjで作ったものも試してみます。

一応作ったプログラムを載せておきますね。

#include "llmod3/llmod3.hsp" #include "llmod3/listview.hsp" #include "llmod3/img.hsp" #include "llmod3/obj.hsp" #define WM_LBUTTONUP 0x0202 #define WM_NOTIFY 0x004E #define NM_DBLCLK (-3) #define NM_RCLICK (-5) #define LVN_BEGINDRAG -109 //リストビュー1 listview 300,400,3 list=objinfo(stat,2) listadd 0,"AAA",0 pos 300,0 //リストビュー2 listview 300,400,3 list2=objinfo(stat,2) listadd 0,"BBB",0 oncmd gosub *b,WM_LBUTTONUP oncmd gosub *a,WM_NOTIFY stop *a dupptr nmhdr, lparam, 12 if (nmhdr.2=LVN_BEGINDRAG){ f=1 while(f==1) title ""+t t++ await 1 wend } return *b f=0 return



fortunehill

リンク

2012/12/29(Sat) 02:28:36|NO.51528

/*ごめんなさい(LVN_ENDDRAGが無いのね)。サブクラス化するのが簡単かも? */
/*ちょくとさんのhscallbk.dll使用*/

#include "User32.as" #include "Shell32.as" #include "hscallbk.as" #uselib "" #func WndProc "" int,int,int,int Setcallbk Proc,WndProc,*Label_WndProc winobj "SysListView32", "",$200,$50000000,200,200 ss = "QQQ" nn = $3,0,0,0,0,varptr(ss),0,0 :sendmsg objinfo(0,2),$1007,,varptr(nn) SetWindowLong objinfo(0,2),-4,varptr(Proc) :OldWndProc = stat ;GWL_WNDPROC oncmd gosub *Notify,$4E ;WM_NOTIFY stop *Label_WndProc if (callbkarg(1) == $202) {title "U"} ;WM_LBUTTONDOWN else {CallWindowProc OldWndProc,callbkarg(0),callbkarg(1),callbkarg(2),callbkarg(3)} return *Notify dupptr nmhdr, lparam, 12 if (objinfo(0,2) == nmhdr) {if (nmhdr.2 == -109) {title "D"}} ;LVN_BEGINDRAG return



今地区所

リンク

2012/12/29(Sat) 15:48:36|NO.51542

fortunehillさんありがとうございます。
使えそうなんですが、サブクラス化とかよくわからないので
どういう原理で動いているのかさっぱりわかりません。
少し勉強してから使わせていただきます。
ありがとうございました。

まだうまくいってないので未解決とさせていただきます。
うまくいったらソースを載せておきます。



今地区所

リンク

2012/12/29(Sat) 23:01:05|NO.51550

汚いソースですが何とかうまくいきました。

#include "hscallbk.as" #include "llmod3/llmod3.hsp" #include "llmod3/listview.hsp" #include "llmod3/img.hsp" #uselib "User32.dll" #define global SetWindowLong SetWindowLongA #func global SetWindowLong "SetWindowLongA" sptr,sptr,sptr #define global CallWindowProc CallWindowProcA #func global CallWindowProcA "CallWindowProcA" sptr,sptr,sptr,sptr,sptr #uselib "" #func WndProc "" int,int,int,int Setcallbk Proc,WndProc,*Label_WndProc #define WM_NOTIFY 0x004E #define LVN_BEGINDRAG -109 //リストビュー1 listview 300,400,3 list1=objinfo(stat,2) repeat 5 listadd cnt,"アイテム"+cnt*2,0 loop max.0=(stat+1) pos 300,0 //リストビュー2 listview 300,400,3 list2=objinfo(stat,2) repeat 5 listadd cnt,"アイテム"+(cnt*2+1),0 loop max.1=(stat+1) //リストビューのウィンドウプロシージャをコールバック関数に変更 SetWindowLong list1,-4,varptr(Proc) //ウィンドウの属性変更 //前のウィンドウプロシージャ OldWndProc=stat //リストビューのウィンドウプロシージャをコールバック関数に変更 SetWindowLong list2,-4,varptr(Proc) //ウィンドウの属性変更 oncmd gosub *Notify,WM_NOTIFY stop *Notify dupptr nmhdr, lparam, 12 if (nmhdr.2=LVN_BEGINDRAG){ gosub *get } return *Label_WndProc //コールバック関数 //コールバック関数に渡された引数を取得 $202=マウス左ボタンを離した if (callbkarg(1) == $202) {gosub *del} ;WM_LBUTTONDOWN else {CallWindowProc OldWndProc,callbkarg(0),callbkarg(1),callbkarg(2),callbkarg(3)} return *get dupptr nmhdr, lparam, 12 sel="":t=0 if (nmhdr.2=LVN_BEGINDRAG){ if (nmhdr.0==list1):slist=0 if (nmhdr.0==list2):slist=1 sel_listview slist start=-1:s="" repeat -1 listget chk,start,0,2 if chk=-1 : break listget s,chk,5,0 snum.t=chk sel.t=""+s t++ start=chk loop } return *del if(callbkarg(0)==list1):slist2=0 if(callbkarg(0)==list2):slist2=1 if slist2==slist:return t=0 foreach snum sel_listview slist2 listadd max.slist2,sel.t,0 max.slist2=stat+1 sel_listview slist listdel (snum.cnt)-t t++ loop return



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