MFC滚动条

Windows用两种不同的方式来处理滚动条。一些控制,如编辑控制和列表控制,可以带有滚动条。在这种情况下,滚动条会被自动处理,不不要额外的代码来处理。

滚动条也可以作为单独的元件来使用。当这样使用时,滚动条就拥有独立的权力。你可以参见MFC参考手册中有关CScrollBar的有关章节。滚动条控制的建立与前面介绍的静态标签和按钮的一样。它有四个成员函数允许你设置和获取滚动条的位置和范围。
下面的代码演示了建立水平滚动条的过程和其消息映射:
// sb1.cpp
#include <afxwin.h>
#define IDM_SCROLLBAR 100
const int MAX_RANGE=100;
const int MIN_RANGE=0;
// Declare the application class
class CScrollBarApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
// Create an instance of the application class
CScrollBarApp ScrollBarApp;
// Declare the main window class
class CScrollBarWindow : public CFrameWnd
{
CScrollBar *sb;
public:
CScrollBarWindow();
afx_msg void OnHScroll(UINT nSBCode, UINT nPos,
CScrollBar* pScrollBar);
DECLARE_MESSAGE_MAP()
};
// The message handler function
void CScrollBarWindow::OnHScroll(UINT nSBCode,
UINT nPos, CScrollBar* pScrollBar)
{
MessageBeep(-1);
}
// The message map
BEGIN_MESSAGE_MAP(CScrollBarWindow, CFrameWnd)
ON_WM_HSCROLL()
END_MESSAGE_MAP()
// The InitInstance function is called once
// when the application first executes
BOOL CScrollBarApp::InitInstance()
{
m_pMainWnd = new CScrollBarWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
// The constructor for the window class
CScrollBarWindow::CScrollBarWindow()
{
CRect r;
// Create the window itself
Create(NULL,
"CScrollBar Tests",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));

// Get the size of the client rectangle
GetClientRect(&r);
// Create a scroll bar
sb = new CScrollBar();
sb->Create(WS_CHILD|WS_VISIBLE|SBS_HORZ,
CRect(10,10,r.Width()-10,30),
this,
IDM_SCROLLBAR);
sb->SetScrollRange(MIN_RANGE,MAX_RANGE,TRUE);
}

Windows会区分水平和垂直滚动条,同时还支持CScrollBar中一称为尺寸盒的控制。尺寸盒是一个小方块。它处于水平和垂直滚动条的交叉处,呀鼠标拖动它会自动改变窗口的大小。在后面的代码中你看到如何用Create函数的SBS_HORZ样式来建立一水平滚动条。在建立了滚动条之后,马上用SetScrollRange中的MIN_RANGE和MAX_RANGE龙个常数给出了滚动条的范围0~100(它们定义在程序的顶部)。

事件处理函数OnHScroll来自CWnd类。我们使用该函数是因为该代码建立了水平滚动条。对于垂直滚动条应使用OnVScroll。在代码中,消息映射与滚动函数相联系,并使滚动条在用户操作时发出鸣笛声。当你运行该程序时,你可以单击箭头、拖动滚动条上的小方块等等。每次操作都会出现鸣笛声,但是滚动条上的小方块实际上不会移动,因为我们还没有把它与实际的代码相关联。

每次滚动条调用OnHScroll时,你的代码都要确定用户的操作。在OnHScroll函数内部,你可以检验传递给处理函数的第一参数,如下所示。如果你与上面的代码一起使用,滚动条的小方块就会移动到用户操作的位置处。

// The message handling function
void CScrollBarWindow::OnHScroll(UINT nSBCode,
UINT nPos, CScrollBar* pScrollBar)
{
int pos;
pos = sb->GetScrollPos();
switch ( nSBCode )
{
case SB_LINEUP:
pos -= 1;
break;
case SB_LINEDOWN:
pos = 1;
break;
case SB_PAGEUP:
pos -= 10;
break;
case SB_PAGEDOWN:
pos = 10;
break;
case SB_TOP:
pos = MIN_RANGE;
break;
case SB_BOTTOM:
pos = MAX_RANGE;
break;

case SB_THUMBPOSITION:
pos = nPos;
break;
default:
return;
}
if ( pos < MIN_RANGE )
pos = MIN_RANGE;
else if ( pos > MAX_RANGE )
pos = MAX_RANGE;
sb->SetScrollPos( pos, TRUE );
}

SB_LINEUP和SB_LINEDOWN的不同常数值在CWnd::OnHScroll函数文档中有介绍。上面的代码首先使用GetScrollPos函数来恢复滚动条的当前位置。然后使用开关语句来确定用户对滚动条的操作。SB_LINEUP 和SB_LINEDOWN常数值意味着垂直方向,但也可用于水平方向表示左右移动。SB_PAGEUP和SB_PAGEDOWN是用在用户单击滚动条时。SB_TOP和SB_BOTTOM用于当用户移动滚动条小方块到滚动条的顶部和底部。SB_THUMBPOSITION用于当用户拖动小方块到指定位置时。代码会自动调整位置,然后确保它在设置其新位置时仍然在范围内。一旦设置了滚动条,小方块就会移动到适当的位置。

垂直滚动条的处理也是类似的,只是要用OnVScroll函数中的SBS_VERT样式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值