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

也就是滚动条可以被任意拉动了,界面可以被水平和垂直方向进行扩展显示。
边栏推荐
- File upload and download
- Research on target recognition and tracking based on 3D laser point cloud
- 终极套娃 2.0 | 云原生交付的封装
- Introduction to EtherCAT
- Learning notes for introduction to C language multithreaded programming
- 文件上传下载
- Hal library setting STM32 interrupt
- 【伸手党福利】JSONObject转String保留空字段
- C语言的sem_t变量类型
- Golang multi graph generation gif
猜你喜欢

idea插件备份表

Ultimate dolls 2.0 | encapsulation of cloud native delivery

Leetcode 128 longest continuous sequence (hash set)

Hello World generation

数据交换 JSON

服务器渲染技术jsp

The value of the second servo encoder is linked to the NC virtual axis of Beifu PLC for display

C语言的sem_t变量类型

E15 solution for cx5120 controlling Huichuan is620n servo error

LeetCode 144二叉树的前序遍历、LeetCode 114二叉树展开为链表
随机推荐
Leetcode:829. Sum of continuous integers
pytorch nn.AdaptiveAvgPool2d(1)
Use of comment keyword in database
Feature pyramid networks for object detection
ECMAScript 6.0
ECMAScript 6.0
leetcode 1482 猜猜看啊,这道题目怎么二分?
BluePrism注册下载并安装-RPA第一章
Detailed list of errors related to twincat3 ads of Beifu
Gorilla/mux framework (RK boot): RPC error code design
4. [WebGIS practice] software operation chapter - data import and processing
Develop industrial Internet with the technical advantages of small programs
静态库使用MFC和共享库使用MFC的区别
数据库DDL(Data Definition Language,数据定义语言)知识点
Ultimate dolls 2.0 | encapsulation of cloud native delivery
10、Scanner. Next() cannot read spaces /indexof -1
排序链表(归并排序)
ASGNet论文和代码解读2
[us match preparation] complete introduction to word editing formula
ctfshow爆破wp