滚动条

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的更多相关文章

  1. MFC入门

    目录 001.MFC_应用程序类型    002.MFC_对话框_静态文本_编辑框  003.MFC_对话框_访问控件_7种方法_A   004.MFC_对话框_访问控件_7种方法_B   005.M ...

  2. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数008,matrix,矩阵函数

    ** 3dFromFundamentalMatrix( Rows1, Cols1, Rows2, Cols2, CovRR1, CovRC1, CovCC1, CovRR2, CovRC2, CovC ...

  3. php大力力 [008节]局部表量

    2015-08-23 php大力力008. php局部表量 开始写简单程序,遇到几个小困难障碍. 第一个:不要少写最后一个问号❓ <?php echo 'HELLO WORLD';?> 程 ...

  4. [反汇编练习] 160个CrackMe之008

    [反汇编练习] 160个CrackMe之008. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  5. 极客技术专题【008期】:CSS3核心技术:选择器

    日期:2013-8-19  来源:GBin1.com 技术专题介绍 技术专题:CSS3核心技术:选择器 专题演讲稿:CSS3选择器 分享人:知名前端技术博客 - w3cplus.com 博主 - 大漠 ...

  6. 期刊:DOI :10.3969/j.issn.1001-2400.2012.01.008

    DOI:10.3969/j.issn.1001-2400.2012.01.008 “/” 分为前缀和后缀两部分中间用一斜杠分开,前缀中又以小圆点分为两部分. "DOI":一篇期刊论 ...

  7. Python:每日一题008

    题目: 判断101-200之间有多少个素数,并输出所有素数. 程序分析: 判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数. 个人思路及代码: li ...

  8. AtCoder Grand Contest 008

    AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...

  9. 第008课_第1个ARM落版程序及引申

    form:第008课_第1个ARM裸板程序及引申 第001节_辅线1_硬件知识_LED原理图 当我们学习C语言的时候,我们会写个Hello程序.那当我们下ARM程序,也该有一个简单的程序引领我们入门, ...

随机推荐

  1. maven 从svn导入项目遇到的问题 No marketplace entries found to handle yuicompressor maven plugin:1.3.0:compile

    版权声明:本文为博主原创文章,未经博主同意不得转载.安金龙 的博客. https://blog.csdn.net/smile0198/article/details/25463825 RT.使用ecl ...

  2. Java练习 SDUT-1200_汉诺塔

    汉诺塔 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 汉诺塔(又称河内塔)问题是印度的一个古老的传说. 开天辟地的神勃 ...

  3. HZOJ Drink

    神仙题,打了个whs式暴力卡常卡A了(我没脸),正解还是要打的,然而作者的题解看不懂…… Drink: 看惯了罗马音的小朋友们都会知道r发l的音,题目名:D Link. 每次修改都会改变O( N ^  ...

  4. oracle函数 TRIM(c1 from c2)

    [功能]删除左边和右边出现的字符串 [参数]C2 删除前字符串 c1 删除字符串,默认为空格 [返回]字符型 [示例] select TRIM('X' from 'XXXgao qian jingXX ...

  5. 「BZOJ2654」tree

    「BZOJ2654」tree 最小生成树+二分答案. 最开始并没有觉得可以二分答案,因为答案并不单调啊. 其实根据题意,白边的数目肯定大于need条,而最小生成树的白边数并不等于need(废话),可以 ...

  6. protobuf DNK下的编译

    protobuffer 编译配置 mkdir -p ./cmake/build cd ./cmake/build cmake \ -Dprotobuf_BUILD_SHARED_LIBS=OFF \ ...

  7. H3C 用交换机扩展以太网拓扑

  8. H3C CSMA/CD冲突检测和退避

  9. Lua环境搭建之使用EditPlus搭建Lua开发环境

    luatools正则表达式extension工具encoding 一.语法高亮 打开 EditPlus,Tools 工具-->Preferences首选项==>setting & ...

  10. codeforces 616D

    题意:给你n个数,找出一个最大的区间,满足:不同的数值个数不超过k; //我开始又看错题了. 以为是找出一个最大区间,里面的数的最大值不超过k; 思路:利用一个窗口滑动,左端点表示当前位置,右端点表示 ...