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程序,也该有一个简单的程序引领我们入门, ...
随机推荐
- 转载 LibGDX: 使用 Gradle 命令运行和打包项目
版权声明:本文为csdn xietansheng 博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: http://blog.csdn.net/xieta ...
- Tcp之双向通信
TestServer.java package com.sxt.tcp; /* * 服务端 */ import java.io.DataInputStream; import java.io.Data ...
- SDUT-3344_数据结构实验之二叉树五:层序遍历
数据结构实验之二叉树五:层序遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一个按先序输入的字符序列,如abd ...
- 模板—Hash_map
struct Hash_map { ],nx[]; ];]; inline double &operator [] (int x) { ,i=fi[k]; for(;i&&st ...
- 数据节点Datanodes
- NSDate 格式化含有毫秒
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"]; 版权声明:本文为博主原创文章,未经博主允许不得转载.
- day3_python之函数返回值、语句形式、表达式形式
一. 函数对象 1. 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二.返回值 return的返回值没有类型 ...
- iptables 连线追踪(Connection tracking)
「连線追蹤」:提供可用於判断包相关性的额外资讯.举例来說,一次FTP session同时需要两条分离的连線,控制与资料传输各一:用於追蹤FTP连線的扩充模组,运用对於FTP恊定的认知,从控制连線上流动 ...
- zoj 3859 DoIt is Being Flooded (MFSet && Flood Fill)
ZOJ :: Problems :: Show Problem 这题开始的时候想不到怎么调整每个grid的实际淹没时间,于是只好找了下watashi的题解,发现这个操作还是挺简单的. ZOJ3354 ...
- 在对文件进行随机读写,RandomAccessFile类,如何提高其效率
花1K内存实现高效I/O的RandomAccessFile类 JAVA的文件随机存取类(RandomAccessFile)的I/O效率较低.通过分析其中原因,提出解决方案.逐步展示如何创建具备缓存读写 ...