中年人学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 宏来获取。
返回值:
-
LOWORD(lParam) 返回 lParam 的低 16 位数据;
-
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结构长度字节数,该值在设置和查询参数时都必须填写。
- 该结构的大小(以字节为单位)
- 通常使用 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);//获取客户区