extabctl.as [タブコントロールモジュール]
;*******************************************************************************
; (extabctl.as) for HSP3.0 タブコントロール関連モジュール by さくら さん
; modified by abo 2007.09.20
;
; #include する必要なプラグインやマクロファイル
; #include "sysval.as"
; #include "gblconst.as"
; #include "winapi32.as"
;
; ※下記のlibraryは、winapi32.asにまとめてあります。
;
; #include "user32.as"
; #include "comctl32.as"
;
; ※モジュール番号の左側に'*'が付いているものは、ユーザー定義関数です。
; それ以外のものは、モジュール命令となっています。
;
;-------------------------------------------------------------------------------
;
;* 1. タブコントロールを作成 (Createtabctl)
; 2. タブコントロールウィンドウの設定 (tabchild)
; 3. タブコントロールウィンドウに項目追加 (tabadditem)
; 4. タブコントロール選択インデックスの削除 (tabdelete)
;* 5. タブコントロール選択タブのアイテム取得 (Tabselget)
; 6. タブコントロール選択タブのアイテム設定 (tabselset)
; 7. タブコントロール選択タブ文字列の変更 (tabstrchg)
;* 8. タブコントロール項目数の取得 (Tabgetnum)
; 9. タブコントロールスタイルの設定 (tabstyleset)
;
; 最終更新日 2005.06.06 sakura
;*******************************************************************************
#ifdef __hsp30__
#ifndef __EXTABCTL__
#define __EXTABCTL__
#module "extabctl"
#defcfunc Createtabctl int prm1,int prm2,int prm3,int prm4,int prm5
;*******************************************************************************
; タブコントロールを作成 (Createtabctl)
;
; 戻り値 : 成功 htabwnd=タブコントロールハンドル, 失敗 htabwnd<=0
;
; ・書式 htabwnd=Createtabctl(Style,nPosx,nPosy,nWidth,nHeight)
; ・引数 Style (int) : 0〜9(0) スタイルモード
; nPosx (int) : 0〜winx(pos x) 位置 x
; nPosy (int) : 0〜winy(pos y) 位置 y
; nWidth (int) : 0〜winx(objsize x) 幅
; nHeight (int) : 0〜winy(objsize y) 高さ
;
; Style設定番号
; -------------------------------------
; 0 : 0 デフォルトスタイル
; 1 : 1 対向スクロールスタイル
; 2 : 2 タブ下側(右側)スタイル
; 3 : 8 フラットボタンスタイル
; 4 : $40 ホットテキストスタイル
; 5 : $80 縦型スタイル
; 6 : $100 ボタンスタイル
; 7 : $108 フラットボタンスタイル
; 8 : $200 複数行スタイル
; 9 : $400 固定幅スタイル
;
; ・タイプ ユーザー定義関数
;
;-- (NOTE) ---------------------------------------------------------------------
;
; (使用例)
; htabwnd=Createtabctl(0,10,10,400,320)
;*******************************************************************************
mref bmscr,67
Style = prm1 : if (Style<=0)|(Style>11) : Style =0
nPosx = prm2 : if (nPosx<=0)|(nPosx>winx) : nPosx =bmscr(27)
nPosy = prm3 : if (nPosy<=0)|(nPosy>winy) : nPosy =bmscr(28)
nWidth = prm4 : if (nWidth<=0)|(nWidth>winx) : nWidth =bmscr(29)
nHeight= prm5 : if (nHeight<=0)|(nHeight>winy) : nHeight=bmscr(30)
;CommonControl初期化
#undef ICC_TAB_CLASSES
#define ICC_TAB_CLASSES $00000008
icx(0) = 8 : icx(1) = ICC_TAB_CLASSES
InitCommonControlsEx varptr(icx)
;▼スタイル判定
switch Style
case 1 : exStyle=$548 : swbreak
case 0 : default : exStyle=$540 : swbreak
swend
; repeat 1
; if Style==0 : exStyle=0 : break
; if Style==1 : exStyle=1 : break
; if Style==2 : exStyle=2 : break
; if Style==3 : exStyle=8 : break
; if Style==4 : exStyle=$40 : break
; if Style==5 : exStyle=$80 : break
; if Style==6 : exStyle=$100 : break
; if Style==7 : exStyle=$108 : break
; if Style==8 : exStyle=$200 : break
; if Style==9 : exStyle=$400 : break
; if Style==10 : exStyle=$548 : break
; if Style==11 : exStyle=$540 : break
; loop
dwStyle= WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|TCS_TOOLTIPS|exStyle
class ="SysTabControl32" : pClass=varptr(class)
CreateWindowEx 0,pClass,0,dwStyle,nPosx,nPosy,nWidth,nHeight,hwnd,0,hinstance,0
htabwnd=stat : if htabwnd==0 : return -1
return Exobjfont(htabwnd)
#deffunc tabchild int prm1
;*******************************************************************************
; タブコントロールウィンドウの設定 (tabchild)
;
; 戻り値 : 成功 stat=0, 失敗 stat=-1
;
; ・書式 tabchild htabwnd
; ・引数 htabwnd (int) : Createtabctlで作成したハンドル (htabwnd)
; ・タイプ モジュール命令
;
;-- (NOTE) ---------------------------------------------------------------------
;
; (使用例)
; bgscr 2,,,2 : tabchild htabwnd
;*******************************************************************************
htabwnd = prm1 : if htabwnd==0 : return -1
;ウィンドウスタイル取得
GetWindowLong hwnd,GWL_STYLE : Style=stat
Style = Style&$7FFFFFFF|$40000000
;ウィンドウスタイル設定
SetWindowLong hwnd,GWL_STYLE,Style
;親ウィンドウの設定
SetParent hwnd,htabwnd
;クライアントサイズ取得
dim rc,4
GetClientRect htabwnd,varptr(rc)
;OSVERSIONINFO構造体
; dim osverinfo,148 : osverinfo(0)=148
; GetVersionEx varptr(osverinfo)
; if osverinfo(4)==2 : OsVerNT=1 : else : OsVerNT=0
; dim osverinfo,0
;システムカラー(COLOR_BTNFACE)を取得して塗り潰す
; if OsVerNT==0 {
; GetSysColor 15
; c(0) = stat & $ff
; c(1) = (stat >> 8) & $ff
; c(2) = (stat >> 16) & $ff
; col=RGB(c(0),c(1),c(2))
; }else{
; GetSysColor 15 : col=stat
; }
; CreateSolidBrush col : Brush=stat
; FillRect hdc,varptr(rc),Brush
SendMessage htabwnd,TCM_ADJUSTRECT,0,varptr(rc)
MoveWindow hwnd,rc(0),rc(1),rc(2)-rc(0),rc(3)-rc(1),0
; dim osverinfo,0
return 0
#deffunc tabadditem int prm1,str prm2,int prm3
;*******************************************************************************
; タブコントロールウィンドウに項目追加 (tabadditem)
;
; 戻り値 : 成功 stat=0, 失敗 stat=-1
;
; ・書式 tabadditem htabwnd,String,Index
; ・引数 htabwnd (int) : Createtabctlで作成したハンドル (htabwnd)
; String (str) : 追加項目名文字列 or 文字列変数
; Index (int) : 0〜(0) 項目のインデックス
; ・タイプ モジュール命令
;
;-- (NOTE) ---------------------------------------------------------------------
;
; (使用例)
; tabadditem htabwnd,"項目1",0
;*******************************************************************************
htabwnd = prm1 : if htabwnd==0 : return -1
ls=strlen(prm2) : if ls==0 : return -1
sdim String,ls+2: String=prm2
Index = prm3 : if Index<=0 : Index=0
#undef TCIF_TEXT
#define TCIF_TEXT $00000001
;TCITEM 構造体
dim tcitem,7
tcitem(0) = TCIF_TEXT
tcitem(1) = 0
tcitem(2) = 0
tcitem(3) = varptr(String)
tcitem(4) = 0
tcitem(5) = -1
tcitem(6) = 0
SendMessage htabwnd,TCM_INSERTITEM,Index,varptr(tcitem)
sdim String,0
return 0
#deffunc tabdelete int prm1,int prm2
;*******************************************************************************
; タブコントロール選択インデックスの削除 (tabdelete)
;
; 戻り値 : 成功 stat=0, 失敗 stat=-1
;
; ・書式 tabdelete htabwnd,Index
; ・引数 htabwnd (int) : Createtabctlで作成したハンドル (htabwnd)
; Index (int) : 0〜$100(0) 項目のインデックス
; ・タイプ モジュール命令
;
;-- (NOTE) ---------------------------------------------------------------------
;
; (使用例)
; tabdelete htabwnd,0
;*******************************************************************************
htabwnd = prm1 : if htabwnd==0 : return -1
Index = prm2 : if Index<=0 : Index=0
;$100を指定の場合は、現在選択されているインデックス
if Index=$100 {
SendMessage htabwnd,TCM_GETCURSEL,0,0
nIndex=stat
}else{
nIndex=Index
}
SendMessage htabwnd,TCM_DELETEITEM,nIndex,0
SendMessage htabwnd,TCM_SETCURSEL,0,0
return 0
#defcfunc Tabselget int prm1
;*******************************************************************************
; タブコントロール選択タブのアイテム取得 (tabselget)
;
; 戻り値 : 成功 ret=選択タブ項目Index, 失敗 ret=-1
;
; ・書式 ret=tabselget(htabwnd)
; ・引数 htabwnd (int) : Createtabctlで作成したハンドル (htabwnd)
; ・タイプ ユーザー定義関数
;
;-- (NOTE) ---------------------------------------------------------------------
;
; (使用例)
; ret=tabselget(htabwnd) : mes ret
;*******************************************************************************
htabwnd = prm1 : if htabwnd==0 : return -1
SendMessage htabwnd,TCM_GETCURSEL,0,0
return stat
#deffunc tabselset int prm1, int prm2
;*******************************************************************************
; タブコントロール選択タブのアイテム設定 (tabselset)
;
; 戻り値 : 成功 stat=0, 失敗 stat=-1
;
; ・書式 tabselset htabwnd,Index
; ・引数 htabwnd (int) : Createtabctlで作成したハンドル (htabwnd)
; Index (int) : 選択タブ項目
; ・タイプ モジュール命令
;
;-- (NOTE) ---------------------------------------------------------------------
;
; (使用例)
; tabselset htabwnd,0
;*******************************************************************************
htabwnd = prm1 : if htabwnd==0 : return -1
SendMessage htabwnd,TCM_SETCURSEL,prm2,0
return 0
#deffunc tabstrchg int prm1,str prm2,int prm3
;*******************************************************************************
; タブコントロール選択タブ文字列の変更 (tabstrchg)
;
; 戻り値 : 成功 stat=0, 失敗 stat=-1
;
; ・書式 tabstrchg htabwnd,String,Index
; ・引数 htabwnd (int) : Createtabctlで作成したハンドル (htabwnd)
; String (str) : 追加項目名文字列 or 文字列変数
; Index (int) : 0〜(0) 項目のインデックス
; ・タイプ モジュール命令
;
;-- (NOTE) ---------------------------------------------------------------------
;
; (使用例)
; tabstrchg htabwnd,"文字列変更",0
;*******************************************************************************
htabwnd = prm1 : if htabwnd==0 : return -1
ls=strlen(prm2) : if ls==0 : return -1
sdim String,ls+2: String=prm2
Index = prm3 : if Index<=0 : Index=0
#undef TCIF_TEXT
#define TCIF_TEXT $00000001
;TCITEM 構造体
dim tcitem,7
tcitem(0) = TCIF_TEXT
tcitem(1) = 0
tcitem(2) = 0
tcitem(3) = varptr(String)
tcitem(4) = 263
tcitem(5) = -1
tcitem(6) = 0
;$100を指定の場合は、現在選択されているインデックス
if Index=$100 {
SendMessage htabwnd,TCM_GETCURSEL,0,0
nIndex=stat
}else{
nIndex=Index
}
SendMessage htabwnd,TCM_SETITEM,nIndex,varptr(tcitem)
sdim String,0
return 0
#defcfunc Tabgetnum int prm1
;*******************************************************************************
; タブコントロール項目数の取得 (tabgetnum)
;
; 戻り値 : 成功 ret=現在の項目数, 失敗 ret=-1
;
; ・書式 ret=tabgetnum(htabwnd)
; ・引数 htabwnd (int) : Createtabctlで作成したハンドル (htabwnd)
; ・タイプ モジュール命令
;
;-- (NOTE) ---------------------------------------------------------------------
;
; (使用例)
; num=tabgetnum(htabwnd)
;*******************************************************************************
htabwnd = prm1 : if htabwnd==0 : return -1
SendMessage htabwnd,TCM_GETITEMCOUNT,0,0
return stat
#deffunc tabstyset int prm1, int prm2
;*******************************************************************************
; タブコントロールスタイルの設定 (tabstyleset)
;
; 戻り値 : 成功 ret=現在の項目数, 失敗 ret=-1
;
; ・書式 Style (int) : 0〜9(0) スタイルモード
; ・タイプ ユーザー定義関数
;
;▼ボタンホットテキスト固定幅スタイル
;▼フラットボタン固定幅スタイル
;-- (NOTE) ---------------------------------------------------------------------
;
; (使用例)
; tabstyleset 1
;*******************************************************************************
htabwnd = prm1 : if htabwnd==0 : return -1
Style = prm2
;▼スタイル判定
switch Style
case 1 : g_Style=$548 : swbreak
case 0 : default : g_Style=$540 : swbreak
swend
;現在設定されているスタイルを取得
GetWindowLong htabwnd,GWL_STYLE
Style=stat
;動的に外す
styleprm=$0,$1,$2,$8,$40,$80,$100,$108,$200,$400
repeat 10
if Style & styleprm(cnt) : Style -= styleprm(cnt)
loop
;指定した拡張スタイルパラメータを加える
Style+=g_Style
;再設定
SetWindowLong htabwnd,GWL_STYLE,Style
;スタイル変更を反映させる
prm=SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_FRAMECHANGED
SetWindowPos htabwnd,0,0,0,0,0,prm
gsel winID,1 : gsel 0
return 0
#undef ICC_TAB_CLASSES
#undef TCIF_TEXT
#global
#endif
#endif
;--------------------------------------------------------------- (EOF) ---------