|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 hujianhang2996 于 2016-7-6 20:00 编辑
以垂直方向的滚动条为例,水平方向以此类推。
注册窗口什么的就不写了,下面直接写窗口过程中跟滚动条有关的代码。
- WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- int cyClient; //定义变量用于窗口大小变化时储存客户区大小(这个例子里就是指客户区垂直长度)。
- static SCROLLINFO siVert;//设置一个静态结构体变量储存滚动条的数据。
- int iVscrollPos; //在处理WM_VSCROLL消息中用于计算滚动条位置。
- case WM_CREAT:
- siVert.cbSize=sizeof(siVert);
- /*设置滚动条范围---------------------------------------------------------------*/
- siVert.nMax=cyLength;
- siVert.nMin=0;
- case WM_SIZE:
- cyClient=HIWORD(lParam);
- siVert.fMask=SIF_POS | SIF_RANGE | SIF_PAGE;
- /*客户区大小变化后重新设定滚动条位置----------------------------------------*/
- if(cyLength==siVert.nPage)
- {
- siVert.nPos=0;
- }
- else
- {
- siVert.nPos=siVert.nPos*(cyLength-cyClient)/(cyLength-siVert.nPage);
- }
- /*客户区大小变化后重新设定滚动条页面大小-----------------------------------*/
- siVert.nPage=cyClient;
- /*设定滚动条并重绘滚动条-----------------------------------------------------*/
- SetScrollInfo (hwnd, SB_VERT, &siVert,TRUE) ;
- case WM_VSCROLL:
- /*读取滚动条当前位置----------------------------------------------------------*/
- iVscrollPos=GetScrollPos(hwnd, SB_VERT) ;
- /*处理各种滚动条信息,SB_LINEUP、SB_LINEDOWN之类,这里不写了------*/
- switch(LOWORD(wParam))
- {......
- ......
- ......
- }
- iVscrollPos=max(0,min(iVscrollPos,siVert.Max-siVert.nPage));
- siVert.nPos=iVscrollPos;
- siVert.fMask=SIF_POS;
- /*重设滚动条位置并无效化窗口 -----------------------------------------------*/
- SetScrollInfo (hwnd, SB_VERT, &siVert,TRUE);
- InvalidateRect(hWnd,NULL,TURE);
- case WM_PAINT:
- BeginPaint(hwnd,&ps);
- SetViewportOrgEx(hdc,0,-siVert.nPos,NULL); /*设定图像原点位置,这里把图像原点移动-siVert.nPos个单位,就相当于将图像向下滚动,因此下面所有在客户区进行的绘制都向下滚动了。*/
- ......
- ......
- ......
- EndPaint(hwnd,&ps);
- }
复制代码 |
评分
-
参与人数 2 | 荣誉 +10 |
鱼币 +10 |
贡献 +10 |
收起
理由
|
无符号整形
| + 5 |
+ 5 |
+ 5 |
感谢楼主无私奉献! |
康小泡
| + 5 |
+ 5 |
+ 5 |
热爱鱼C^_^ |
查看全部评分
|