サイズ可変なタブコントロール

差分ファイル作成ツールでは、サイズが可変なウィンドウで、タブコントロールを使う予定なので、サイズ可変なタブコントロールができるか、試してみました。

参考にしたページは以下の3つ

これらのページの通りにタブコントロールを作って、 WM_SIZE 時に MoveWindow でリサイズする。もっと難しいことしないといけないかと身構えて立ち向かったんですが、普通のオブジェクトを可変サイズにするのとほぼ同じ工程でできました。

#include "user32.as"
#include "gdi32.as"

#const NUMBER_OF_TABS                    6    // タブの数
#const TAB_CONTENT_WINDOW_ID            20    // タブの内容のウィンドウの開始ID

// 可変ウィンドウを作成
screen 0, ginfo_dispx, ginfo_dispy, 2
GetWindowLong hwnd, -16
SetWindowLong hwnd, -16, stat | $50000    // WS_MAXIMIZEBOX | WS_SIZEBOX
width 320, 240

syscolor 15 : boxf

// タブコントロールを配置
pos 20, 20
// WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
winobj "SysTabControl32", "", 0, $56000000, ginfo_winx - 40, ginfo_winy - 40
hTabControl = objinfo( 0, 2 )

// フォントをデフォルトGUIに
GetStockObject 17
sendmsg hTabControl, $30, stat, 0    // WM_SETFONT

dim rect, 4
dim tcitem, 7
repeat NUMBER_OF_TABS
    // タブのキャプションを設定
    caption = strf("Tab%c", 'A' + cnt \ 26 )
    tcitem = 1, 0, 0, varptr( caption ), strlen( caption ) + 1
    sendmsg hTabControl, $1307, cnt, varptr( tcitem )    // TCM_INSERTITEMA

    //タブの内容のウィンドウを作成
    GetClientRect hTabControl, varptr( rect )
    sendmsg hTabControl, $1328, 0, varptr( rect )    //TCM_ADJUSTRECT
    bgscr cnt + TAB_CONTENT_WINDOW_ID, ginfo_dispx, ginfo_dispy, 2
    SetWindowLong hWnd, -16, $46000000    // WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_CHILD
    SetParent hWnd, hTabControl
    width rect.2 - rect.0, rect.3 - rect.1, rect.0, rect.1

    //タブの内容の描画
    hsvcolor cnt * 192 / NUMBER_OF_TABS, 255, 128 : boxf
    hsvcolor 0, 0, 255 : mes ""+cnt
loop
gsel 0

oncmd gosub *l_On_WM_NOTIFY, $4e    // WM_NOTIFY
oncmd gosub *l_On_WM_SIZE,   $05    // WM_SIZE

gosub *l_On_TCN_SELCHANGE
gsel 0, 1
stop

*l_On_WM_NOTIFY
    // 通知コードが TCN_SELCHANGE だったらタブチェンジ
    dupptr NMHDR, lparam + 8, 4
    if NMHDR == $FFFFFDD9 : gosub *l_On_TCN_SELCHANGE
    return

*l_On_TCN_SELCHANGE

    // さっき開いていたタブのウィンドウを非表示に
    gsel CurrentTabId + TAB_CONTENT_WINDOW_ID, -1
    
    // 選択されているタブを取得
    sendmsg hTabControl, $130b, 0, 0    // TCM_GETCURSEL
    CurrentTabId = stat

    gsel CurrentTabId + TAB_CONTENT_WINDOW_ID, 1

    // タブのキャプションを表示
    sendmsg hTabControl, $1305, CurrentTabId, varptr( tcitem )    // TCM_GETITEM
    dupptr caption, tcitem.3, tcitem.4, 2
    gsel 0
    title caption+"が選択されました" 

    return

*l_On_WM_SIZE
    // タブコントロールのリサイズ
    MoveWindow hTabControl, 20, 20, ginfo_winx - 40, ginfo_winy - 40, 1
    // タブコントロールの内容のウィンドウのリサイズ
    repeat NUMBER_OF_TABS
        gsel cnt + TAB_CONTENT_WINDOW_ID
        GetClientRect hTabControl, varptr( rect )
        sendmsg hTabControl, $1328, 0, varptr( rect )    // TCM_ADJUSTRECT
        MoveWindow hWnd, rect.0, rect.1, rect.2 - rect.0, rect.3 - rect.1, 1
        // さらに、タブコントロールの内容のウィンドウ内にあるオブジェクトもリサイズしておくとよし
    loop
    gsel
    return

インフォメーション

公開日時
2007年6月17日 午後8時22分36秒
最終更新日時
2007年9月9日 午後5時21分56秒
カテゴリ
HSP