当前位置:网站首页>MFC窗口滚动条用法
MFC窗口滚动条用法
2022-07-01 03:19:00 【三贝勒文子】
Hello小伙伴们,好几天没更新公众号了,因为文子回家吃粽子去了。
今天要给大家分享一个窗口滚动条的用法。你会好奇滚动条是什么?滚动条就是可以滚动的条,如图所示:

上面这个就是滚动条啦,那么它的作用是什么呢?你可以想想在一个大小固定的界面上,你的空间特别多,多到界面已经没有空隙可以放置的时候,这个时候就需要滚动条来协助界面的扩展了,啥都别说,先看效果图:

这是没有使用界面滚动条的效果,我们可以看到这个界面上有24个按钮,这24个按钮固定排列着,然后界面的宽度和高度已经是固定的长度了,接下来我们看一下加了滚动条的效果图:

可以看到界面上出现了水平滚动条和垂直滚动条,可以上下拉动滚动条进行界面的垂直扩展,也可以左右拉动滚动条进行界面的水平扩展。但是,存在一个问题就是:当你拉动滚动条的时候,界面是没有反应的,是因为我们的代码中没有添加滚动条的事件函数,需要在这个界面的代码中添加滚动条的响应函数。
界面添加滚动条的做法是:
选中界面;
点击界面属性,将属性中的“垂直滚动条”和“水平滚动条”均设置为True;
然后在类视图中选中这个界面的类,然后右键点击属性,然后选择属性中的消息,在消息中寻找WM_HSCROLL和WM_VSCROLL,添加这两个事件函数:


然后在这两个时间函数中添加以下代码:
void CceshiDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
SCROLLINFO scrollinfo;
GetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
//
switch (nSBCode)
{
case SB_LEFT:
ScrollWindow((scrollinfo.nPos - scrollinfo.nMin) * 10, 0);
scrollinfo.nPos = scrollinfo.nMin;
SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
break;
case SB_RIGHT:
ScrollWindow((scrollinfo.nPos - scrollinfo.nMax) * 10, 0);
scrollinfo.nPos = scrollinfo.nMax;
SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
break;
case SB_LINELEFT:
scrollinfo.nPos -= 1;
if (scrollinfo.nPos < scrollinfo.nMin)
{
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
ScrollWindow(10, 0);
break;
case SB_LINERIGHT:
scrollinfo.nPos += 1;
if (scrollinfo.nPos > scrollinfo.nMax)
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
ScrollWindow(-10, 0);
break;
case SB_PAGELEFT:
scrollinfo.nPos -= 5;
if (scrollinfo.nPos < scrollinfo.nMin)
{
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
ScrollWindow(10 * 5, 0);
break;
case SB_PAGERIGHT:
scrollinfo.nPos += 5;
if (scrollinfo.nPos > scrollinfo.nMax)
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
ScrollWindow(-10 * 5, 0);
break;
case SB_THUMBPOSITION:
break;
case SB_THUMBTRACK:
ScrollWindow((scrollinfo.nPos - nPos) * 10, 0);
scrollinfo.nPos = nPos;
SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
break;
case SB_ENDSCROLL:
break;
}
}
void CceshiDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
SCROLLINFO scrollinfo;
GetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
switch (nSBCode)
{
case SB_LINEUP: //Scroll one line up
scrollinfo.nPos -= 1;
if (scrollinfo.nPos < scrollinfo.nMin)
{
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
ScrollWindow(0, 10);
break;
case SB_LINEDOWN: //Scroll one line down
scrollinfo.nPos += 1;
if (scrollinfo.nPos + scrollinfo.nPage > scrollinfo.nMax) //此处一定要注意加上滑块的长度,再作判断
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
ScrollWindow(0, -10);
break;
case SB_PAGEUP: //Scroll one page up.
scrollinfo.nPos -= 5;
if (scrollinfo.nPos <= scrollinfo.nMin)
{
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
ScrollWindow(0, 10 * 5);
break;
case SB_PAGEDOWN: //Scroll one page down
scrollinfo.nPos += 5;
if (scrollinfo.nPos + scrollinfo.nPage >= scrollinfo.nMax) //此处一定要注意加上滑块的长度,再作判断
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
ScrollWindow(0, -10 * 5);
break;
case SB_ENDSCROLL: //End scroll
break;
case SB_THUMBPOSITION: //Scroll to the absolute position. The current position is provided in nPos
break;
case SB_THUMBTRACK: //Drag scroll box to specified position. The current position is provided in nPos
ScrollWindow(0, (scrollinfo.nPos - nPos) * 10);
scrollinfo.nPos = nPos;
SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
break;
}
}
添加后运行可以看到界面的效果如下图所示:

也就是滚动条可以被任意拉动了,界面可以被水平和垂直方向进行扩展显示。
边栏推荐
- C language EXECL function
- Pyramid Scene Parsing Network【PSPNet】论文阅读
- Random seed torch in deep learning manual_ seed(number)、torch. cuda. manual_ seed(number)
- Pyramid scene parsing network [pspnet] thesis reading
- Detailed list of errors related to twincat3 ads of Beifu
- ASGNet论文和代码解读2
- JS日常开发小技巧(持续更新)
- Leetcode 1482 guess, how about this question?
- Cookie&Session
- Basic concepts of database
猜你喜欢

Edge drawing: a combined real-time edge and segment detector

idea插件备份表

Feature pyramid networks for object detection

小程序容器技术与物联网IoT的结合点

实现pow(x,n)函数

Avalanche problem and the use of sentinel

RSN:Learning to Exploit Long-term Relational Dependencies in Knowledge Graphs

FCN full Convolution Network Understanding and Code Implementation (from pytorch Official Implementation)

后台系统页面左边菜单按钮和右边内容的处理,后台系统页面出现双滚动

Hal library operation STM32 serial port
随机推荐
[reading notes] copywriting realization -- four golden steps for writing effective copywriting
TEC: Knowledge Graph Embedding with Triple Context
JS daily development tips (continuous update)
LeetCode 31下一个排列、LeetCode 64最小路径和、LeetCode 62不同路径、LeetCode 78子集、LeetCode 33搜索旋转排序数组(修改二分法)
10、Scanner.next() 无法读取空格/indexOf -1
leetcode 1482 猜猜看啊,这道题目怎么二分?
Pytorch training deep learning network settings CUDA specified GPU visible
idea插件备份表
Appium自动化测试基础 — APPium基本原理
深度学习中的随机种子torch.manual_seed(number)、torch.cuda.manual_seed(number)
ctfshow爆破wp
数据交换 JSON
5、【WebGIS实战】软件操作篇——服务发布及权限管理
Asgnet paper and code interpretation 2
Leetcode 1818 absolute value, sorting, dichotomy, maximum value
JUC学习
Depth first traversal of C implementation Diagram -- non recursive code
LeetCode 144二叉树的前序遍历、LeetCode 114二叉树展开为链表
Basic concepts of database
5. [WebGIS practice] software operation - service release and permission management