Kpanさんが言われている様に
リストボックスのウィンドウスタイルにLBS_NOINTEGRALHEIGHTを
追加すればサイズ優先のリストボックスが使えると思ったのですが
作成後ではスタイル変更が上手く出来ない様なので自作してみました。
直接的なスタイル変更手段があるのなら誰か教えてください(汗)
; サイズ優先のリストボックス
#module
#include "user32.as"
#define GWL_STYLE $FFFFFFF0
#define LBS_NOINTEGRALHEIGHT $00000100
#define LB_ADDSTRING $00000180
#define LB_GETCURSEL $00000188
#define LB_SETCURSEL $00000186
#define LB_RESETCONTENT $00000184
#define WS_CHILD $40000000
#define WS_VISIBLE $10000000
#define WS_VSCROLL $00200000
#define WS_EX_CLIENTEDGE $00000200
#define WM_SETFONT $00000030
#define WM_SETREDRAW $0000000B
#deffunc LB_Add int _ID , var _Text
notesel _Text
sendmsg lb_hwnd(_ID) , WM_SETREDRAW , 0 , 0
repeat notemax
noteget dat , cnt
sendmsg lb_hwnd(_ID) , LB_ADDSTRING , 0 , varptr(dat)
loop
sendmsg lb_hwnd(_ID) , WM_SETREDRAW , 1 , 0
noteunsel
return
;-----------------------------------------------;
; ListBoxEx p1, p2, p3, p4 ;
; p1=最初に選択するインデックス ;
; p2,p3=リストボックスのXYサイズ ;
; p4=リストボックスの内容を示す文字列 ;
; statにオブジェクトIDが返る ;
;-----------------------------------------------;
#deffunc ListBoxEx int _index , int _xsize , int _ysize , var _Text
mref BMSCR , 67
sysfont 17 : font_hwnd = BMSCR(38) ;HSPオブジェクト用のフォントハンドル
; oncmdを使ったメッセージ処理を行いたいならwin_styleにLBS_NOTIFY($1)を追加して下さい
win_style = WS_CHILD|WS_VISIBLE|WS_VSCROLL|LBS_NOINTEGRALHEIGHT
winobj "ListBox" , "" , WS_EX_CLIENTEDGE , win_style , _xsize , _ysize , 0 , 0
lb_ID = stat
lb_hwnd(lb_ID) = objinfo(lb_ID , 2)
sendmsg lb_hwnd(lb_ID) , WM_SETFONT , BMSCR(38) , 0
LB_Add lb_ID , _Text
sendmsg lb_hwnd(lb_ID) , LB_SETCURSEL , _index , 0
return lb_ID
;-----------------------------------------------;
; LB_SetText p1, p2 ;
; p1=オブジェクトID ;
; p2=変更する内容の入った文字列 ;
;-----------------------------------------------;
#deffunc LB_SetText int _ID , var _Text
sendmsg lb_hwnd(_ID) , LB_RESETCONTENT , 0 , 0
LB_Add _ID , _Text
return
;-----------------------------------------------;
; val = LB_GetIndex(p1) ;
; p1=オブジェクトID ;
;-----------------------------------------------;
#defcfunc LB_GetIndex int _ID
sendmsg lb_hwnd(_ID) , LB_GETCURSEL , 0 , 0
ref = stat
if ref = -1 : ref = 0
return ref
#global
;---------- サンプル ----------
#include "obj.as"
buf = "00\n01\n02\n03\n04\n05\n06\n07\n08\n09"
notesel buf
button gosub "change" , *change
mes "オリジナル"
objsize 200 , 68
listbox a , 0 , buf : id1 = stat
mes "拡張リストボックス"
ListBoxEx 0 , 200 , 68 , buf ;リストボックス作成
id2 = stat
repeat
; LB_GetIndex()で選択しているインデックスを取得
; (存在しないIDを指定するとエラー)
title "選択中 = "+a+" "+LB_GetIndex(id2)
wait 10
loop
stop
*change
color 255 , 255 , 255 : boxf
sysfont 0
color 0 : pos 0 , 24
mes "左=オリジナル"
mes "右=拡張リストボックス"
size1 = 200 , 480 , 240 , 0
resizeobj id1 , size1 , 0
size2 = 200 , 480 , 440 , 0
resizeobj id2 , size2 , 0
buf2 = ""
repeat 50
buf2 = buf2 + strf("%04d" , cnt) + "\n"
loop
objprm id1 , buf2
LB_SetText id2 , buf2 ;objprmと同じ使い方
return
容量削減の為、多少オリジナルと違う挙動になっていますが
(内容変更後の選択位置が違う、リストボックス作成後にsysfont 17が適用されている等)
基本的にはlistboxと同じ使い方が出来ると思います。