|
|
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では実装されておらず、
ドラッグを検出できてドロップを検出できない状態にあります。
どうしたらいいんでしょうか?
|
|
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
|
|
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
| |
|