MFC对话框设置滚动条

更新时间:2024-05-21 11:00:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

对话框设置滚动条

1. 在OnInitDialog()函数中,添加以下代码

//在OnInitDialog里添加如下代码为对话框创建一个垂直滚动条和水平滚动条 //获取窗口的大小 CRect rc;

GetClientRect(&rc);

const SIZE sz = { rc.right - rc.left, rc.bottom - rc.top };

//垂直滚动条 SCROLLINFO vsi;

vsi.cbSize = sizeof(SCROLLINFO);//必须

vsi.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;

vsi.nPos = 1;//滚动条的初始位置

vsi.nMin = 0;//滚动条所能滚动的最小值

vsi.nMax = sz.cy+500; //滚动条所能滚动的最大值,可以根据实际情况设置 vsi.nPage = sz.cy;//一页的大小

SetScrollInfo(SB_VERT, &vsi, FALSE); //此函数将产生一个垂直滚动条

//水平滚动条 SCROLLINFO hsi;

hsi.cbSize = sizeof(SCROLLINFO);//必须

hsi.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; hsi.nPos = 1;//滚动条的初始位置

hsi.nMin = 0;//滚动条所能滚动的最小值

hsi.nMax = sz.cx+100; //滚动条所能滚动的最大值,可以根据实际情况设置 hsi.nPage = sz.cx;//一页的大小

SetScrollInfo(SB_HORZ, &hsi, FALSE); //此函数将产生一个水平滚动条

2. 在对话框头文件(.h)中加入以下函数

//获取滚动条的位置 //parameters:

//int nBar -- 滚动条类型(垂直或者水平),垂直为SB_VERT,水平为SB_HORZ //UINT nSBCode -- 滚动条触发的消息 //return values -- 返回滚动条的位置 int GetScrollPos(int nBar, UINT nSBCode);

//根据滚动条的位置滚动界面 //parameters:

//int nBar -- 滚动条类型(垂直或者水平),垂直为SB_VERT,水平为SB_HORZ //int nPos -- 滚动条的位置

void ScrollClient(int nBar, int nPos);

//设置滚动条滚动,以及滚动的时候界面跟着滚动 //parameters:

//int nBar -- 滚动条类型(垂直或者水平),垂直为SB_VERT,水平为SB_HORZ //UINT nSBCode -- 滚动条触发的消息 void Scroll(int nBar, UINT nSBCode);

3. 在对话框源文件(.cpp)中实现以下函数

//获取滚动条的位置 //parameters:

//int nBar -- 滚动条类型(垂直或者水平),垂直为SB_VERT,水平为SB_HORZ //UINT nSBCode -- 滚动条触发的消息 //return values -- 返回滚动条的位置

int CScrollBarDlg::GetScrollPos(int nBar, UINT nSBCode) {

SCROLLINFO si;

si.cbSize = sizeof(SCROLLINFO);

si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS; GetScrollInfo(nBar, &si);

const int minPos = si.nMin;

const int maxPos = si.nMax - (si.nPage - 1);

int result = -1; if (SB_VERT == nBar) { //垂直滚动条的消息 switch(nSBCode) { case SB_LINEUP /*SB_LINELEFT*/: result = max(si.nPos - 5, minPos); break; case SB_LINEDOWN /*SB_LINERIGHT*/: result = min(si.nPos + 5, maxPos); break; case SB_PAGEUP /*SB_PAGELEFT*/: result = max(si.nPos - (int)si.nPage, minPos); break; case SB_PAGEDOWN /*SB_PAGERIGHT*/: result = min(si.nPos + (int)si.nPage, maxPos); break; case SB_THUMBPOSITION: // do nothing break; case SB_THUMBTRACK: result = si.nTrackPos; break; case SB_TOP /*SB_LEFT*/: result = minPos; break; case SB_BOTTOM /*SB_RIGHT*/: result = maxPos; break; case SB_ENDSCROLL: // do nothing break; } }

else if (SB_HORZ == nBar) {

//水平滚动条的消息 switch(nSBCode) { case SB_LINELEFT: result = max(si.nPos - 5, minPos); break; case SB_LINERIGHT: result = min(si.nPos + 5, maxPos); break; case SB_PAGELEFT: result = max(si.nPos - (int)si.nPage, minPos); break; case SB_PAGERIGHT: result = min(si.nPos + (int)si.nPage, maxPos); break; case SB_THUMBPOSITION: // do nothing break; case SB_THUMBTRACK: result = si.nTrackPos; break; case SB_LEFT: result = minPos; break; case SB_RIGHT: result = maxPos; break; case SB_ENDSCROLL: // do nothing break; } }

return result; }

//根据滚动条的位置滚动界面 //parameters:

//int nBar -- 滚动条类型(垂直或者水平),垂直为SB_VERT,水平为SB_HORZ //int nPos -- 滚动条的位置

void CScrollBarDlg::ScrollClient(int nBar, int nPos) {

static int s_prevx = 1; static int s_prevy = 1; int cx = 0; int cy = 0; int& deltay = cy;

int& prevy = s_prevy; int& deltax = cx;

int& prevx = s_prevx; if (SB_VERT == nBar) { //垂直滚动 deltay = prevy - nPos; prevy = nPos; }

else if (SB_HORZ == nBar) { //水平滚动 deltax = prevx - nPos; prevx = nPos; }

if(cx || cy) {

ScrollWindow(cx, cy, NULL, NULL); } }

//设置滚动条滚动,以及滚动的时候界面跟着滚动 //parameters:

//int nBar -- 滚动条类型(垂直或者水平),垂直为SB_VERT,水平为SB_HORZ //UINT nSBCode -- 滚动条触发的消息

void CScrollBarDlg::Scroll(int nBar, UINT nSBCode) {

const int scrollPos = GetScrollPos(nBar,nSBCode);

if(scrollPos == -1) return;

SetScrollPos(nBar, scrollPos, TRUE); ScrollClient(nBar, scrollPos); }

4. 添加垂直滚动条消息(WV_VSCROLL)响应函数OnVScroll和在函数中加入以下代码

void CScrollBarDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {

// TODO: Add your message handler code here and/or call default Scroll(SB_VERT,nSBCode);//添加

CDialog::OnVScroll(nSBCode, nPos, pScrollBar); }

5. 添加水平滚动条消息(WV_HSCROLL)响应函数和在函数中加入以下代码

void CScrollBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {

// TODO: Add your message handler code here and/or call default }

Scroll(SB_HORZ,nSBCode); //添加

CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

本文来源:https://www.bwwdw.com/article/wqf7.html

Top