008.MFC_ScrollBar
滚动条
CScrollBar
水平滚动条控件和垂直滚动条
滚动条消息
SB_THUMBTRACK
SB_LINELEFT
SB_LINERIGHT
SB_PAGELEFT
SB_PAGERIGHT
一、建立名为ScrollBar的MFC工程,添加Horizontal Scroll Bar 和 Static Text控件,
修改 static text控件ID属性为IDC_POS,
设置滚动条初始信息,进入ScrollBarDlg.cpp,在BOOL CScrollBarDlg::OnInitDialog()函数中添加
// TODO: 在此添加额外的初始化代码
//滚动条初始化
SCROLLINFO si = {};
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE | SIF_PAGE;
si.nMin = ;
si.nMax = ;
si.nPage = ; m_scroll.SetScrollInfo(&si);
二、滚动条控件添加控制变量m_scroll,静态文本添加value 变量m_pos,并获取文本框WM_HSCROLL消息,进入ScrollBarDlg.cpp,添加
void CScrollBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SCROLLINFO si = {};
si.cbSize = sizeof(si);
//设置获取滚动条所有信息
si.fMask = SIF_ALL;
//获取滚动条信息
pScrollBar->GetScrollInfo(&si); //获取滚动条当前最新的信息
int nNewPos = si.nPos; switch(nSBCode)
{
//拖动滚动条
case SB_THUMBTRACK:
nNewPos = nPos;
break;
//点击箭头左移
case SB_LINELEFT:
nNewPos -= ;
break;
//点击箭头右移
case SB_LINERIGHT:
nNewPos += ;
break;
//向左滚动一页
case SB_PAGELEFT:
nNewPos -= si.nPage;
break;
//向右滚动一页
case SB_PAGERIGHT:
nNewPos += si.nPage;
break;
default:
break;
}
//最大最小值判断
if(nNewPos > si.nMax)
nNewPos = si.nMax;
if(nNewPos < si.nMin)
nNewPos = si.nMin; //设置滚动条
pScrollBar->SetScrollPos(nNewPos); //静态文本框显示当前滚动条数值
CString s;
s.Format(_T("%d"),nNewPos);
m_pos = s;
UpdateData(FALSE); CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
源码:
// ScrollBarDlg.cpp : 实现文件
// #include "stdafx.h"
#include "ScrollBar.h"
#include "ScrollBarDlg.h"
#include "afxdialogex.h" #ifdef _DEBUG
#define new DEBUG_NEW
#endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx
{
public:
CAboutDlg(); // 对话框数据
enum { IDD = IDD_ABOUTBOX }; protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现
protected:
DECLARE_MESSAGE_MAP()
}; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
} void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
} BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP() // CScrollBarDlg 对话框 CScrollBarDlg::CScrollBarDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CScrollBarDlg::IDD, pParent)
, m_pos(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
} void CScrollBarDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SCROLL, m_scroll);
DDX_Text(pDX, IDC_POS, m_pos);
} BEGIN_MESSAGE_MAP(CScrollBarDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_HSCROLL()
END_MESSAGE_MAP() // CScrollBarDlg 消息处理程序 BOOL CScrollBarDlg::OnInitDialog()
{
CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码
//滚动条初始化
SCROLLINFO si = {};
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE | SIF_PAGE;
si.nMin = ;
si.nMax = ;
si.nPage = ; m_scroll.SetScrollInfo(&si); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
} void CScrollBarDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
} // 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。 void CScrollBarDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), ); // 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + ) / ;
int y = (rect.Height() - cyIcon + ) / ; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
} //当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CScrollBarDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
} void CScrollBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SCROLLINFO si = {};
si.cbSize = sizeof(si);
//设置获取滚动条所有信息
si.fMask = SIF_ALL;
//获取滚动条信息
pScrollBar->GetScrollInfo(&si); //获取滚动条当前最新的信息
int nNewPos = si.nPos; switch(nSBCode)
{
//拖动滚动条
case SB_THUMBTRACK:
nNewPos = nPos;
break;
//点击箭头左移
case SB_LINELEFT:
nNewPos -= ;
break;
//点击箭头右移
case SB_LINERIGHT:
nNewPos += ;
break;
//向左滚动一页
case SB_PAGELEFT:
nNewPos -= si.nPage;
break;
//向右滚动一页
case SB_PAGERIGHT:
nNewPos += si.nPage;
break;
default:
break;
}
//最大最小值判断
if(nNewPos > si.nMax)
nNewPos = si.nMax;
if(nNewPos < si.nMin)
nNewPos = si.nMin; //设置滚动条
pScrollBar->SetScrollPos(nNewPos); //静态文本框显示当前滚动条数值
CString s;
s.Format(_T("%d"),nNewPos);
m_pos = s;
UpdateData(FALSE); CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
008.MFC_ScrollBar的更多相关文章
- MFC入门
目录 001.MFC_应用程序类型 002.MFC_对话框_静态文本_编辑框 003.MFC_对话框_访问控件_7种方法_A 004.MFC_对话框_访问控件_7种方法_B 005.M ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数008,matrix,矩阵函数
** 3dFromFundamentalMatrix( Rows1, Cols1, Rows2, Cols2, CovRR1, CovRC1, CovCC1, CovRR2, CovRC2, CovC ...
- php大力力 [008节]局部表量
2015-08-23 php大力力008. php局部表量 开始写简单程序,遇到几个小困难障碍. 第一个:不要少写最后一个问号❓ <?php echo 'HELLO WORLD';?> 程 ...
- [反汇编练习] 160个CrackMe之008
[反汇编练习] 160个CrackMe之008. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- 极客技术专题【008期】:CSS3核心技术:选择器
日期:2013-8-19 来源:GBin1.com 技术专题介绍 技术专题:CSS3核心技术:选择器 专题演讲稿:CSS3选择器 分享人:知名前端技术博客 - w3cplus.com 博主 - 大漠 ...
- 期刊:DOI :10.3969/j.issn.1001-2400.2012.01.008
DOI:10.3969/j.issn.1001-2400.2012.01.008 “/” 分为前缀和后缀两部分中间用一斜杠分开,前缀中又以小圆点分为两部分. "DOI":一篇期刊论 ...
- Python:每日一题008
题目: 判断101-200之间有多少个素数,并输出所有素数. 程序分析: 判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数. 个人思路及代码: li ...
- AtCoder Grand Contest 008
AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...
- 第008课_第1个ARM落版程序及引申
form:第008课_第1个ARM裸板程序及引申 第001节_辅线1_硬件知识_LED原理图 当我们学习C语言的时候,我们会写个Hello程序.那当我们下ARM程序,也该有一个简单的程序引领我们入门, ...
随机推荐
- POJ-3026_Borg Maze
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Description The Borg is an immensely powerful race ...
- HZOJ 连连看
考场几乎想到了正解,然而我也不知道当时在想啥,在没有证伪的情况下只是觉得无法实现就否了…… 最后打的好象是达哥说的O(4*15*n*m),复杂度不是很会证反正T成了暴力…… 题解: 对于测试点8,9, ...
- 【NS2】Ubuntu 12.04 LTS 中文输入法的安装(转载)
本文是笔者使用 Ubuntu 操作系统写的第一篇文章!参考了红黑联盟的这篇文章:Ubuntu 12.04中文输入法的安装 安装 Ubuntu 12.04 着实费力一番功夫,老是在用 Ubuntu 来引 ...
- 容器化ICT融合初体验
[编者的话]本次将分享的容器化ICT融合平台是一种面向未来ICT系统的新型云计算PaaS平台,它基于容器这一轻量级的虚拟化技术以及自动化的"微服务"管理架构,能够有效支撑应用快速上 ...
- 防止chrome主页被篡改并设置为默认打开无痕浏览方式
1. 找到chrome的快捷方式, 右击打开属性 2. 将目标框内容改为以下内容chrome.exe的目录位置 // ----- 引号中的内容为"PATH\Chrome\Applicatio ...
- Hbase API: 写入Bigtable.
- Spark-shell批量命令执行脚本
#!/bin/bash source /etc/profile exec $SPARK_HOME/bin/spark-shell --queue tv --name spark-sql-test -- ...
- CODE FESTIVAL 2017 qual A B fLIP(补题)
平时没见过这样的题目,看到后很懵逼.没想到. 思路:按下按钮的顺序并不影响结果,一个按钮要么按一次,要么不按,按多了也没用,比如:按3次和按1次没啥区别. 假设这是个M * N的矩阵,我们已经按下了k ...
- hadoop2.6.0 + hbase-1.0.0 伪分布配置
1 基本配置 主机名: 192.168.145.154 hadoop2 ======= 2 etc/hadoop下文件配置 1)core-site.xml <configuration> ...
- colab找不到模块 no name
https://www.jianshu.com/p/2cf00bb9db34?utm_source=oschina-app 穷学生学习神经网络一定体会过“等待”的痛苦... 循环一次epoch急死人, ...