Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97519
  • 博文数量: 11
  • 博客积分: 271
  • 博客等级: 二等列兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-23 16:34
文章分类
文章存档

2012年(11)

我的朋友

分类: C/C++

2012-10-24 21:10:06

1.在win32 API创建的窗口中显示滚动条

     在CreateWindow的第三个参数中包含窗口风格(WS)标识符WS_VSCROLL和WS_HSCROLL即可。

2.滚动条的范围和位置

     每个滚动条都有一个相应的范围,默认是从0~100(离散的整数值)。

     ①改变范围: 

     SetScorllRange(hwnd, iBar, iMin, iMax, bRedraw)

     参数:

     iBar为SB_VERT或者SB_HORZ

     iMin为范围最小值

     iMax为范围最大值

     bRedraw:如果想要windows重画滚动条,则设置为TRUE,如果调用SetScorllRange后,调用其他影响滚动条位置的函数,则置为FALSE,避免过多重画

     ②设置位置:

     SetScrollPos(hwnd, iBar, iPos, bRedraw)

     参数:

     iBar为SB_VERT或者SB_HORZ

     iPos为滚动条位置

     bRedraw:是否需要重画

3.滚动条消息

    与所有消息一样,WM_VSSCROLL和WM_HSCROLL也带有wParam和lParam参数,其中lParam参数只用于作为子窗口而创建的滚动条。

    wParam分为一个高位字和低位字,低位是鼠标对滚动条进行的操作,是一个数值,这个数值被看作一个“通知码”,以SB_开头。wParam的高位在SB_THUMBTRACK时,表示滚动条当前位置,SB_THUMBPOSITION时,表示用户释放鼠标后滚动条最终位置。

    我们可以使用SetScrollPos和SetScrollRange来处理滚动条消息,但是处理完后,并不刷新客户区,调用InvalidateRect使客户区失效,导致windows发送一个WM_PAINT消息放入消息队列。但windows把WM_PAINT当成低优先级消息,如果系统有许多动作正在发生,您可能要等一段时间。如果想立即刷新无效区域,可以在调用InvalidateRect之后,调用UpdateWindow(hwnd)。

4.WM_SIZE消息

    我们可以使用GetClientRect来获得客户区域的大小,但是这样是没有效率的。

    在窗口发生改变的时候,windows给窗口过程发送一个WM_SIZE消息,在在lParam的低位参数中包含了客户区的宽度,高字节包含了客户区的高度,要获得这些尺寸,我们再窗口过程中定义两个静态变量:

    static int cxClient,cyClient;

在WM_SIZE消息的处理中获得这两个尺寸

    cxClient =LOWORD(lParam);

    cyClient =HIWORD(lParam);

    WM_SIZE后边必然跟着一个WM_PAINT消息,因为我们定义窗口类的时候制定了类风格CS_HREDRAW|CS_VREDRAW

5.滚动条信息函数

    用SetScrollPos和SetScrollRange实现的滚动条中滚动框大小事固定的,但是我们使用的滚动框大小事与文档大小成比例的。

    滚动框大小/滚动长度  ≈ 页面大小/范围 ≈ 显示的文档数量/文档的总大小,可以使用SetScrollInfo来设置页面的大小,从而设置滚动框的大小。

    SetScrollInfo(hwnd, iBar, &si, bRedraw);

    GetScrollInfo(hwnd, iBar, &si);

    两个参数的第三个参数是滚动条的信息结构体SCROLLINFO

    在设置完si后,调用ScrollWindow滚动客户区信息,而不是重画它。

    滚动条信息函数,依靠windows保存滚动条信息并做边界检查,更好的实现了滚动条的功能。   

    
 

阅读(5312) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~