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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0923
科学太郎リストボックスの横スクロールの設定方法は?9未解決


科学太郎

リンク

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



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