卷动列
卷动列是图形使用者介面中最好的功能之一,它很容易使用,而且提供了
很好的视觉回馈效果。
卷动列既有垂直方向的(供上下移动),也有水平方向的(供左右移动)。
Windows 文件和表头档案识别字是依据使用者的观点:向上卷动意味著朝文件的开头移动;向下卷动意味著朝文件尾部移动。
每个卷动列均有一个相关的【范围】(这是一对整数,分别代表最小值和最大值)和【位置】(它是卷动方块在此范围内的位置)。当卷动方块在卷动列的顶部(或左部)时,卷动方块的位置是范围的最小值;在卷动列的底部(或右部)时,卷动方块的位置是范围的最大值。
卷动列的范围是从 0(顶部或左部)至 100(底部或右部),但将范围改变为更方便于程式的数值也是很容易的:
SetScrollRange (hwnd, iBar, iMin, iMax, bRedraw) ;
参数 iBar 为 SB_VERT (垂直方向)或者 SB_HORZ(水平方向),iMin 和 iMax 分别是范围的最小值和最大值。bRedraw表示是否重绘
可以使用 SetScrollPos 在卷动列范围内设置新的卷动方块位置:
SetScrollPos (hwnd, iBar, iPos, bRedraw)
参数 iPos 是新位置,它必须在 iMin 至 iMax 的范围内。Windows 提供了类似的函式(GetScrollRange 和 GetScrollPos)来取得卷动列的目前范围和位置。
Windows 对卷动列的处理:
处理所有卷动列滑鼠事件
当使用者在卷动列内单击滑鼠时,提供一种【反相显示】的闪烁
当使用者在卷动列内拖动卷动方块时,移动卷动方块
为包含卷动列视窗的视窗讯息处理程式发送卷动列讯息
程式写作者应该完成的工作:
初始化卷动列的范围和位置
处理视窗讯息处理程式的卷动列讯息
更新卷动列内卷动方块的位置
更改显示区域的内容以回应对卷动列的更改
卷动列讯息
在用滑鼠单击卷动列或者拖动卷动方块时,Windows 给视窗讯息处理程式发送 WM_VSCROLL(供上下移动)和 WM_HSCROLL(供左右移动)讯息。在卷动列上的每个滑鼠动作都至少产生两个讯息,一条在按下滑鼠按钮时产生,一条在释放按钮时产生。
WM_VSCROLL 和 WM_HSCROLL 也带有 wParam 和 lParam讯息参数。对於来自作为视窗的一部分而建立的卷动列讯息,您可以忽略lParam;它只用于作为子视窗而建立的卷动列(通常在对话方块内)。
wParam 讯息参数被分为一个低字组和一个高字组。wParam 的低字组是一个数值,它指出了滑鼠对卷动列进行的操作。这个数值被看作一个【通知码】。通知码的值由以 SB(代表【scroll bar(卷动列)】)开头的识别字定义。
WINUSER.H 中定义的通知码:
#define SB_LINEUP 0
#define SB_LINELEFT 0
#define SB_LINEDOWN 1
#define SB_LINERIGHT 1
#define SB_PAGEUP 2
#define SB_PAGELEFT 2
#define SB_PAGEDOWN 3
#define SB_PAGERIGHT 3
#define SB_THUMBPOSITION 4
#define SB_THUMBTRACK 5
#define SB_TOP 6
#define SB_LEFT 6
#define SB_BOTTOM 7
#define SB_RIGHT 7
#define SB_ENDSCROLL 8
当把滑鼠的游标放在卷动方块上并按住滑鼠键时,您就可以移动卷动方块。这样就产生了带有 SB_THUMBTRACK 和 SB_THUMBPOSITION 通知码的卷动列讯息。
程式能够处理 SB_THUMBTRACK 或 SB_THUMBPOSITION 讯息,但一般不同时处理两者。
如果处理 SB_THUMBTRACK 讯息,在使用者拖动卷动方块时您需要移动显示区域的内容。而如果处理 SB_THUMBPOSITION 讯息,则只需在使用者停止拖动卷动方块时移动显示区域的内容。处理 SB_THUMBTRACK 讯息更好一些(但更困难),对於某些型态的资料,您的程式可能很难跟上产生的讯息。
在 SYSMETS 中加入卷动功能
#include <windows.h>
#include "sysmets.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("SysMets1");
HWND hwnd;
MSG msg;
WNDCLASS wndclass; //窗口类
wndclass.style =</