中年⼈学C语⾔Windows程序设计,6滚动条SCROLLINFO,SetScrollIn。。。中年⼈学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);
return0;
显⽰效果如下:
滚动条相关学习
结构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参数决定。
windows程序设计第7版pdffnBar:指定被设定参数的滚动条的类型。这个参数可以是下⾯值,含义如下:
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);//获取客户区窗⼝⾼度
yPage = cyClient / cyChar;// yPage表⽰⼀页⾥有多少⾏
si.cbSize =sizeof(SCROLLINFO);
si.fMask = SIF_RANGE | SIF_PAGE ;
si.nMin =0;//滚动条范围的最⼩值
si.nMax =NUMLINES-1;//滚动条范围的最⼤值
si.nPage = yPage;//页⾯的⼤⼩,滚动条通过这个值来动态确定滑块的⼤⼩
SetScrollInfo(hWnd, SB_VERT,&si, TRUE);
⽽若要⽤到滚动条的位置时(GetScrollInfo的使⽤):
case WM_VSCROLL:
{
si.cbSize =sizeof(si);
si.fMask = SIF_ALL ;// 表⽰Get后将使⽤si结构的位置、页⾯⼤⼩等量
GetScrollInfo(hwnd, SB_VERT,&si);
// 然后就可直接使⽤si.nPos、si.nPage、si.nTrackPos等量,
// 这些量就是从si结构中通过Get函数获得的,也是之前通过Set函数设置的值。
yVscrollPos = si.nPos;
switch(LOWORD(wParam))
{
case SB_LINEDOWN:
si.nPos +=1;
break;
case SB_LINEUP:
si.nPos -=1;
break;
case SB_PAGEDOWN:
si.nPos += yPage;
break;
case SB_PAGEUP:
si.nPos -= yPage;
break;
case SB_THUMBTRACK:
si.nPos = si.nTrackPos;
break;
}
si.nPos =min(NUMLINES - yPage,max(0, si.nPos));
si.fMask = SIF_POS;
SetScrollInfo(hWnd, SB_VERT,&si, TRUE);//重新设置滚动条
GetScrollInfo(hWnd, SB_VERT,&si);//取得设置滚动条
if(yVscrollPos != si.nPos)//如果滚动条移动就进⾏重绘
{
ScrollWindow(hWnd,0, cyChar *(yVscrollPos - si.nPos),NULL,NULL);//函数滚动指定窗⼝的客户区内容
UpdateWindow(hWnd);//重绘⽤户区窗⼝,系统会调⽤WM_PAINT,重绘⽤户区
}
return0;
}
完整代码:
#define _CRT_SECURE_NO_WARNINGS 1
/* -------------------------------------------------------------------
中年⼈学C语⾔Windows程序设计
--------------------------------------------------------------------*/
#include<windows.h>
#include<strsafe.h>
#include"sysmets.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine,int iCmdShow)
//主函数
// 四个参数:
//hInstance : 程序当前实例的句柄(handle to current instance),以后随时可以⽤GetModuleHandle(0)来获得
//hPrevInstance : 前⼀个实例的句柄(handle to previous instance),在Win32中,每⼀个进程都有⼀个独⽴的4G地址空间,从0到2G属于进程私有,对其他进程来说是不可见的。所以,在Win32中,hPrevInstance总是为NULL。
/
/szCmdLine : 指向以 / 0结尾的命令⾏,不包括EXE本⾝的⽂件名(pointer to command line),以后随时可以⽤GetCommandLine()来获取完整的命令⾏。
//iCmdShow : 指明应该以什么⽅式显⽰主窗⼝(show state of window)。
{
static TCHAR szAppName[]=TEXT("MyWindows");
HWND hwnd;//句柄
MSG msg;//消息
WNDCLASS wndclass;//定义窗⼝类结构
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论