设计模式在鼠标绘图中的应用

梧桐168 2006-04-12 02:41:45
设计模式的应用

设计模式是代码重构的最终目标,在程序设计中有效的运用这项技术,可以大大提高代码的可读性和可维护性。使整个程序设计结构趋向精致完美。下面我就从常见矢量绘图的例子来阐述一些常见模式的运用。

矢量绘图系统中,用户需要用鼠标在视图中绘制多种图形(点,折线,多边形,圆,曲线等),并对其进行编辑。
我们来看看鼠标绘制图形的操作,这里主要响应3个消息
OnLButtonDown()鼠标左键单击消息,开始绘制图形和图形特征点的定位.
OnMouseMove()鼠标移动消息,处理当前图形特征点的位置移动以及图形随之相应的动态绘制.
OnLButtonDblClk()鼠标左键双击消息,结束操作,完成图形绘制。

我看过一些初学者写的绘图例子,在没有学习设计模式情况下,大多数人的代码可能就像以下这样:

void CDrawView:: OnLButtonDown(UINT nFlags, CPoint point)
{
If (绘制点)
{
。。。
}
Else if(绘制折线)
{
。。。
}
Else if(绘制多边形)
{
。。。
}
。。。
}
OnMouseMove(),OnLButtonDblClk()也与之类似。
这种代码充斥大量的代码分支,无论是阅读还是维护都极其困难,我曾经看过长达1000多行这样的函数,第一感觉就是晕眩。
我们来看看设计模式中对于状态模式的描述.
在下面的情况下可以使用状态模式:
1) 一个对象的行为取决于它的状态,并且它必须在运行时改变它的行为.
2) 一个操作中含有庞大的多分支条件语句,且这些分支依赖于对象的状态,这个状态通常用一个或者多个枚举常量来表示,通常有多个操作包含这一相同的条件结构.state将每一个分支条件放入一个独立的类中,这使得你可以根据对象自身的情况将对象的状态作为一个对象,这个对象可以不依赖于其他对象而独立变化.

这刚好适用于我们现在要处理的问题,我们可以设计一个类专门处理鼠标消息的类CMouseTool,它提供了与以上相对应的几个接口:
OnLButtonDown(), OnMouseMove(),OnLButtonDblClk().

现在我们的程序可以简单的这么写了:

void CDrawView:: OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_pcCurTool)
m_pcCurTool-> OnLButtonDown (nFlags, point);
}

void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_pcCurTool)
m_pcCurTool->OnMouseMove(nFlags, point);
}
void CDrawView:: OnLButtonDblClk (UINT nFlags, CPoint point)
{
if (m_pcCurTool)
m_pcCurTool-> OnLButtonDblClk (nFlags, point);
}
接下来就是鼠标工具类的具体设计了.
我们逐个分析一下这些鼠标操作的具体行为.
在OnLButtonDown鼠标左键单击消息中,我们要记录:鼠标点击的起始点, 鼠标当前点击位置, 鼠标上一位置,鼠标当前位置,记录鼠标此次操作点击次数.并在绘制不同图形的情况下去进行一些操作.我们可以看到除了” 在绘制不同图形的情况去进行一些操作”之外,其余都是所有图形绘制工具子类共有的部分,因此OnLButtonDown函数在一般情况下,可以设计为以下的方式.
void CMouseTool::OnLButtonDown(UINT nFlags, CPoint pt)
{
if (0L == m_lClickTimes)
m_cStartPoint = pt; // 记录初始点
SetCurPoint(pt); // 设置当前点
m_cDownPoint = m_cLastPoint = m_cCurPoint;
m_lClickTimes++;
Perform_LButtonDown(nFlags);
}
其中Perform_LbuttonDown是私有的纯虚函数,如果具现的鼠标工具子类的左键单击消息遵从以上的行为的话,只需要那么重载Perform_LbuttonDown实现.比如多边形绘制工具CPolygonTool就可以如此实现:
void CPolygonTool:: Perform_LButtonDown(UINT nFlags)
{
m_pcNewPolygon->AddPoint(m_cCurPoint);
}
这时候CMouseTool::OnLButtonDown()又表现为另外一种经典的设计模式 - 模板模式.
我们看看模板模式的描述:
定义一个操作中的算法的骨架,而将一些步骤延续到子类中,Template模式使得子类可以不改变一个算法的结构即可重定义该算法某些特定步骤.
根据这个设计思想以及消息响应的具体情况,其它两个消息响应函数也是类似:
void CMouseTool::OnMouseMove(UINT nFlags, CPoint pt)
{
// 尚未点击触发鼠标操作,不予处理
if (0L == m_lClickTimes)
return;

// 记录鼠标轨迹
m_cLastPoint = m_cCurPoint;
SetCurPoint(pt);
CRect rc;
// 执行响应鼠标移动的操作
Perform_MouseMove(nFlags, rc);
// 绘制视图
RefreshView(rc, &dc);
}
Void CMouseTool::OnLButtonDblClk(UINT nFlags,CPoint pt, CDrawView* pcView)
{
// 执行响应鼠标双击的操作
Perform_LButtonDblClk();
pcView->Invalidate();
m_lClickTimes = 0L;
}
其中的Perform_MouseMove(nFlags, rc), RefreshView (rc, &dc);Perform_LButtonDblClk()都是私有的纯虚函数, 具现的鼠标工具子类的鼠标左键单击消息遵从以上的行为模式的话重载即可.
从上分析可以看到,对于鼠标操作的处理,整体上可以看作是状态模式和模板模式的杂糅体,在实际工作中为了解决某个问题,我们的使用的方式往往不是某一单一的模式,而是根据具体情况找出其中的规律,发挥自己的创造力灵活运用,这样才能达到最好的效果.
另附上CMouseTool 类的基本接口代码:
class CMouseTool
{
protected:
CMouseTool(const long lToolType, const UINT nCursorID);
virtual ~CMouseTool(){}

public:
/* ------------------------ 消息响应函数 ------------------------------- */
virtual void OnMouseMove(UINT nFlags,CPoint pt);
virtual void OnLButtonDown(UINT nFlags, CPoint pt);
virtual void OnLButtonDblClk(UINT nFlags, CPoint pt);

private:
/* ------------------------ 消息执行函数 ------------------------------- */
// 移动鼠标时响应的操作
virtual BOOL Perform_MouseMove(UINT nFlags, CRect& rc);
// 单击鼠标左键时的操作
virtual void Perform_LButtonDown(UINT nFlags);
// 双击鼠标左键时响应的操作
virtual BOOL Perform_LButtonDblClk();
// 重新绘制屏幕
virtual void RefreshScreen(const CRect& rc, CDC* pDC);
}
...全文
795 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
femalelover 2007-03-24
  • 打赏
  • 举报
回复
我到是觉得有时候用了模式之后, 代码更加难以看懂, 因为嵌套的层次会加深.
小程序里没必要模式.
lyg_zy 2007-03-24
  • 打赏
  • 举报
回复
赞同!
wanglovec 2006-11-02
  • 打赏
  • 举报
回复
好文章 MARK
梧桐168 2006-04-26
  • 打赏
  • 举报
回复
zengyongjoy:
这个是细节问题,文章中我没考虑,不过实际代码中已经解决.

对于绘制工具, 又有一个抽象基类:
class CDrawTool : public CMouseTool
{
...
protected:
const auto_ptr<CShape> m_cShape;
...
}
BOOL CDrawTool::Perform_LButtonDblClk(CDrawView* pcView)
{
....
// 完成图形绘制,添加到视的矢量图形容器中
m_pcView->AddNewShape(m_cShape->Clone());
....
}


重绘得问题是这样解决得:
1.在工具开始使用得时候,将窗口背景图保存下来.
2.鼠标移动得时候,使用脏矩形技术来完成常数时间得刷新.
3.鼠标双击的时候只要将图元绘制到背景图,然后再将背景图贴到屏幕上即可.
KDE 2006-04-25
  • 打赏
  • 举报
回复
STATE + OBSERVER
zengyongjoy 2006-04-24
  • 打赏
  • 举报
回复
理论是这样的。可是还有一个根本的问题没有提及
当perform_someFunction的时候,会把创建的临时对象加入到Document中保存
然后同时要更新相关视图。那么相关视图的更新要采取一定的措施避免View中的Client area全部重绘,优化刷新模式。
梧桐168 2006-04-13
  • 打赏
  • 举报
回复
to abbly:
对, m_pcCurTool是CMouseTool * 类型的指针,指向当前工具类的对象指针.

to goodboy1881:
再处理这个问题上,只用经典的state模式是不够的,我这里用的是state模式和template模式
杂糅的方法.

希望能和大家多多交流.
积木 2006-04-12
  • 打赏
  • 举报
回复
我记得我去年11月份的时候也在这个讨论区问过这个事情。
积木 2006-04-12
  • 打赏
  • 举报
回复
这就是经典的画图工具的做法了,
名字叫做state模式……
http://blog.csdn.net/goodboy1881/archive/2006/03/23/635963.aspx
我也写过一片相似的文章。
fei201 2006-04-12
  • 打赏
  • 举报
回复
楼主的想法很不错,值得借鉴.
abblly 2006-04-12
  • 打赏
  • 举报
回复
楼主说的还不是十分详细,比如没有说m_pcCurTool是什么,我理解是CMouseTool * 类型的;而CMouseTool的各个子类里面也应包含一个CDrawView * 的成员吧,不知道理解的对否。
abblly 2006-04-12
  • 打赏
  • 举报
回复
mark 一下
第1部分 基础知识   第1章 起步   1.1 Windows环境   1.1.1 Windows简史   1.1.2 Windows的方方面面   1.1.3 动态链接   1.2 Windows编程选项   1.2.1 API及内存管理模式   1.2.2 语言选择   1.2.3 编程环境   1.2.4 API文档   1.3 你的第一个Windows程序   1.3.1 字符模式   1.3.2 Windows对应程序   1.3.3 头文件   1.3.4 程序入口   1.3.5 MessageBox函数   1.3.6 编译、链接及运行   第2章Unicode简介   2.1 字符集简史   2.1.1 美国标准   2.1.2 美国以外的世界   2.1.3 扩展ASCII   2.1.4 双字节字符集   2.1.5 Unicode的解救方案   2.2 宽字符和c语言   2.2.1 char数据类型   2.2.2 更宽的字符   2.2.3 宽字符库函数   2.2.4 维护一个源代码文件   2.3 宽字符和Windows   2.3.1 Windows头文件的类型   2.3.2 Windows函数调用   2.3.3 Windows的字符串函数   2.3.4 在Windows使用printf   2.3.5 格式化的消息框   2.3.6 国际化之于本书   第3章 窗口与消息   3.1 窗口的创建   3.1.1 系统结构概述   3.1.2 HELLOWIN程序   3.1.3 通盘考虑   3.1.4 窗口类的注册   3.1.5 窗口的创建   3.1.6 窗口的显示   3.1.7 消息循环   3.1.8 窗口过程   3.1.9 消息的处理   3.1.10 声音文件的播放   3.1.11 WM_PAINT消息   3.1.12 WM_DESTROY消息   3.2 Windows编程的若干难点   3.2.1 究竟是谁调用谁   3.2.2 队列消息和非队列消息   3.2.3 速战速决   第4章 文本输出   4.1 绘制和重绘   4.1.1 WM_PAINT消息   4.1.2 有效矩形和无效矩形   4.2 GDI简介   4.2.1 设备环境   4.2.2 获取设备环境句柄:方法一   4.2.3 绘制信息结构   4.2.4 获取设备环境句柄:方法二   4.2.5 TEXTOUT函数详解   4.2.6 系统字体   4.2.7 字符大小   4.2.8 文本尺寸的度量   4.2.9 文本的格式化   4.2.10 综合使用   4.2.11 SYSMETSl.C窗口过程   4.2.12 空间不够   4.2.13 客户区的尺寸   4.3 滚动条   4.3.1 滚动条的范围和位置   4.3.2 滚动条消息   4.3.3 加入滚动条的SYSMET   4.3.4 程序的绘制代码的结构   4.4 效果更好的滚动   4.4.1 滚动条信息函数   4.4.2 最远可以卷动到哪里?   4.4.3 新的SYSMETS   4.4.4 可我不想用鼠标   第5章 绘图基础   5.1 GDI的结构   5.1.1 GDI原理   5.1.2 GDI函数调用   5.1.3 GDI的基本图形   5.1.4 其他   5.2 设备环境   5.2.1 获取设备环境句柄   5.2.2 获取设备环境的信息   5.2.3 DEVCAPSl程序   5.2.4 设备的尺寸   5.2.5 色彩ABC   5.2.6 设备环境属性   5.2.7 保存设备环境   5.3 点和线的绘制   5.3.1 设定像素   5.3.2 直线   5.3.3 边框绘制函数   5.3.4 贝塞尔样条曲线   5.3.5 使用现有画笔   5.3.6 创建、选择和删除画笔   5.3.7 填充空隙   5.3.8 绘图模式   5.4 绘制填充区域   5.4.1 Polygon函数和多边形填充模式   5.4.2 用画刷填充内部   5.5 GDI映射模式   5.5.1 设备坐标和逻辑坐标   5.5.2 设备坐标系统   5.5.3 视口和窗口   5.5.4 使用MMTEXT   5.5.5 度量映射模式   5.5.6 自定义的映射模式   5.5.7 WHATSIZE程序   5.6 矩形、区域和剪裁   5.6.1 处理矩形   5.6.2 随机矩形   5.6.3 建立和绘制区域   5.6.4 矩形与区域的剪裁   5.6.5 CLOVER程序   第6章 键盘   6.1 键盘基础   6.1.1 忽略键盘   6.1.2 谁获得了焦点?   6.1.3 队列和同步   6.1.4 击键和字符   6.2 击键消息   6.2.1 系统键击和非系统键击   6.2.2 虚拟键代码   6.2.3 1param信息   6.2.4 转义状态   6.2.5 使用击键消息   6.2.6 为SYSMETS加上键盘处理功能   6.3 字符消息   6.3.1 四类字符消息   6.3.2 消息排序   6.3.3 控制字符的处理   6.3.4 死字符消息   6.4 键盘消息和字符集   6.4.1 KEYVIEW1程序   6.4.2 非英语键盘问题   6.4.3 字符集和字体   6.4.4 Unicode解决方案   6.4.5 TrueType字体和大字体   6.5 插入符号(不是光标)   6.5.1 一些关于插入符号的函数   6.5.2 TYPER程序   第7章 鼠标   7.1 鼠标的基础知识   7.1.1 一些基本术语   7.1.2 鼠标的复数形式是什么?   7.2 客户区鼠标消息   7.2.1 简单的鼠标处理示例   7.2.2 处理Shift键   7.2.3 鼠标双击   7.3 非客户区鼠标消息   7.3.1 击测试消息   7.3.2 消息引发消息   7.4 程序的击测试   7.4.1 一个假想的例子   7.4.2 一个简单的程序   7.4.3 使用键盘模仿鼠标操作   7.4.4 在CHECKER增加键盘接口   7.4.5 在击测试使用子窗口   7.4.6 CHECKER程序的子窗口   7.4.7 子窗口和键盘   7.5 捕获鼠标   7.5.1 设计一个矩形   7.5.2 捕获的解决方案   7.5.3 BLOKOUT2程序   7.6 鼠标的滚轮   第8章 计时器   8.1 计时器的基本知识   8.1.1 系统和计时器   8.1.2 计时器消息不是异步的   8.2 使用计时器的三种方法   8.2.1 方法一   8.2.2 方法二   8.2.3 方法三   8.3 使用计时器作为时钟   8.3.1 数字时钟   8.3.2 获取当前时间   8.3.3 显示数字和冒号   8.3.4 考虑国际化   8.3.5 模拟时钟   8.4 在状态报告上使用计时器   第9章 子窗口控件   9.1 按钮类   9.1.1 创建子窗口   9.1.2 子窗口传递信息给父窗口   9.1.3 父窗口传递信息给子窗口   9.1.4 按钮   9.1.5 复选框   9.1.6 单选按钮   9.1.7 组合框   9.1.8 改变按钮文本   9.1.9 可见的按钮和启用的按钮   9.1.10 按钮和输入焦点   9.2 控件和颜色   9.2.1 系统颜色   9.2.2 按钮的颜色   9.2.3 WMCTLCOLORBTN消息   9.2.4 自绘按钮   9.3 静态类   9.4 滚动条类   9.4.1 COLORS1程序   9.4.2 自动键盘接口   9.4.3 窗口子类   9.4.4 背景着色   9.4.5 给滚动条和静态文本着色   9.5 编辑类   9.5.1 编辑类的样式   9.5.2 编辑控件的通知消息   9.5.3 使用编辑控件   9.5.4 传递给编辑控件的消息   9.6 列表框类   9.6.1 列表框的样式   9.6.2 向列表框添加字符串   9.6.3 项目的选择和提取   9.6.4 接收来自列表框的消息   9.6.5 简单的列表框程序   9.6.6 列出文件   9.6.7 Windows的HEAD程序   第10章 菜单和其他资源   10.1 图标、鼠标指针、字符串和自定义资源   10.1.1 向程序添加图标   10.1.2 获得图标的句柄   10.1.3 在应用程序使用图标   10.1.4 使用自定义鼠标指针   10.1.5 字符串资源   10.1.6 自定义资源   10.2 菜单   10.2.1 和菜单有关的概念   10.2.2 菜单结构   10.2.3 定义菜单   10.2.4 在程序引用菜单   10.2.5 菜单和消息   10.2.6 范例程序   10.2.7 菜单设计的规范   10.2.8 定义菜单的繁琐方式   10.2.9 浮动弹出菜单   10.2.1 0使用系统菜单   10.2.1 1改变菜单   10.2.1 2其他菜单命令   10.2.1 3菜单的另类用法   10.3 键盘加速键   10.3.1 为什么你应该使用键盘加速键   10.3.2 指定加速键的一些规则   10.3.3 加速键表   10.3.4 加载加速键表   10.3.5 翻译按键   10.3.6 接收加速键消息   10.3.7 带有菜单和加速键的POPPAD程序   10.3.8 启用菜单项   10.3.9 处理菜单项   第11章 对话框   11.1 模态对话框   11.1.1 创建一个About对话框   11.1.2 对话框及其模板   11.1.3 对话框过程   11.1.4 激活对话框   11.1.5 主题变换   11.1.6 更复杂的对话框   11.1.7 对话框控件的应用   11.1.8 OK和Cancel按钮   11.1.9 避免全局变量   11.1.1 0Tab停靠和选项组   11.1.1 1在对话框上绘图   11.1.1 2关于对话框的其他函数.   11.1.1 3定义程序自己的控件   11.2 非模态对话框   11.2.1 模态与非模态对话框的区别   11.2.2 新的COLORS程序   11.2.3 HEXCALC:窗口还是对话框?   11.3 公用对话框   11.3.1 完善POPPAD   11.3.2 Unicode文件的读/写操作   11.3.3 改变字体   11.3.4 查找和替换   11.3.5 只调用一个函数的Windows程序   ……   第Ⅱ部分 关于图的那些事儿   第Ⅲ部分 高级主题
视觉识别系统(VI手册) VI设计项目明细表 VI基础设计系统 标志设计 标准字体 标准色 造型 象征图形 专用印刷字体 基本要素组合规范 VI设计全套方案全文共17页,当前为第1页。 VI设计全套方案全文共17页,当前为第1页。 1:标志设计   标志及标志创意说明   标志墨稿   标志反白效果图   标志标准化制图   标志方格坐标制图   标志预留空间与最小比例限定   标志特定色彩效果展示 2:标准字体   全称文字体   简称文字体   全称文字体方格坐标制图   简称文字体方格坐标制图   全称英文字体   简称英文字体   全称英文字体方格坐标制图   简称英文字体方格坐标制图 3:标准色(色彩计划)   标准色(印刷色)   辅助色系列   下属产业色彩识别   背景色使用规定   色彩搭配组合专用表   背景色色度、色相 VI设计全套方案全文共17页,当前为第2页。 VI设计全套方案全文共17页,当前为第2页。 4:造型(吉祥物)   吉祥物彩色稿及造型说明   吉祥物立体效果图   吉祥物基本动态造型   吉祥物造型单色印刷规范   吉祥物展开使用规范 5:象征图形   象征图形彩色稿(单图形)   象征图形延展效果稿   象征图形使用规范   象征图形组合规范 6:专用印刷字体   专用印刷字体 7:基本要素组合规范   标志与标准字组合多种模式   标志与象征图形组合多种模式   标志吉祥物组合多种模式   标志与标准字、象征图形、吉祥物组合多种模式   基本要素禁止组合多种模式 VI设计全套方案全文共17页,当前为第3页。 VI设计全套方案全文共17页,当前为第3页。 二.VI应用设计系统 办公事物用品设计 公共关系赠品设计 员工服装、服饰规范 车体外观设计 标志符号指示系统 销售店面标识系统 商品包装识别系统 广告宣传规范 展览指示系统 再生工具 VI设计全套方案全文共17页,当前为第4页。 VI设计全套方案全文共17页,当前为第4页。 1:办公事物用品设计   高级主管名片   级主管名片   员工名片   信封   国内信封   国际信封   大信封   信纸   国内信纸   国际信纸   特种信纸   便笺   传真纸   票据夹   合同夹   合同书规范格式   档案盒   薪资袋   识别卡(工作证)   临时工作证   出入证   工作记事簿   文件夹 VI设计全套方案全文共17页,当前为第5页。  文件袋 VI设计全套方案全文共17页,当前为第5页。   档案袋   卷宗纸   公函信纸   备忘录   简报   签呈   文件题头   直式、横式表格规范   电话记录   办公文具   聘书   岗位聘用书   奖状   公告   维修网点名址封面及内页版式   产品说明书封面及内页版式   考勤卡   请假单   名片盒   名片台   办公桌标识牌   及时贴标签   意见箱   稿件箱 VI设计全套方案全文共17页,当前为第6页。  企业徽章 VI设计全套方案全文共17页,当前为第6页。   纸杯   茶杯、杯垫   办公用笔、笔架   笔记本   记事本   公文包   通讯录   财产编号牌   培训证书   国旗、企业旗、吉祥物旗旗座造型   挂旗   吊旗   竖旗   桌旗 VI设计全套方案全文共17页,当前为第7页。 VI设计全套方案全文共17页,当前为第7页。 2:公共关系赠品设计   贺卡   专用请柬   邀请函及信封   手提袋   包装纸   钥匙牌   鼠标垫   挂历版式规范   台历版式规范   日历卡版式规范   明信片版式规范   小型礼品盒   礼赠用品   标识伞 VI设计全套方案全文共17页,当前为第8页。 VI设计全套方案全文共17页,当前为第8页。 3:员工服装、服饰规范   管理人员男装(西服礼装\白领\领带\领带夹)   管理人员女装(裙装\西式礼装\领花\胸饰)   春秋装衬衣(短袖)   春秋装衬衣(长袖)   员工男装(西装\蓝领衬衣\马甲)   员工女装(裙装\西装\领花\胸饰)   冬季防寒工作服   运动服外套   运动服、运动帽、T恤(文化衫)   外勤人员服装   安全盔   工作帽 4:车体外观设计   公务车   面包车   班车   大型运输货车   小型运输货车   集装箱运输车   特殊车型 VI设计全套方案全文共17页,当前为第9页。 VI设计全套方案全文共17页,当前为第9页。 5:标志符号指示系统   大门外观   厂房外观   办公大楼体示意效果图   大楼户外招牌   名称标识牌   名称大理石坡面处理   活动式招牌   机构平面图   大门入口指示   玻璃门   楼层标识
光 盘 说 明 1.本书第4~16章所附代码的运行环境: Visual C++ 6.0及以上版本 最低配置为:CPU:P 233以上.32MB以上内存 2.本书所附光盘范例 第4章 项目ExTest,“不做任何事情”的应用程序。 第5章 项目ExTest,在客户区央显示“HELLO!”; 项目ExMyMessage,自定义消息。 第6章 项目ExMDI,“不做任何事情”的多文档应用程序; 项目ExSDI,验证文档视图结构的命令消息处理顺序。 第7章 项目ExMouseCapture,鼠标捕获; 项目ExCursor,改变客户区光标为I形光标; 项目ExMK,鼠标光标位置坐标在状态栏的显示和客户区点击鼠标左键,弹出鼠标光标位置信息对话框; 项目ExChar,只有在当前窗口下输入字符“A”或“a”时,才弹出对话框。 第8章 项目ExTest,修改系统菜单的相关操作; 项目ExPdMenu,添加下拉菜单并实现命令响应,以及工具栏和状态栏的操作; 项目ExPuMenu,弹出菜单的创建、载入与功能实现; 项目ExMyDT,菜单、工具栏、状态栏综合操作,实现一个简单的绘图板。 第9章 项目ExMdMl,反映模式对话框与非模式对话框的几点不同; 项目ExDlgTest(C4),北京奥运金牌榜首的投票对话框,单选按钮、复选框、下压按钮与组框操作; 项目ExDlgTest(C5),个人信息录入对话框,列表框、组合框与滚动条操作; 项目ExDlgTS,通过改变选项卡所包含的颜色滑块实现单文档主窗口所包含图形的色彩变化,选项卡和滑块操作。 第10章 项目ExPen,画笔操作; 项目ExBrush,画刷操作; 项目ExFont,字体操作; 项目MyDraw,位图操作; 项目ExArc,对预设圆左上1/4部分的截取,绘制曲线操作; 项目ExBezier,利用贝塞尔函数绘制图形; 项目ExPie,绘制饼状楔形图; 项目ExDrawText,绘制文本; 项目ExMapMode,设定映射模式并基于设定的映射模式完成绘图。 第11章 项目ExFileStatus,使用类CFile提供的方法实现文件信息获取; 项目ExArTest,利用串行化机制执行读写操作。 第12章 项目ExThread,创建工作线程,计算1+2+…+n; 项目ExMultithreading,创建两个线程,分别用于对一个已有数组的读和写操作,多线程编程。 第13章 项目Calculate和项目ExTestCal,分别用于创建和使用静态链接库; 项目CalSquare和项目ExTestCalSquare,分别用于创建和使用规则动态链接库; 项目CalGCD和项目ExTestCalGCD,分别用于创建和使用扩展动态链接库。 第14章 项目ExMyAccess,MFC ODBC数据库程序创建与操作。 第15章 项目ExSocket和项目ExClient,通过Socket编程实现数据收发; 项目ExGetIP,网络应用程序,IP获取。 第16章 项目SampleCtrl和项目ActiveXTester,创建和使用ActiveX控件。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧