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程序,也该有一个简单的程序引领我们入门, ...
随机推荐
- hdu4324 dfs
scanf("%1d")这种好像很慢. #include<stdio.h> #include<string.h> #define maxn 2010 str ...
- hdu1564 简单博弈
多画几个图可以发现规律: #include<stdio.h> int main() { int i,n; while(scanf("%d",&n)!=EOF) ...
- 在laravel框架中使用ajax请求报错419
laravel框架中报419 419 unknown status 这个时候你需要将这个接口放到api路由上,这样可以跳过CSRF的检查
- oracle函数 RAWTOHEX(c1)
[功能]将一个二进制构成的字符串转换为十六进制 [参数]c1,二进制的字符串 [返回]字符串 [示例] select RAWTOHEX('A123') from dual;
- Java练习 SDUT-1194_余弦
C语言实验--余弦 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入n的值,计算cos(x). Input 输入数据 ...
- Python基础:05集合类型
Python中,集合对象是一组无序排列的可哈希的值.所以集合成员可以做字典中的键.集合中的元素都是唯一的. 集合(sets)有两种不同的类型,可变集合(set) 和 不可变集合(frozenset). ...
- 插入blob字段的简单方法
1. 按普通方法组织插入语句 ,f2为Blob型字段 insert into table (f1,f2,f3) values ('a',:para,'c') 2.对应每个blob型字段,OracleC ...
- 微信小程序 mode 的几种模式
mode="aspectFill" mode 有效值: mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式. 模式 值 说明缩放 scaleToFill 不保持纵 ...
- H3C UDP封装
- JavaScript 拖曳和居中问题
今天遇到了一个问题,是这样的,有一个div盒子,实现盒子居中,居中的样式是这样的见下 #box{ width:300px; height:150px; position:absolute; left: ...