读书笔记 - Windows程序设计(滚动条)

1.滚动条的产生

创建窗口时,在窗口风格标识符包括 WS_VSCROLL 或者 WS_HSCROLL, 就会出现滚动条。
hwnd = CreateWindow (szAppName, TEXT ("标题"),
                    WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
                    CW_USEDEFAULT, CW_USEDEFAULT,
                    CW_USEDEFAULT, CW_USEDEFAULT,
                    NULL, NULL, hInstance, NULL) ;

WS_VSCROLL 垂直滚动条
WS_HSCROLL 水平滚动条

2.滚动条消息

LRESULT CALLBACK WindowProc(
                  HWND hwnd,       // handle to window
                  UINT uMsg,       // WM_VSCROLL | WS_HSCROLL
                  WPARAM wParam,   // request and position
                  LPARAM lParam    // handle to scroll bar (HWND)
);

wParam low-order    保存用户行为
       high-order   保存当前的位置,如果低阶的行为不是  
                    SB_THUMBPOSITION or SB_THUMBTRACK,那么就不用理会

WM_VSCROLL 垂直滚动条消息
        switch(LOWORD(wParam))
        {   
        case SB_BOTTOM:         //滚到底
        case SB_LINEUP:         //向上滚动一行
        case SB_LINEDOWN:       //向下滚动一行
        case SB_PAGEUP:         //向上滚动一页
        case SB_PAGEDOWN:       //向下滚动一页
        case SB_THUMBTRACK:     //拖动滚动条
        case SB_TOP:            //滚到顶
        }

WS_HSCROLL 水平滚动条消息
        switch(LOWORD(wParam))
        {   
        case SB_ENDSCROLL:      //滚动结束
        case SB_LINELEFT:       //向左滚动一行
        case SB_LINERIGHT:      //向右滚动一行
        case SB_PAGELEFT:       //向左滚动一页
        case SB_PAGERIGHT:      //向右滚动一页
        case SB_THUMBPOSITION:  //拖动滚动条 
        }

3.滚动条API

//结构体参数
typedef struct tagSCROLLINFO { 
    UINT cbSize;                    //设为 sizeof(SCROLLINFO)
    UINT fMask;                     //要设置或者获取的值
    int  nMin;                      //范围最小值
    int  nMax;                      //范围最大值
    UINT nPage;                     //页面大小
    int  nPos;                      //当前位置
    int  nTrackPos;                 //当前追随位置
}   SCROLLINFO, *LPSCROLLINFO; 
typedef SCROLLINFO CONST *LPCSCROLLINFO;

fMask
    SIF_ALL         包括SIF_PAGE, SIF_POS, SIF_RANGE, and SIF_TRACKPOS.
    SIF_PAGE        可用于指定或获取页面大小
    SIF_POS         可用于指定或获取滑块条当前位置
    SIF_RANGE       可用于指定或获取滑块条minmax 范围
    SIF_TRACKPOS    在SetScrollInfo 中被忽略

//SetScrollInfo 可以设置滚动条的 
                包括最小和最大滚动位置,
                页面大小,
                滚动条的位置

int SetScrollInfo(
                  HWND hwnd,           // 窗口句柄
                  int fnBar,           // SB_HORZ 或 SB_VERT
                  LPCSCROLLINFO lpsi,  // 结构体
                  BOOL fRedraw         // 是否重绘
                  );

//调用例子

//设置垂直滑块条范围跟滑块条大小
        SCROLLINFO  si ;
        si.cbSize = sizeof(si);             //结构体大小,微软用来判断API版本,因为有的时候版本参数不一样
        si.fMask = SIF_PAGE | SIF_RANGE;    //操作行为 设置页面 跟 范围
        si.nMin = 0;                        //最小范围
        si.nMax = 100;                      //最大范围
        si.nPage = 50;                      //页面大小
        SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);

//设置垂直滑块条位置
        SCROLLINFO  si ;
        si.cbSize = sizeof(si);
        si.fMask = SIF_POS;                 //操作行为 设置滑块条位置
        si.nPos  = 100;                     //位置
        SetScrollInfo(hwnd, SB_VERT, &si, TRUE);

//GetScrollInfo 可以获取滚动条的 
                包括最小和最大滚动位置,
                页面大小,
                滚动条的位置  

BOOL GetScrollInfo(  HWND hwnd,         // 窗口句柄
                     int fnBar,         // SB_HORZ 或 SB_VERT
                     LPSCROLLINFO lpsi  // 结构体
                     );         

//调用例子
//获取滑块条所有信息
        SCROLLINFO  si ;        
        si.cbSize = sizeof(si);
        si.fMask = SIF_ALL;                 //获取滑块条所有信息
        GetScrollInfo(hwnd, SB_VERT, &si);
//滚动窗口
BOOL ScrollWindow(  HWND hWnd,              // 窗口句柄
                    int XAmount,            // 滚动x位置
                    int YAmount,            // 滚动y位置
                    CONST RECT *lpRect,     // 指定滚动区域,为NULL客户区整体滚动
                    CONST RECT *lpClipRect  // clipping rectangle
                  );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值