给对话框应用程序添加滚动条+处理过界空白区问题

xlf0995 2011-05-31 11:25:49
在对话框上要应用滚动条,首先当然是要将对话框的属性vertical scroll选中(在这里只介绍纵向滚动条,横向滚动条与之原理相同)。然后是按Ctlr+w进入classwizard选中对话消息WM_VSCROLL,并添加它的响应函数,接着进入代码编辑区,写入代码:
void CRq::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

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

SCROLLINFO scrollinfo;

GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

switch (nSBCode)

{

case SB_BOTTOM:

ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax));

scrollinfo.nPos = scrollinfo.nMax;

SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

break;

case SB_TOP:

ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin));

scrollinfo.nPos = scrollinfo.nMin;

SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

break;

case SB_LINEUP:

scrollinfo.nPos -= 5;

if (scrollinfo.nPos<scrollinfo.nMin)

{

scrollinfo.nPos = scrollinfo.nMin;

break;

}

SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

ScrollWindow(0,5);

break;

case SB_LINEDOWN:

scrollinfo.nPos += 5;

if (scrollinfo.nPos>scrollinfo.nMax)

{

scrollinfo.nPos = scrollinfo.nMax;

break;

}

SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

ScrollWindow(0,-5);

break;

case SB_PAGEUP:

scrollinfo.nPos -= 5;

if (scrollinfo.nPos<scrollinfo.nMin)

{

scrollinfo.nPos = scrollinfo.nMin;

break;

}

SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

ScrollWindow(0,5);

break;

case SB_PAGEDOWN:

scrollinfo.nPos += 5;

if (scrollinfo.nPos>scrollinfo.nMax)

{

scrollinfo.nPos = scrollinfo.nMax;

break;

}

SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

ScrollWindow(0,-5);

break;

case SB_ENDSCROLL:

// MessageBox("SB_ENDSCROLL");

break;

case SB_THUMBPOSITION:

// ScrollWindow(0,(scrollinfo.nPos-nPos));

// scrollinfo.nPos = nPos;

// SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

break;

case SB_THUMBTRACK:

ScrollWindow(0,(scrollinfo.nPos-nPos));

scrollinfo.nPos = nPos;

SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

break;

}

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

}

以上代码完成后,滚动条已可以使用了。

但是应该如何将其它控件安排在对话框呢?很简单,你想用多大的对话框就将它拉多大,只需要在对话框所用的xxxx.cpp文件的void Cxxxx::DoDataExchange(CDataExchange* pDX)函数体中写入代码:

SetWindowPos(NULL,0,0,800,600,SWP_NOMOVE | SWP_NOZORDER);

其中800和600两个数字分别为对话框创建时的宽度和高度。

这样就可以方便地使用滚动条了。

网上找了很多人都用这个代码,但是基本都是到这里就结束了,但是这是还存在一点问题,就是滚动条的范围超大,滚动块拉到下面就是空白区,这里提供个解决方法:

在自己的对话框类中添加消息响应函数OnSize()

void C******Dlg::OnSize(UINT nType, int cx, int cy)
{
SCROLLINFO scrollinfo;

SetScrollRange (SB_VERT, 0, 600, TRUE);//这个就是设置你的滚动条的范围

GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
scrollinfo.nPage=400;//页的大小,
SetScrollInfo(SB_VERT,&scrollinfo,SIF_PAGE);

CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
}
滚动块的大小就是400/600即你滚动条总长度的三分之二,自己调调看这两个数,体会一下滚动块的变化就知道了。


第一次发帖,错误之处望见谅
...全文
90 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-06-22
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧