当前位置:网站首页>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;
}
}
添加后运行可以看到界面的效果如下图所示:

也就是滚动条可以被任意拉动了,界面可以被水平和垂直方向进行扩展显示。
边栏推荐
- Leetcode: offer 59 - I. maximum value of sliding window
- Asgnet paper and code interpretation 2
- 5. [WebGIS practice] software operation - service release and permission management
- 用小程序的技术优势发展产业互联网
- Explain spark operation mode in detail (local+standalone+yarn)
- Edge Drawing: A combined real-time edge and segment detector 翻译
- The preorder traversal of leetcode 144 binary tree and the expansion of leetcode 114 binary tree into a linked list
- Introduction to EtherCAT
- 服务器渲染技术jsp
- leetcode 1818 绝对值,排序,二分法,最大值
猜你喜欢

The preorder traversal of leetcode 144 binary tree and the expansion of leetcode 114 binary tree into a linked list

FCN full Convolution Network Understanding and Code Implementation (from pytorch Official Implementation)
![[us match preparation] complete introduction to word editing formula](/img/e4/5ef19d52cc4ece518e79bf10667ef4.jpg)
[us match preparation] complete introduction to word editing formula

ctfshow爆破wp

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

Pytorch training deep learning network settings CUDA specified GPU visible

Feign远程调用和Getaway网关

Thread data sharing and security -threadlocal

IPv4和IPv6、局域网和广域网、网关、公网IP和私有IP、IP地址、子网掩码、网段、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?

TEC: Knowledge Graph Embedding with Triple Context
随机推荐
详解Spark运行模式(local+standalone+yarn)
The value of the second servo encoder is linked to the NC virtual axis of Beifu PLC for display
[small sample segmentation] interpretation of the paper: prior guided feature enrichment network for fee shot segmentation
FCN全卷积网络理解及代码实现(来自pytorch官方实现)
LeetCode 128最长连续序列(哈希set)
gcc使用、Makefile总结
Feign remote call and getaway gateway
Pathmeasure implements loading animation
LeetCode 144二叉树的前序遍历、LeetCode 114二叉树展开为链表
在线公网安备案保姆级教程【伸手党福利】
How do spark tasks of 10W workers run? (Distributed Computing)
How to display scrollbars on the right side of the background system and how to solve the problem of double scrollbars
实现pow(x,n)函数
ECMAScript 6.0
Leetcode:829. Sum of continuous integers
Appium自动化测试基础 — APPium基本原理
Pytorch training deep learning network settings CUDA specified GPU visible
Basic concept and classification of sorting
Take you through a circuit board, from design to production (dry goods)
Feign远程调用和Getaway网关