中年人学C语言Windows程序设计,6 滚动条SCROLLINFO,SetScrollInfo,GetScrollInfo,ScrollWindow

中年人学C语言Windows程序设计,6 滚动条

如果我们想在 窗口的客户区内输入多行内容就会出现显示不全的情况。
如下:
在这里插入图片描述

就会用到滚动条。

在学滚动条前,我们需要先学会获取当前客户区的大小。

LOWORD和HIWORD宏

获取当前客户区的大小可以使用 LOWORD和HIWORD宏。
当改变客户区大小发生变化时,系统会把大小放在lParam 参数中。共32位,高16位 是高度信息,低16位是 宽度信息。

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

宏功能:

获得指定 32 位数据的低 16 位数据和高 16 位数据。

不要使用 LOWORD 和 HIWORD 宏去获取鼠标的坐标,因为在多显示器的情况下会得到错误的坐标。应该使用 GET_X_LPARAM 和 GET_Y_LPARAM 宏来获取。

返回值:

  1. LOWORD(lParam) 返回 lParam 的低 16 位数据;

  2. HIWORD(lParam) 返回 lParam 的高 16 位数据。

case WM_SIZE:
     x = LOWORD(lParam);//低16为宽度像素
     y = HIWORD(lParam);//高16为高度像素

获取当前客户区的大小,在客户区显示当前的大小。
代码如下:

case WM_SIZE://窗体大小改变
        hdc = GetDC(hwnd);
        //GetClientRect(hwnd, &rect);
        StringCchPrintf(szBuffer, 128, TEXT("当前客户区的分辨率:%d * %d"), LOWORD(lParam), HIWORD(lParam));
        StringCchLength(szBuffer, 128, &iLength);
        SetTextAlign(hdc, TA_CENTER | TA_TOP);
        TextOut(hdc, LOWORD(lParam) / 2, 0, szBuffer, iLength);
        //DrawText(hdc, TEXT("大家好,这是我的第一个Windows窗口程序!"), -1, &rect,DT_SINGLELINE | DT_CENTER);
        ReleaseDC(hwnd, hdc);
        return 0;

显示效果如下:在这里插入图片描述

滚动条相关学习

结构SCROLLINFO

结构原型:

typedef struct tagSCROLLINFO
 {
    
    UINT cbSize;      // SCROLLINFO结构体本身的字节大小
    UINT fMask;       // 见下面的说明
    int nMin;         // 最小滚动位置
    int nMax;         // 最大滚动位置
    UINT nPage;       // 页面尺寸
    int nPos;         // 滚动块的位置
    int nTrackPos;    // 滚动块当前被拖动的位置,不能在SetScrollInfo中指定
} SCROLLINFO; 

参数解释:

cbSize: SCROLLINFO结构长度字节数,该值在设置和查询参数时都必须填写。

  1. 该结构的大小(以字节为单位)
  2. 通常使用 sizeof(SCROLLINFO) 获得

fMask: 指定结构中的哪些成员是有效,该值共有如下5种选择,可以选择多种用“OR”组合起来,该值在设置和查询参数时都必须填写。
指定被设置或获取的滚动条参数,该参数可以由下列标志组成:
3. SIF_ALL:相当于 SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS
4. SIF_DISABLENOSCROLL:如果当前窗口不需要滚动条时,禁用滚动条取代隐藏滚动条(该标志只用于 SetScrollInfo 函数中)
5. SIF_PAGE:指出需要设置或获取页面的大小到 nPage 中(如果不希望滑块大小发生变化,则不要设置此标志)
6. SIF_POS:指出需要设置或获取滚动条滑块的位置到 nPos 中
7. SIF_RANGE:指出需要在 nMin 和 nMax 设置或获取范围的最小值和最大值
8. SIF_TRACKPOS:指出当 WM_VSCROLL 或 WM_HSCROLL 消息的通知码为 SB_THUMBTRACK 或 SB_THUMBPOSITION 时,返回当前滑块的位置到 nTrackPos(该标志只用在 GetScrollInfo 函数中,并且该值为一个 32 位整数)

值 含义
SIF_ALL 整个结构都有效
SIF_DISABLENOSCROLL 该值仅在设定参数时使用,视控件参数设定的需要来对本结构的成员进行取舍。
SIF_PAGE nPage成员有效
SIF_POS nPos成员有效
SIF_RANGE nMin和nMax成员有效

nMin: 滚动范围最小值
nMax: 滚动范围最大值
nPage: 页尺寸,用来确定比例滚动框的大小
nPos: 滚动框的位置
nTrackPos: 拖动时滚动框的位置,该参数只能查询,不能设置。

函数SetScrollInfo

函数功能:

该函数设置滚动条参数,包括滚动位置的最大值和最小值,页面大小,滚动按钮的位置。如被请求,函数也可以重画滚动条。

函数原型:

int SetScrollInfo(HWND hWnd;int fnBar,LPSCROLLINFO lpsi,BOOL fRedraw);

参数解释:

hWnd:滚动条控制或带标准滚动条的窗体句柄,由fnBar参数决定。

fnBar:指定被设定参数的滚动条的类型。这个参数可以是下面值,含义如下:
  SB_CTL:设置滚动条控制。而参数hwnd必须是滚动条控制的句柄。
  SB_HORZ:设置所给定的窗体上标准水平滚动条参数。
  SB_VERT:设置所给定的窗体上标准垂直滚动条参数。

IPBI:指向SCROLLINFO结构。在调用SetScrognfo之前,设置SCROLLINFO结构中cbSize成员以标识结构大小,设置成员fMask以说明待设置的滚动条参数,并且在适当的成员中制定新的参数值。

fRedraw:指定滚动条是否重画以反映滚动条的变化。如果这个参数为TRUE,滚动条将被重画,否则不被重画。

函数GetScrollInfo

函数功能:

该函数找到滚动条的参数,包括滚动条位置的最小值、最大值,页面大小,滚动按钮的位置等。

函数原型

BOOL GetScrollInfo( HWND hWnd, int fnBar, LPSCROLLINFO lpsi );

参数解释:

hWnd: 滚动条控制或有标准滚动条的窗体句柄,由fnBar参数确定。
fnBar: 指定待找回滚动条参数的类型,此参数可以为如下值,其值含义:
SB_CTL|找回滚动条控制参数。其中参数hwnd一定是处理滚动条控制的句柄。
SB_HORZ|找回所指定窗体的标准水平滚动条参数。
SB_VERT|找回所指定窗体的标准垂直滚动条参数。
lpsi:指向SCROLLINFO结构。

函数ScrollWindow

函数功能:

该函数滚动所指定的窗口客户区域内容。该函数存在向后兼容性,新的应用程序应使用ScrollWindowEX。

函数原型:

BOOL ScrollWindow(HWND hWnd, int XAmount, int YAmount, CONST RECT *IpRect, CONST RECT *lpClipRect);

参数解释:

hWnd 客户区域将被滚动的窗口的句柄。

XAmount
指定水平滚动的距离,以设备单位计。如果窗口类风格为CS_OWNDC或CS_CLASSDC,则此参数则使用逻辑单位而非设备单位。当向左滚动窗体内容时,参数值必须为负。

YAmount
指定垂直滚动的距离,以设备单位计。如果窗口类风格为CS_OWNDC或CS_CLASSDC,则此参数则使用逻辑单位而非设备单位。当向上滚动窗体内容时,参数值必须为负。

lpRect
指向RECT结构的指针,该结构指定了将要滚动的客户区范围。若此参数为NULL,则整个客户区域将被滚动。

lpClipRect
指向RECT结构的指针,该结构指定了要滚动的裁剪区域。只有这个矩形中的位才会被滚动。在矩形之外的位不会被影响,即使它们是在lpRect矩形之内。(见代码"测试一")假如lpClipRect为NULL,则不会在滚动矩形上进行裁剪。

核心要点

其实SetScrollInfo是SetScrollRange和SetScrollPos的结合,GetScrollInfo是GetScrollRange和GetScrollPos的结合。

无论是Set还是Get,都得先设置si结构的第一个域的值,即赋给cbSize结构的大小。之后根据设置的fMask域的值进行Set或Get,当Set时,需要根据fMask的值将相关的域填充后再调用SetScrollInfo(),这样si结构就被Set成功。当Get时,直接调用GetScrollInfo(),具体能使用哪些域的值是根据所设置的fMask域的值定的。

当要设置滚动条的范围和页面大小时(SetScrollInfo的使用):

SCROLLINFO si;
cxClient = LOWORD(lParam);//获取客户区窗口宽度
cyClient = HIWORD(lParam);//获取客户区
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值