Drawcli分析
当前环境:windows7 32位旗舰版、VS2010旗舰版
Drawcli介绍:
Drawcli是VS2010中的一个示例程序,能够进行简单的绘图操作,例如线、矩形、圆角矩形、多边形等,位于VS安装目录"Microsoft Visual Studio 10.0\Samples\2052\VC2010Samples\C++\MFC\ole\drawcli"下。
1、对象的绘画。
void CDrawView::OnDraw(CDC* pDC)
{
pDoc->Draw(pDrawDC, this);//CDrawDoc::Draw()
} void CDrawDoc::Draw(CDC* pDC, CDrawView* pView)
{
POSITION pos = m_objects.GetHeadPosition();
while (pos != NULL)
{
CDrawObj* pObj = m_objects.GetNext(pos);
pObj->Draw(pDC);//绘画图形
if (pView->m_bActive &&
!pDC->IsPrinting() &&
pView->IsSelected(pObj)//判断对象是否在视图的选中列表中,视图使用CDrawObjList m_selection来存储选中图形的指针。
)
{
pObj->DrawTracker(pDC, CDrawObj::selected);//绘画选中图形时的靶点
}
}
}
2、对象的存储。
通过对象的绘画我们可以知道,对象存储在文档类CDrawDoc的中,即CDrawObjList m_objects中,视图中存储了选中对象的指针在列表中,即CDrawObjList m_selection中。
3、对象的操作。
添加线、添加矩形、添加圆角矩形、添加椭圆等操作由CRectTool类进行处理;添加多边形由CPolyTool类进行处理;操作以存在的对象由CSelectTool类进行处理。
static CSelectTool selectTool;
static CRectTool lineTool(line);
static CRectTool rectTool(rect);
static CRectTool roundRectTool(roundRect);
static CRectTool ellipseTool(ellipse);
static CPolyTool polyTool;
这里使用Tool类来完成一个特定功能,例如添加线条、添加矩形、添加多边形等等,有点类似于命令模式,这样做的好处是符合封装的特性,降低耦合度,修改一个功能不影响其他的功能。一般绘图软件都需要这样的类,用tool来处理特定功能的鼠标操作,而在不涉及鼠标操作,可以使用命令模式。
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
if (!m_bActive)
return;
CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape);
if (pTool != NULL)
{
pTool->OnLButtonDown(this, nFlags, point);
}
} void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
if (!m_bActive)
return;
CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape);
if (pTool != NULL)
pTool->OnLButtonUp(this, nFlags, point);
} void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bActive)
return;
CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape);
if (pTool != NULL)
pTool->OnMouseMove(this, nFlags, point);
}
在选择不同的功能时,只需要设置CDrawTool::c_drawShape的值,便会在执行鼠标操作时选择相互匹配的工具来进行处理。
void CDrawView::OnDrawSelect()//选择工具
{
CDrawTool::c_drawShape = selection;
} void CDrawView::OnDrawRoundRect()//添加圆角矩形
{
CDrawTool::c_drawShape = roundRect;
} void CDrawView::OnDrawRect()//添加矩形
{
CDrawTool::c_drawShape = rect;
} void CDrawView::OnDrawLine()//添加直线
{
CDrawTool::c_drawShape = line;
} void CDrawView::OnDrawEllipse()//添加椭圆
{
CDrawTool::c_drawShape = ellipse;
} void CDrawView::OnDrawPolygon()//添加多边形
{
CDrawTool::c_drawShape = poly;
}
Drawcli分析的更多相关文章
- alias导致virtualenv异常的分析和解法
title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...
- 火焰图分析openresty性能瓶颈
注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...
- 一起来玩echarts系列(一)------箱线图的分析与绘制
一.箱线图 Box-plot 箱线图一般被用作显示数据分散情况.具体是计算一组数据的中位数.25%分位数.75%分位数.上边界.下边界,来将数据从大到小排列,直观展示数据整体的分布情况. 大部分正常数 ...
- 应用工具 .NET Portability Analyzer 分析迁移dotnet core
大多数开发人员更喜欢一次性编写好业务逻辑代码,以后再重用这些代码.与构建不同的应用以面向多个平台相比,这种方法更加容易.如果您创建与 .NET Core 兼容的.NET 标准库,那么现在比以往任何时候 ...
- UWP中新加的数据绑定方式x:Bind分析总结
UWP中新加的数据绑定方式x:Bind分析总结 0x00 UWP中的x:Bind 由之前有过WPF开发经验,所以在学习UWP的时候直接省略了XAML.数据绑定等几个看着十分眼熟的主题.学习过程中倒是也 ...
- 查看w3wp进程占用的内存及.NET内存泄露,死锁分析
一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...
- ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
随机推荐
- ajax通过设置Access-Control-Allow-Origin来实现跨域访问
[在被请求的Response header中加入] // 指定允许其他域名访问(*代表所有域名)header('Access-Control-Allow-Origin:*');// 响应类型heade ...
- 如何在Excel中少犯二(I)
作者:何明科链接:https://zhuanlan.zhihu.com/p/23472480来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 收到不少建议,要求开知乎Li ...
- Vultr免费vps注册和使用简易教程
如果你是站长,寻找托管网站的主机,或者是开发者,需要搭建服务器环境,选购vps是必须的.强烈不推荐国内的vps产品,没有性价比,维护水平又烂,甚至某些国内所谓云主机vps安装后门,监控你的数据.海外v ...
- 基于多线程多用户的FTP服务器与客户端功能实现
项目介绍: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp server上随意切换目录 允许用户查看当 ...
- Openjudge-计算概论(A)-求分数序列和
描述: 有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13,.... 求这个分数序列的前n项之和.输入输入有一行:正整数n.输出输出有一行:分数序列的和(浮点数,精确到小数点后4位) ...
- 【入门一】一些简单的C程序及VS的安装
实例1 用 printf 函数打印字符串 # include <stdio.h> // 预处理指令,结尾不加 ';' int main(void) // int表示该函数将返回一个整数值, ...
- for、while循环的洪荒之力
在python里,如果说print语句是用得最多的话,那么,要我说,除了for语句,谁都不敢认老二. 下面,让我们来看看for语句能搞出什么花样 1. 计时(无限次数) 说到计时,我们先来试下显示当前 ...
- jvm的可见性的理解
同步包括两方面的含义: 独占性和可见性. 很多人仅仅理解了独占性,而忽略了可见性. 根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memo ...
- javascript动画效果之缓冲动画(修改版)
在编写多块同时触发运动的时候,发现一个BUG, timer = setInterval(show, 30);本来show是一个自定义函数,当设为timer = setInterval(show(one ...
- 关于oracle数据库(7)查询1
查询所有列数据 select * from 表名; 查询指定列数据 效率高于查询所有列数据 select 列名,列名,列名 from 表名; --先执行from后面的代码,找到表,在执行select后 ...