|
 |
|
2019/9/23(Mon) 00:58:47|NO.88493
リストボックスには、フォントを設定しています。
このリストボックスで一番長い項目に横スクロールを設定したい。
HSPでリストボックスの横スクロールの設定方法を教えてほしいです。
#include "Gdi32.as"
#include "User32.as"
//--------------------------------------
// 記号定数(API定数)
//--------------------------------------
#const global NULL 0
#const global GWL_STYLE $FFFFFFF0
#const global WS_HSCROLL $00100000
#const global WS_VSCROLL $00200000
#
#const global SWP_NOSIZE $00000001
#const global SWP_NOMOVE $00000002
#const global SWP_NOZORDER $00000004
#const global SWP_FRAMECHANGED $00000020
//--------------------------------------
// メイン部
//--------------------------------------
*Init
sdim sListBuff
dim nListPos
*Main
screen 0,640,480,SCREEN_NORMAL|SCREEN_FIXEDSIZE
objmode 2:font MSGOTHIC,12
objsize ginfo_winX,ginfo_winY
listbox nListPos,0,sListBuff
hWndList=objinfo_hwnd(stat)
GetWindowLong hWndList,GWL_STYLE
SetWindowLong hWndList,GWL_STYLE,stat|WS_HSCROLL|WS_VSCROLL
SetWindowPos hWndList,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED
stop
#const global LB_SETHORIZONTALEXTENT $00000194
↑
これが関係するのはわかるのですが、どう設定すれば良いのでしょうか?

| |
|
2019/10/2(Wed) 02:00:51|NO.88557
LB_SETHORIZONTALEXTENTとSetScrollInfoでスクロールは出来るけど
HSP側が処理してないのでバーがSetScrollInfoで設定した位置に戻ってしまう
コールバック使えば出来るけど・・・
後は項目の追加等は自前でやる事になるけどwinobjでリストボックスを作るか・・・
リストボックスに水平スクロールバー表示
http://lhsp.s206.xrea.com/hsp_object4.html#6
リンク先のスクリプトの
> GetStockObject 17
> hFont = stat
この部分を
mref bm,67
hFont = bm(38)
って、やると現在のウィンドウに設定されてるフォントで
リストが描画されてサイズ計算にも適用される
|
|
2019/10/4(Fri) 20:10:14|NO.88577
コールバック用モジュールを使って水平スクロールさせるモジュール
リストボックス上でマウスカーソルが動くとawait等が設定時間に関係なく抜けるので
割り込みが発生しても抜けないawait2のモジュールも追加
///////////コールバック用モジュールを使用する事が前提のモジュール/////////////
//// コールバック用モジュールは
//// http://hsp.tv/play/pforum.php?mode=pastwch&num=62130
//// このスレッドの NO.68768 モジュールに NO.68817 の修正を加えたものを対象にしています。
//// 使用する場合は必ずコールバック用モジュールを先にインクルードしてください。
/////////////////////////////////////////////////////////////////////////
#module "mod_LB_HSCROLL"
#uselib "GDI32.dll"
#func SelectObject "SelectObject" int,int
#func GetTextExtentPoint32 "GetTextExtentPoint32A" int,sptr,int,var
#cfunc GetStockObject "GetStockObject" int
#uselib "user32.dll"
#func SetWindowLong "SetWindowLongA" int,int,int
#cfunc GetWindowLong "GetWindowLongA" int,int
#cfunc DefWindowProc "DefWindowProcA" int,int,int,int
#cfunc CallWindowProc "CallWindowProcA" int,int,int,int,int
#func GetClientRect "GetClientRect" int,var
#func SetScrollInfo "SetScrollInfo" int,int,var,int
#func GetScrollInfo "GetScrollInfo" int,int,var
#func SetWindowPos "SetWindowPos" int,int,int,int,int,int,int
#define TEMP_BUFFER 100 //一時的にフォントを設定するバッファID
#deffunc setLBHscroll int lbid
sel_id=ginfo_sel
_hWndLB=objinfo_hwnd(lbid)
if vartype(ItemString)=4 {
newclbk3 clbkptr,4,*listbox_prdc
defmesboxproc=GetWindowLong(_hWndLB,$FFFFFFFC)//GWL_WNDPROC
sdim ItemString,1024*4
hstr="@" //半角のサイズ取得用文字
dim tagSIZE,2
dim rect,4
buffer TEMP_BUFFER,1,1
gsel sel_id
}
hWndLB(lbid)+0
if _hWndLB ! hWndLB(lbid) {
hWndLB(lbid)=_hWndLB
SetWindowLong _hWndLB,$FFFFFFF0,GetWindowLong(_hWndLB,$FFFFFFF0) | $00100000|0x0100//WS_HSCROLL追加
SetWindowLong _hWndLB,-21,lbid //IDをGWL_USERDATAに設定
SetWindowLong _hWndLB,$FFFFFFFC,clbkptr
}
SetWindowPos _hWndLB,0,0,0,0,0,39 //39=SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED
await 0 //一度OSにタスクを渡さないとobjmode 1で作られた物はWM_GETFONTで0が返る
GetClientRect _hWndLB,rect
lb_xsize=(rect(2)-rect(0)) //文字が描画される範囲
nPage=int(1.0*lb_xsize/1.5) //ページサイズ
sendmsg _hWndLB, 0x018b//LB_GETCOUNT
count=stat
sendmsg _hWndLB, 0x0031//WM_GETFONT
hfont=stat
gsel TEMP_BUFFER
if hfont=0 {
sysfont 0
}else{
SelectObject hdc, hFont
hFont_b=stat
}
GetTextExtentPoint32 hdc, hstr, 1, tagSIZE
hsize=tagSIZE//半角サイズ
MaxSize=hsize
if count>0 {
repeat count
sendmsg _hWndLB,0x0189, cnt, varptr(ItemString)// LB_GETTEXT
GetTextExtentPoint32 hdc, ItemString, strlen(ItemString), tagSIZE
if tagSIZE > MaxSize { MaxSize = tagSIZE }
loop
sendmsg _hWndLB,$00000194, MaxSize, 0// LB_SETHORIZONTALEXTENT
}
if hFont=0 {SelectObject hdc, hFont_b}
gsel sel_id
SCROLLINFO = 7*4,23,0,MaxSize-1,lb_xsize,0,0 //23=(SIF_RANGE or SIF_PAGE or SIF_POS or SIF_TRACKPOS);
SetScrollInfo _hWndLB, 0 , SCROLLINFO , 1 //スクロールバー各種設定再描画
hscloll_data(lbid*9)=-hsize,hsize,-nPage,nPage,0,0,-MaxSize,MaxSize,(GetWindowLong(_hWndLB,$FFFFFFF0)&0x00200000)>0 //WS_VSCROLLが設定されていたら1
return
*listbox_prdc
dupptr msg,lparam,wparam*4,4
if msg(1)=$114 {//WM_HSCROLL
SB=msg(2) & $FFFF
if SB<9 {
dup hscloll_data_dup,hscloll_data(GetWindowLong(msg,-21)*9)//設定してるGWL_USERDATAをキーにデータ選択
GetScrollInfo msg, 0 , SCROLLINFO
on SB goto *_LINELR_PLR_LR, *_LINELR_PLR_LR, *_LINELR_PLR_LR, *_LINELR_PLR_LR, *_THUMB_POS_TRACK, *_THUMB_POS_TRACK, *_LINELR_PLR_LR, *_LINELR_PLR_LR, *_ENDSCROLL
*_THUMB_POS_TRACK
hscloll_data_dup(SB)=((msg(2) >> 16) & $FFFF)-SCROLLINFO(5)
*_LINELR_PLR_LR
SCROLLINFO(5)+hscloll_data_dup(SB)
SetScrollInfo msg, 0 , SCROLLINFO , 1
goto *@f
*_ENDSCROLL
GetScrollInfo msg, 0 , SCROLLINFO
}
}else{
if msg(1)=0x020A {//WM_MOUSEWHEEL
dup hscloll_data_dup,hscloll_data(GetWindowLong(msg,-21)*9)//設定してるGWL_USERDATAをキーにデータ選択
if hscloll_data_dup(8)=0 {//WS_VSCROLLが設定されてない
GetScrollInfo msg, 0 , SCROLLINFO
SCROLLINFO(5)+=hscloll_data_dup(msg(2)<0)*3//三つ分スクロール
SetScrollInfo msg, 0 , SCROLLINFO , 1
}
}
}
*@f
return CallWindowProc(defmesboxproc,msg,msg(1),msg(2),msg(3))
#deffunc LBHscroll_end onexit
clrobj //ウィンドウプロシージャを差し替えてる場合終了前に戻すか削除が必要
return
#global
#module "mod_AWAIT2"
#uselib "winmm.dll"
#cfunc timeGetTime "timeGetTime"
#deffunc await2 int w
if await2_f=0 {
await2_f=1
st=timeGetTime()
_w=w
}else{
nt=timeGetTime()
_w=w-(nt-st)
st=nt
}
repeat
await _w
nt=timeGetTime()
_w-=nt-st
st=nt
if _w<=0 {break}
loop
return
#global
//--------------------------------------
// メイン部
//--------------------------------------
*Init
sdim sListBuff
dim nListPos
*Main
screen 0,640,480,SCREEN_NORMAL|SCREEN_FIXEDSIZE
objmode 2:font MSGOTHIC,20
objsize ginfo_winX,ginfo_winY/3
sListBuff={"カレントポジションにオブジェクトとして、リストボックスを配置します。
リストボックスは、複数の文字列要素の中から1つを選択させることのできる入力オブジェクトです。
オブジェクトの大きさは、objsize命令で設定した大きさになります。
ただし、p2パラメータで選択時のリスト表示のためのYサイズを指定しなければなりません。
(通常は100〜150程度が適当です)"}
listbox nListPos,0,sListBuff
lb_id=stat
setLBHscroll lb_id //リストボックスのアイテムを更新したら実行
objsize ginfo_winX,32
button goto "上のリストボックスに項目追加",*_addlist
addstr="追加する項目"
input addstr,ginfo_winX,32,250
ip_id=stat
mes
objsize ginfo_winX,ginfo_winY/3
objmode 0
sListBuff(1)=""
listbox nListPos(1),0,sListBuff(1)
lb_id(1)=stat
sListBuff(1)={"button命令やinput,mesbox命令などで画面上に配置したオブジェクトの持つ内容やパラメータを変更します。
p1には、オブジェクトIDを指定します。オブジェクトIDは、 0から順番に画面上に表示したオブジェクト1つ1つに割り当てられていく番号です。
オブジェクトIDは、オブジェクトを配置する命令実行後にシステム変数statに代入されています(通常置いた順番に0,1,2…の番号が割り当てられます)。
ここで指定されたオブジェクトをp2で指定したパラメータで変更します。
p2で指定するパラメータはオブジェクトの種類によって異なります。オブジェクトによって、文字列を指定するものや、数値を指定するものが分かれています。詳細は下の表を参照してください。"}
objprm lb_id(1),sListBuff(1)
setLBHscroll lb_id(1) //リストボックスのアイテムを更新したら実行
repeat
redraw 0
color 255,255,255
boxf 0,400,640,480
color
pos 0,400
mes "lb_id(0)"
pos 90,395
mes nListPos
notesel sListBuff
noteget it,nListPos
mes it
pos 0,440
mes "lb_id(1)"
pos 90,440
mes nListPos(1)
notesel sListBuff(1)
noteget it,nListPos(1)
mes it
redraw 1
await2 100
loop
stop
*_addlist
if addstr ! "" {
sListBuff+="\n"+addstr
objprm lb_id,sListBuff
setLBHscroll lb_id //リストボックスのアイテムを更新したら実行
}
stop
winobjの方がリストボックスが本来持ってる機能も使えるし
スクロールに関しては何もする必要なくて楽だったかも・・・

| |
|
2019/10/4(Fri) 20:33:24|NO.88578
暇人さん。
回答ありがとうございます。
> winobjの方がリストボックスが本来持ってる機能も使えるし
> スクロールに関しては何もする必要なくて楽だったかも・・・
これは、どのような意味でしょうか?
listbox命令で作成すると複雑化するので、
winobj命令でリストボックスを作成したほうが良いということですか?
|
|
2019/10/4(Fri) 21:04:07|NO.88580
>winobj命令でリストボックスを作成したほうが良いということですか?
スクロール量の算出とか色々手探りでやったので・・・
その辺自動でやってくれるwinobjの方が楽かもと
もうスクロールは出来るようになったので
後は、標準命令のリストボックスじゃ出来ない
機能が必要かどうかかな(複数選択やソートとか)
|
|
2019/10/5(Sat) 15:19:32|NO.88585
本題とは関係ないけど NO.88577 の間違い修正
> button goto "上のリストボックスに項目追加",*_addlist
を
button gosub "上のリストボックスに項目追加",*_addlist
に置き換え
最終行の
>stop
を
return
に置き換え
で、下のはwinobjを使ったリストボックスの項目更新等簡単に出来るようにモジュールにしたやつ
モジュールmod_LISTBOXEXで追加される命令、マクロ
>listboxEx p1,p2,p3,style [水平スクロールが設定されてるリストボックスを表示]
>addLBstring lbid, string, lbi, opt [リストボックスの項目更新]
>LB_DBLCLK_TEXT [リストボックスがダブルクリックされた時に項目の文字列が代入される変数]
>LB_GOSUB_WM_COMMAND [WM_COMMANDの割り込みもを他でも使いたいときに使用]
#module "mod_LISTBOXEX"
#uselib "GDI32.dll"
#func SelectObject "SelectObject" int,int
#func GetTextExtentPoint32 "GetTextExtentPoint32A" int,sptr,int,var
#cfunc CreateFontIndirect "CreateFontIndirectA" var
#func DeleteObject "DeleteObject" sptr
#uselib "user32.dll"
#func SetWindowLong "SetWindowLongA" int,int,int
#cfunc GetWindowLong "GetWindowLongA" int,int
#func SetWindowPos "SetWindowPos" int,int,int,int,int,int,int
#func GetwindowRect "GetWindowRect" int,var
// [リストボックスがダブルクリックされた時に項目の文字列が代入される変数]
#define global LB_DBLCLK_TEXT lbitext@mod_LISTBOXEX
// [WM_COMMANDの割り込みもを他でも使いたいときに使用するラベルの下に配置する事でlistboxExの処理もされる]
#define global LB_GOSUB_WM_COMMAND gosub *OnCommand@mod_LISTBOXEX
// [リストボックスの項目更新]
//addLBstring lbid, string, lbi, opt
// lbid =ID : listboxExの使用時に取得出来るID
// string=文字列型変数 : 更新する項目
// lbi =-1〜(-1) : 一つだけ挿入か上書きするときのインデックス、省略または-1で全てstringの内容で更新
// opt =0〜1(0) : 0=挿入、1=上書き
#define global addLBstring(%1,%2,%3=-1,%4=0) _addLBstring %1,%2,%3,%4
#deffunc _addLBstring int lbid,var string,int lbi,int opt
if addstring_f=0 {
addstring_f=1
sdim ItemString,4096
}
_hWndLB = objinfo(lbid, 2)
sendmsg _hWndLB, 0x0031//WM_GETFONT
hfont=stat
dim tagSIZE,2
SelectObject hdc, hFont
hFont_b=stat
hstr="@"
GetTextExtentPoint32 hdc, hstr, 1, tagSIZE
hsize=tagSIZE//半角サイズ
MaxSize=hsize
if lbi<0 {
sendmsg _hWndLB, $0184, 0, 0//LB_RESETCONTENT
notesel string
count=notemax
if count>0 {
repeat count
noteget ItemString,cnt
sendmsg _hWndLB, 0x0180, 0, ItemString//LB_ADDSTRING
GetTextExtentPoint32 hdc, ItemString, strlen(ItemString), tagSIZE
if tagSIZE > MaxSize { MaxSize = tagSIZE }
loop
}
noteunsel
}else{
if opt=1 {sendmsg _hWndLB, $0182, lbi, 0}//LB_DELETESTRING
if string!"" or opt=0 {
sendmsg _hWndLB, $0181, lbi, string//LB_INSERTSTRING
if string="" and opt=0{
SelectObject hdc, hFont_b
return
}
}
sendmsg _hWndLB, $018B, 0, 0//LB_GETCOUNT
count=stat
repeat count
sendmsg _hWndLB,0x0189, cnt, varptr(ItemString)// LB_GETTEXT
GetTextExtentPoint32 hdc, ItemString, strlen(ItemString), tagSIZE
if tagSIZE > MaxSize { MaxSize = tagSIZE }
loop
}
SelectObject hdc, hFont_b
sendmsg _hWndLB,$00000194, MaxSize, 0// LB_SETHORIZONTALEXTENT
return
// [水平スクロールが設定されてるリストボックスを表示( フォントは現在のウィンドウに設定されてる物が使用される)]
//listboxEX p1,p2,p3,style
// p1=変数 : リストボックスの状態を保持する数値型変数(内容が-1なら非選択、0以上なら項目を選択状態)
// p2=0〜(100) : 拡張Yサイズ(標準のlistboxと縦サイズが異なります)
// p3=文字列型変数 : リストボックスの内容を示す文字列
// style=ウィンドウスタイル : 追加するウィンドウスタイル
#define global listboxEx(%1,%2=-1,%3,%4=0) _listboxEx %1,%2,%3,%4
#deffunc _listboxEx var p1,int p2,var p3,int style
LB_DBLCLK_TEXT=""
//$50300101=WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | LBS_NOTIFY | LBS_NOINTEGRALHEIGHT
winobj "listbox", "", 0x00000200/*WS_EX_CLIENTEDGE*/, $50300101 | style, , , 100, 0
id=stat
_hWndLB = objinfo(id, 2)
lbpos_ptr(id)=varptr(p1)
dim rect,4
GetWindowRect _hWndLB,rect
if p2<0 {addy=100}else{addy=p2}
SetWindowPos _hWndLB,0,0,0,rect(2)-rect(0),rect(3)-rect(1)+addy,6//SWP_NOMOVE|SWP_NOZORDER
pos ginfo_cx,ginfo_cy+addy
lb_no=-1
lbid_hlist(id)+0
if lbid_hlist(id) {
repeat lb_cnt
if lbcnt_idlist(cnt)=id {lb_no=cnt:break}
loop
}
lbid_hlist(id)=_hWndLB
if lb_no<0 {
lbcnt_hlist(lb_cnt)=_hWndLB
lbcnt_idlist(lb_cnt)=id
lb_cnt++
}else{
lbcnt_hlist(lb_no)=_hWndLB
lbcnt_idlist(lb_no)=id
}
mref bm,67
f_no=-1
repeat f_cnt
if hspfcnt_hlist(cnt)=bm(38) {//既に登録されてる
hFont=lbfcnt_hlist(cnt) //既に作られたLB用フォントを利用
f_no=cnt
break
}
loop
if f_no<0 {
hspfcnt_hlist(f_cnt)=bm(38)//hspウィンドウのフォントハンドルを登録
hFont = CreateFontIndirect(bm(49))//hspウィンドウのフォントを元にLB用フォントを作成
lbfcnt_hlist(f_cnt)=hFont
f_cnt++
}
sendmsg _hWndLB, 0x0030, hFont//WM_SETFONT
addLBstring id,p3
if style&$800{
sendmsg _hWndLB,$0185,1, p1// LB_SETSEL
}else{
sendmsg _hWndLB,$0186, p1, 0// LB_SETHORIZONTALEXTENT
}
oncmd gosub *OnCommand, $111//WM_COMMAND
return id
//選択が動いた時とダブルクリックされた時の処理
*OnCommand
repeat lb_cnt
if lbcnt_hlist(cnt)=lParam {
lbn=((wParam >> 16) & $FFFF)
on lbn goto *@f,*_SELCHANGE,*_DBLCLK
goto *@f
*_SELCHANGE
dupptr lb_i_dup,lbpos_ptr(lbcnt_idlist(cnt)),4,4
sendmsg lParam, $0188, 0, 0//LB_GETCURSEL
lb_i_dup=stat
break
goto *@f
*_DBLCLK
sendmsg lParam, $018A, lb_i_dup, 0//LB_GETTEXTLEN
sdim lbitext,stat+1
sendmsg lParam, $0189, lb_i_dup, varptr(lbitext) //LB_GETTEXT
*@
break
}
loop
return
#deffunc LISTBOXEX_end onexit
repeat f_cnt
DeleteObject lbfcnt_hlist(cnt)
loop
return
#global
#module "mod_AWAIT2"
#uselib "winmm.dll"
#cfunc timeGetTime "timeGetTime"
#deffunc await2 int w
if await2_f=0 {
await2_f=1
st=timeGetTime()
_w=w
}else{
nt=timeGetTime()
_w=w-(nt-st)
st=nt
}
repeat
await _w
nt=timeGetTime()
_w-=nt-st
st=nt
if _w<=0 {break}
loop
return
#global
sdim sListBuff
dim nListPos
font msgothic,24
objsize 500,100
sListBuff={"カレントポジションにオブジェクトとして、リストボックスを配置します。
リストボックスは、複数の文字列要素の中から1つを選択させることのできる入力オブジェクトです。
オブジェクトの大きさは、objsize命令で設定した大きさになります。
ただし、p2パラメータで選択時のリスト表示のためのYサイズを指定しなければなりません。
(通常は100〜150程度が適当です)"}
nListPos=1
listboxEx nListPos,50,sListBuff
lb_id=stat
objmode 2
objsize 500,32
button gosub "現在の選択位置に挿入する",*_addlist
addstr="上のリストボックスに項目追加"
input addstr,500,32,250
ip_id=stat
repeat
redraw 0
color 255,255,255
boxf
color
pos 10,300
mes nListPos
mes LB_DBLCLK_TEXT
redraw 1
await2 100
loop
stop
*_addlist
stick stk,64 //Ctrlを押しながらだと上書きされる(文字が入ってない場合は項目が削除される)
addLBstring lb_id,addstr,nListPos,stk=64 //リストボックスに項目操作
return

| |
|
2019/10/5(Sat) 17:11:01|NO.88586
暇人さん。
> で、下のはwinobjを使ったリストボックスの項目更新等簡単に出来るようにモジュールにしたやつ
> モジュールmod_LISTBOXEXで追加される命令、マクロ
再びモジュールのサンプルをありがとうございます。
どうやらlistbox命令よりもwinobj命令を使ってリストボックスを設置したほうが良さそうですね。
HSPではリストボックスの選択位置しかわからず、
選択やダブルクリックなどの変化を検出するには、
WM_COMMANDメッセージで取得することになりますね。
できればHSPの標準機能で選択時、ダブルクリック時にラベルにジャンプできるようにして欲しいです。
listboxEx p1,p2,p3,p4
p1=変数
p2=0〜(100)
p3="string"
p4=*label
↑
こんな感じです。
選択時、ダブルクリック時に p4 のラベルにジャンプして、
iParam=0で選択時
iParam=1でダブルクリック時
を切り分けが出来る感じです。
こちらも上記のモジュールを試作してみます。
完成したらサンプルを載せますので
しばらくは解決チェックを押しませんね。
以上。
|
|
2019/10/6(Sun) 20:43:21|NO.88601
>選択時、ダブルクリック時に p4 のラベルにジャンプして、
項目には文字列とは別に4バイトのデータが設定できるので
ラベルを数値として登録すれば楽かも(ラベルの入ってる変数のポインタを使うのも有りだけど・・・)
自分ならこうやるかな・・・
#module "mod_LISTBOXEX"
#const global LISTBOXEX_WM_APP $8111 //LISTBOXEX用プライベートメッセージ
#define global LBITEM_LABEL lb_label_dup@mod_LISTBOXEX //項目にラベルが登録されてる時にLISTBOXEX_WM_APP送信時にラベルが代入されている
#uselib "user32.dll"
#func PostMessage "PostMessageA" sptr,sptr,sptr,sptr
#define global listboxEx(%1,%2=-1,%3,%4=tempvar@mod_LISTBOXEX,%5=0) _listboxEx %1,%2,%3,%4,%5
#deffunc listboxEx var p1,int p2,var p3,array l_list,int style
winobj "listbox", "", 0x00000200/*WS_EX_CLIENTEDGE*/, $50300101 |style, , , 100, 0
id=stat
_hWndLB = objinfo(id, 2)
notesel p3
count=notemax
if count>0 {
if vartype(l_list)=1 {l_count =length(l_list)}else{l_count=0}
repeat count
noteget ItemString,cnt
sendmsg _hWndLB, 0x0180, 0, ItemString//LB_ADDSTRING
if cnt<l_count {dupptr labeladr_dup,varptr(l_list(cnt)),4,4}else{dupptr labeladr_dup,varptr(zero),4,4}//ラベルが無ければ0を設定
sendmsg _hWndLB, $019A, cnt, labeladr_dup//LB_SETITEMDATA ラベルを数値化して項目データに設定(ラベルが入ってる変数のポインタでは無い)
loop
}
noteunsel
oncmd gosub *OnCommand, $111//WM_COMMAND
return id
//選択が動いた時とダブルクリックされた時の処理
*OnCommand
if lParam=_hWndLB {
lbn=((wParam >> 16) & $FFFF)
on lbn goto *@f,*_SELCHANGE,*_DBLCLK
goto *@f
*_SELCHANGE
sendmsg lParam, $0188, 0, 0//LB_GETCURSEL
lb_i=stat
sendmsg lParam, $0199, lb_i, 0//LB_GETITEMDATA ラベルアドレスを取得
if stat {
lb_iladr=stat
dupptr lb_label_dup,varptr(lb_iladr),4,1 //ラベルアドレスが入ってる変数をラベル変数へクローン化
PostMessage hwnd, LISTBOXEX_WM_APP, 0, lb_i
}
return
*_DBLCLK
sendmsg lParam, $0199, lb_i, 0//LB_GETITEMDATA ラベルアドレスを取得
if stat {
lb_iladr=stat
dupptr lb_label_dup,varptr(lb_iladr),4,1 //ラベルアドレスが入ってる変数をラベル変数へクローン化
PostMessage hwnd, LISTBOXEX_WM_APP, 1, lb_i //現在の割り込みを抜けてからメッセージ処理される
}
*@
}
return
#global
label_list=*_A,*_B,*_C //3行だけ設定
sListBuff={"カレントポジションにオブジェクトとして、リストボックスを配置します。
リストボックスは、複数の文字列要素の中から1つを選択させることのできる入力オブジェクトです。
オブジェクトの大きさは、objsize命令で設定した大きさになります。
ただし、p2パラメータで選択時のリスト表示のためのYサイズを指定しなければなりません。
(通常は100〜150程度が適当です)"}
objsize 500,100
listboxEx p1, 0, sListBuff, label_list
oncmd gosub *_OnApp, LISTBOXEX_WM_APP //項目選択、ダブルクリックされた時にジャンプする
stop
*_OnApp
//LBITEM_LABELにラベル、lParamにインデックス、wParamにはダブルクリックの有無
gosub LBITEM_LABEL
return
*_A
if wParam {
title "*_A:ダブルクリック"+" "+lParam
}else{
title "*_A:シングルクリック"+" "+lParam
}
return
*_B
if wParam {
title "*_B:ダブルクリック"+" "+lParam
}else{
title "*_B:シングルクリック"+" "+lParam
}
return
*_C
if wParam {
title "*_C:ダブルクリック"+" "+lParam
}else{
title "*_C:シングルクリック"+" "+lParam
}
return
NO.88585のモジュールへある程度楽に移植出来る感じにしてみた

| |
|
2019/10/6(Sun) 23:22:41|NO.88602
> 項目には文字列とは別に4バイトのデータが設定できるので
これはリストボックスの32ビットデータのことでしょうか?
> ラベルを数値として登録すれば楽かも(ラベルの入ってる変数のポインタを使うのも有りだけど・・・)
LB_GETITEMDATAに登録するのは、ラベルのアドレスですか?
ソースを見るとリストボックスの1つの項目につき、1つのラベルにジャンプするようですね。
こちらの使い方は、クリップボードの履歴一覧を
シングルクリックしたら一覧の隣にテキスト内容を表示、
ダブル・クリックしたら選択項目をクリップボードにコピーを行う。
↑
このような使い方や、ランチャーのページ切り替えに
リストボックスのページ一覧を選択するとランチャーボタンが変化、
ダブルクリックするとページ一覧の項目テキスト修正を行う。
↑
このような使い方になります。
よって、こちらが今、試作中のモジュールは、ジャンプルするラベルは1つで、
p1=変数で処理分岐、wParamで選択、ダブルクリックを切り分けする感じですね。
|
|
2019/10/7(Mon) 22:26:32|NO.88604
>これはリストボックスの32ビットデータのことでしょうか?
それです。
>LB_GETITEMDATAに登録するのは、ラベルのアドレスですか?
ラベルのアドレスなのかラベルを識別する数値なのかは分からないけどアドレスかな・・・
>よって、こちらが今、試作中のモジュールは、ジャンプルするラベルは1つで、
それならNO.88585のモジュールはそのままで
oncmdを$111で割り込み設定する手もある
//NO.88585のモジュールを使用
#uselib "user32.dll"
#func global ScreenToClient "ScreenToClient" int,var
#include "hspext.as"
mesListBuff={"
p1=変数 : リストボックスの状態を保持する数値型変数
p2=0〜(100) : 拡張Yサイズ
p3="strings" : リストボックスの内容を示す文字列
"},{"
p1=0〜(0) : オブジェクトフォント設定モード指定
p2=0〜1 : フォーカス移動キー指定(0=OFF/1=ON)
"},{"
p1=0〜(0) : オブジェクトID指定
p2 : 変更するパラメータの内容
"}
font msgothic,24
sListBuff={"listbox p1,p2,p3
objmode p1,p2
objprm p1,p2"}
objsize 150,200
nListPos=-1
listboxEx nListPos,50,sListBuff
lb_id=stat
hWndLB = objinfo(lb_id, 2)
oncmd gosub *OnCommand, $111//WM_COMMAND
stop
*OnCommand
if lParam=hWndLB {
lbn=((wParam >> 16) & $FFFF)
on lbn goto *@f,*_SELCHANGE,*_DBLCLK
goto *@f
*_SELCHANGE
color 255,255,255
boxf
color
pos 200,50
sendmsg lParam, $0188, 0, 0//LB_GETCURSEL
if stat>=0 {mes mesListBuff(stat)}
goto *@f
*_DBLCLK
mspxy=ginfo_mx,ginfo_my
ScreenToClient lParam,mspxy
sendmsg lParam, $01A9,0, mspxy|((mspxy(1))<<16)//LB_ITEMFROMPOINT
if ((stat >> 16) & $FFFF)=1{return}//クリック時リスト外だった
clipset mesListBuff(stat & $FFFF) //クリップボードテキスト転送 (stat & $FFFF)=マウスカーソルに一番近い項目のインデックスが入ってる
*@
LB_GOSUB_WM_COMMAND //nListPosを使用しないなら必要ない
title ""+nListPos+" "+LB_DBLCLK_TEXT
}
return

| |
|