Windows 编程基础(七)

本文详细介绍了Windows编程中的卷动列概念,包括卷动列的类型、范围和位置设定,以及如何处理卷动列的滑鼠事件和WM_VSCROLL、WM_HSCROLL讯息。通过SetScrollRange和SetScrollPos等函数,开发者可以实现卷动列的初始化和位置更新,从而在应用程序中实现有效的滚动交互。
摘要由CSDN通过智能技术生成

卷动列
卷动列是图形使用者介面中最好的功能之一,它很容易使用,而且提供了
很好的视觉回馈效果。
卷动列既有垂直方向的(供上下移动),也有水平方向的(供左右移动)。
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 =</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值