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);
正在阅读:
MFC对话框设置滚动条05-21
高送转股中的“除权日效应”研究(一)01-09
大学语文2017秋季学期期末考试答案05-22
《伶官传序》教案12-23
惹恼六年级日记10-29
花落花飞花满天02-13
职业技能实训平台答案-管理会计(三)06-01
羽毛球教练必须知道的十个理论05-20
《NANA》经典语句大全_经典语录04-05
波力尔防水施工工法 - 图文03-06
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 对话框
- 滚动
- 设置
- MFC
- 淡淡的
- 百善孝为先 - 图文
- 如东县2018年初三物理化学二模试卷
- 2017年中考数学考前小题狂做专题22等腰三角形(含解析)
- 2018年西安社保缴纳至退休后能领取到少钱
- 2018-2024年中国冷藏运输箱行业市场调查及投资前景预测报告(目
- 语文:4.16《短文两篇》教案(旧人教版第三册)
- 2007年中考文言文精细阅读之《送东阳马生序》
- 梵高传
- 2013年中考数学小题狂做(与圆有关的计算)含解析
- 湖北省广水市文华高中2017-2018学年高一上学期10月月考历史试题
- “十二五”道路运输应急体系建设规划
- 2011年泰安市基层医疗卫生事业单位公开招聘工作人员报名须知
- 电催化综述
- 家乡的古桥作文600字
- 异丁烯的生产方法及其利用途径
- 运料搬运自动控制系统
- 各 机 台 区 责 任 人:当班操作助手 操作标准 制 约 责 任 1 地
- 人教版四年级语文下册第三单元导学案
- 服装品牌营销传播体系研究