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) ---------