スクロールバーをフラットスタイルに(U)          <TOP>


フォームにフラット垂直スクロールバーをセットします。

GetWindowLong 指定されたウィンドウに関しての情報を取得

SetWindowLong 指定されたウィンドウの属性を変更

InitializeFlatSB フラットスクロールバーを初期化

UninitializeFlatSB フラットスクロールバーを未初期化(標準に戻す)

FlatSB_ShowScrollBar フラットスクロールバーを表示

FlatSB_EnableScrollBar フラットスクロールバーの使用可・使用不可にする

FlatSB_GetScrollProp フラットスクロールバーのInitializeFlatSBが呼ばれたかどうかを取得

FlatSB_SetScrollProp フラットスクロールバーのInitializeFlatSBが呼ばれたかどうかを設定

FlatSB_GetScrollInfo フラットスクロールバーの情報を取得

FlatSB_SetScrollInfo フラットスクロールバーの情報を設定

FlatSB_GetScrollRange フラットスクロールバーの移動範囲を取得

FlatSB_SetScrollRange フラットスクロールバーの移動範囲を設定

FlatSB_GetScrollPos フラットスクロールバーの位置を取得

FlatSB_SetScrollPos フラットスクロールバーの位置を設定 

GetSysColor システムの背景色を取得

 

例ではUPボタンを使用不可にしています。

 

'================================================================
'= フラットスクロールバー作成(U)
'=    (FlatScrollBar3.bas)
'================================================================
#include "Windows.bi"

#define WS_VSCROLL &H200000             '垂直スクロールバーを持つウィンドウを作成する
#define WS_HSCROLL &H100000             '水平スクロールバーを持つウィンドウを作成する
#define GWL_STYLE -16                   'アプリケーションのインスタンスハンドル

#define WSB_PROP_CXHSCROLL &H2          '水平スクロールバーの方向ボタンの幅
#define WSB_PROP_CXHTHUMB &H10          '水平スクロールバーのスクロールつまみの幅
#define WSB_PROP_CXVSCROLL &H8          '垂直スクロールバーの幅
#define WSB_PROP_CYHSCROLL &H4          '水平スクロールバーの高さ
#define WSB_PROP_CYVSCROLL &H1          '垂直スクロールバーの方向ボタンの高さ
#define WSB_PROP_CYVTHUMB &H20          '垂直スクロールバーのスクロールつまみの高さ
#define WSB_PROP_HBKGCOLOR &H80         '水平スクロールバーの背景色を表す(COLORREF値)
#define WSB_PROP_HSTYLE &H200           '水平スクロールバーの外観を変える
#define WSB_PROP_MASK &HFFF             '
#define WSB_PROP_PALETTE &H800          'スクロールバーが描画される時に使われるHPALETTE値
#define WSB_PROP_VBKGCOLOR &H40         '垂直スクロールバーの背景色を表す(COLORREF値)
#define WSB_PROP_VSTYLE &H100           '垂直スクロールバーの外観を変える
#define WSB_PROP_WINSTYLE &H400         '

#define FSB_REGULAR_MODE 0
#define FSB_ENCARTA_MODE 1
#define FSB_FLAT_MODE 2

#define SB_HORZ 0                       '標準水平スクロールバーを指定
#define SB_VERT 1                       '標準垂直スクロールバーを指定
#define SB_CTL 2                        'スクロールバーコントロールを指定
#define SB_BOTH 3                       '標準スクロールバーの水平・垂直両方

' スクロールバー矢印の使用可能不可能を設定することを示す定数
#define ESB_ENABLE_BOTH &H0             '両方の矢印ボタンを有効にする
#define ESB_DISABLE_LEFT &H1            '水平スクロールバーの左方向の矢印ボタンを無効にする
#define ESB_DISABLE_RIGHT &H2           '水平スクロールバーの右方向の矢印ボタンを無効にする
#define ESB_DISABLE_BOTH &H3            '両方の矢印ボタンを無効にする
#define ESB_DISABLE_UP &H1              '垂直スクロールバーの上方向の矢印ボタンを無効にする
#define ESB_DISABLE_DOWN &H2            '垂直スクロールバーの下方向の矢印ボタンを無効にする
#define ESB_DISABLE_LTUP &H1            '(ESB_DISABLE_LEFT)
#define ESB_DISABLE_RTDN &H2            '(ESB_DISABLE_RIGHT)

#define SIF_RANGE &H1                   'nMinとnMaxの設定を明示
#define SIF_PAGE &H2                    'nPageの設定を明示
#define SIF_POS &H4                     'nPosの設定を明示
#define SIF_ALL &H7                     '(SIF_RANGE Or SIF_PAGE Or SIF_POS)

Type SCROLLINFO
    cbSize    As Long                   'このレコードのバイトサイズ
    fMask     As Long                   '取得・設定する値を指定するマスクフラグ
    nMin      As Long                   'スクロール領域の最小値
    nMax      As Long                   'スクロール領域の最大値
    nPage     As Long                   'サム(つまみ)のサイズ
    nPos      As Long                   'サムの位置
    nTrackPos As Long                   'ドラッグ中のサムの位置
End Type

' 指定されたウィンドウに関しての情報を取得。また、拡張ウィンドウメモリから、指定されたオフセットにある32ビット値を取得することもできる
Declare Function Api_GetWindowLong& Lib "user32" Alias "GetWindowLongA" (ByVal hWnd&, ByVal nIndex&)

' 指定されたウィンドウの属性を変更。また、拡張ウィンドウメモリの指定されたオフセットの32ビット値を書き換えることができる
Declare Function Api_SetWindowLong& Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&)

' フラットスクロールバーを初期化
Declare Function Api_InitializeFlatSB& Lib "comctl32" Alias "InitializeFlatSB" (ByVal hWnd&)

' フラットスクロールバーを未初期化(標準スクロールバーに戻す)
Declare Function Api_UninitializeFlatSB& Lib "comctl32" Alias "UninitializeFlatSB" (ByVal hWnd&)

' フラットスクロールバーの表示
Declare Function Api_FlatSB_ShowScrollBar& Lib "comctl32" Alias "FlatSB_ShowScrollBar" (ByVal hWnd&, ByVal code&, ByVal fShow&)

' フラットスクロールバーを使用可・使用不可にする
Declare Function Api_FlatSB_EnableScrollBar& Lib "comctl32" Alias "FlatSB_EnableScrollBar" (ByVal hWnd&, ByVal wSBFlags&, ByVal wArrows&)

' フラットスクロールバーのInitializeFlatSBが呼ばれたかどうかを取得
Declare Function Api_FlatSB_GetScrollProp& Lib "comctl32" Alias "FlatSB_GetScrollProp" (ByVal hWnd&, ByVal propIndex&, ByVal pValue&)

' フラットスクロールバーのInitializeFlatSBが呼ばれたかどうかを設定
Declare Function Api_FlatSB_SetScrollProp& Lib "comctl32" Alias "FlatSB_SetScrollProp" (ByVal hWnd&, ByVal index&, ByVal newValue&, ByVal fRedraw&)

' フラットスクロールバーの情報を取得
Declare Function Api_FlatSB_GetScrollInfo& Lib "comctl32" Alias "FlatSB_GetScrollInfo" (ByVal hWnd&, ByVal code&, lpsi As Any)

' フラットスクロールバーの情報を設定
Declare Function Api_FlatSB_SetScrollInfo& Lib "comctl32" Alias "FlatSB_SetScrollInfo" (ByVal hWnd&, ByVal code&, lpsi As Any, ByVal fRedraw&)

' フラットスクロールバーの移動範囲を取得
Declare Function Api_FlatSB_GetScrollRange& Lib "comctl32" Alias "FlatSB_GetScrollRange" (ByVal hWnd&, ByVal code&, ByVal lpMinPos&, ByVal lpMaxPos&)

' フラットスクロールバーの移動範囲を設定
Declare Function Api_FlatSB_SetScrollRange& Lib "comctl32" Alias "FlatSB_SetScrollRange" (ByVal hWnd&, ByVal code&, ByVal nMinPos&, ByVal nMaxPos&, ByVal fRedraw&)

' フラットスクロールバーの位置を取得
Declare Function Api_FlatSB_GetScrollPos& Lib "comctl32" Alias "FlatSB_GetScrollPos" (ByVal hWnd&, ByVal code&)

' フラットスクロールバーの位置を設定
Declare Function Api_FlatSB_SetScrollPos& Lib "comctl32" Alias "FlatSB_SetScrollPos" (ByVal hWnd&, ByVal code&, ByVal nPos&, ByVal fRedraw&)

' システムの背景色を取得
Declare Function Api_GetSysColor& Lib "user32" Alias "GetSysColor" (ByVal nIndex&)

' nIndexで指定する定数
#define COLOR_BTNFACE 15               'コマンドボタンの表面色

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var rgbColor As Long
    Var SI As SCROLLINFO
    Var Min As Long
    Var Max As Long
    Var Ret As Long

    'Buttonの表面色を取得(EDE9EC)
    rgbColor = Api_GetSysColor(COLOR_BTNFACE)

    'Mainformを取得色で塗る
    SetBackColor rgbColor

    '画面を消去
    Cls

    'Mainformを表示
    ShowWindow -1

    'フォームにスクロールバーをセット
    Ret = Api_GetWindowLong(GethWnd, GWL_STYLE)
    Ret = Ret Or WS_VSCROLL Or WS_HSCROLL
    Ret = Api_SetWindowLong(GethWnd, GWL_STYLE, Ret)

    '初期化
    Ret = Api_InitializeFlatSB(GethWnd)

    '垂直スクロールバーをEncarta-modeに
    Ret = Api_FlatSB_SetScrollProp(GethWnd, WSB_PROP_VSTYLE, FSB_ENCARTA_MODE, False)

    '垂直スクロールバーからボタンアップを使用不可に
    Ret = Api_FlatSB_EnableScrollBar(GethWnd, SB_VERT, ESB_DISABLE_UP)

    'スクロールレンジセット
    Ret = Api_FlatSB_SetScrollRange(GethWnd, SB_VERT, 0, 80, False)

    'スクロールポジション設定
    Ret = Api_FlatSB_SetScrollPos(GethWnd, SB_VERT, 50, False)

    '水平スクロールバーを消す
    Ret = Api_FlatSB_ShowScrollBar(GethWnd, SB_HORZ, False)

    'スクロールバー情報取得
    SI.cbSize = Len(SI)
    SI.fMask = SIF_ALL
    Ret = Api_FlatSB_GetScrollInfo(GethWnd, SB_VERT, SI)

    SI.nPos = SI.nPos - 10

    '新しいスクロールバー情報を設定
    Ret = Api_FlatSB_SetScrollInfo(GethWnd, SB_VERT, SI, True)

    Ret = Api_FlatSB_GetScrollRange(GethWnd, SB_VERT, Min, Max)
    Symbol(20, 40), "Scroll Position:" & Str$(Int(100 * (Api_FlatSB_GetScrollPos(GethWnd, SB_VERT) / Max))) & "%", 1, 1
End Sub

'================================================================
'=
'================================================================
Declare Sub MainForm_QueryClose edecl ()
Sub MainForm_QueryClose()
    Var Ret As Long

    'フラットスクロールバーの削除
    Ret = Api_UninitializeFlatSB(GethWnd)
End Sub
'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End