程序设计实践
设
计
报
告
课题名称:__windows编程画图时钟______
学生姓名:__孙振超____________________
班 级:___2012211111_______________
班内序号:___24_______________________
学 号:___2012210326_______________
日 期:___2014_年_4_月_30 _号_______
1. 课题概述
1.1课题目标和主要内容
1. 熟悉在Visual studio 2010 环境下编辑、编译、调试和运行一个实际
窗口式应用程序的步骤和方法;
2. 能进行简单的windows 绘图程序设计;提高实际动手能力。
开发平台:windows32系统
主要工具:
Visual studio 2010
1.2系统的主要功能
windows 绘图程序设计
一. 画图
1. 画点: point()函数实现
2. 画直线: line()函数实现
3. 画矩形:
4. 画圆: rectangle()函数实现 circle()函数实现
5. 画椭圆: ellipse()函数实现
6. 画时钟: myclock()函数实现
二.bmp 文件处理
1. 打开bmp 文件 :open()函数实现;
2. 灰度处理: grey()函数实现;
3. 保存bmp 文件: save(HBITMAP hb, string &f) 函数实现
一. 画图功能
二.Bmp 文件处理功能
三. 菜单栏
时钟: 实现画方形时钟,功能
fig2: 实现自定义画图功能,一中的点,线等
Exit : 实现退出程序功能
打开文件: 打开本地*.bmp
另存为: 保存窗体中bmp 文件
灰度处理: 处理窗体中bmp 文件灰度
2. 系统设计
2.1 系统总体框架
系统框架图或层次逻辑图
设计思想
一.定义基类Shape ,为基本图类, 提供坐标,边框颜色及填充色信息,定义派
生类Point,Line,Circle,rectangle 设定相应参数,定义Message 接收消息
二.运用上述类,及句柄处理函数实现画图程序
三.处理BMP 文件
2.2 系统详细设计
[1] 模块划分图及描述
一.画图:
画笔宽度是通过成员整形变量width 控制,每一个宽度按钮对应不同的width
值。通过选择宽度按钮,即可选择不同的Width 值,创建画笔获得width 值后,就可画出不同的宽度。
调用相应类及函数实现画线,画点,矩形,椭圆等的功能。
2.3 关键算法分析
算法1:point()
[1] 算法功能
画点
[2] 算法基本思想
通过获取用户定义坐标,画笔宽度,颜色等信息实现画点功能
[3] 算法空间、时间复杂度分析
O(1)
[4] 代码逻辑(可用伪代码描述)
①.获取位置坐标
②.创建画笔信息并调用SelectObject()函数,把刚才创建的画笔
与绘图纸关联绘图
③.完成后删除画笔
注:画线line()功能思想类似,所以省略
算法2:ellipse(double x, double y, double ra, double rb,COLORREF
mColor,COLORREF fillColor)
[1] 算法功能
画椭圆
[2] 算法基本思想
通过获取用户定义坐标,画笔宽度,颜色等信息实现画椭圆功能,并填充颜色
[3] 算法空间、时间复杂度分析
O(n)
[4] 代码逻辑(可用伪代码描述)
①若填充色设置有效,则创建画刷并保存在oldbrush 中,
并通过SelectObject ()函数实现笔刷与绘图纸关联
②创建画笔并保存在oldpen 中,并通过SelectObject ()函数实
现笔刷与绘图纸关联
③画图操作和背景色填充操作
④删除画笔
算法3:_rectangle(double xfrom,double yfrom,double l,double ,COLORREF
mColor,COLORREF fillColor)
[1] 算法功能
画矩形
[2] 算法基本思想
通过获取用户定义坐标,画笔宽度,颜色等信息实现画矩形功能,并填充颜
色
[3] 算法空间、时间复杂度分析
O(1)
[4] 代码逻辑(可用伪代码描述)
①若填充色设置有效,则创建画刷并保存在oldbrush 中,并通过
SelectObject ()函数实现笔刷与绘图纸关联
②调用line ()函数画矩形四边,参数意义:(xfrom,yfrom)为矩形
中心点,l 为长,w 为宽
③背景色填充操作
算法4:getHBitmap()
[1] 算法功能
由窗口HDC 转向HBITMAP 消息
[2] 算法基本思想
通过建立内存和位图关系,使得句柄可处理位图
[3] 算法空间、时间复杂度分析
O(1)
[4] 代码逻辑(可用伪代码描述)
① 建立内存DC 和位图
② 获得内存DC 旧位图
③hdc 的内容写入到内存DC
④恢复内存DC 的旧位图,得到刚写入的hdc 内容
算法5:myOpen(HWND hwnd, HDC mainwin_hdc)
[1] 算法功能
打开bmp 文件至窗口
[2] 算法基本思想
通过将dc 位图放到内存dc ,通过处理内存dc ,即可实现对bmp 文件的处理
[3] 算法空间、时间复杂度分析
O(1)
[4] 代码逻辑(可用伪代码描述)
①获取窗口客户取坐标
②获得位图DC 并将dc 位图放到内存dc
③绘制内存背景
④清除现有的句柄消息
算法6:mpaint()
[1] 算法功能
画图,圆,椭圆,线,点
[2] 算法基本思想
调用已经定义好的椭圆,线,点函数,实现画图功能
[3] 算法空间、时间复杂度分析
O (1)
[4] 代码逻辑(可用伪代码描述)
①将窗体设为背景色,白色
②调用ellipse(-7.0,1.0,2.0,1.0,RGB(0,0,255),RGB(255,0,255));画椭
圆
③调用point ()函数画点
④调用 line(-20,0,-10,0,RGB(0,0,255))画线
⑤调用_rectangle(5,1,3,3,RGB(0,0,255),RGB(0,0,255))画矩形
算法7:open()
[1] 算法功能
打开bmp 文件
[2] 算法基本思想
通过句柄消息获取bmp 文件位置,大小等数据并打开相应bmp 文件
[3] 算法空间、时间复杂度分析
[4] 代码逻辑(可用伪代码描述)
①找到相应bmp 文件
②调用GetObject()函数,获得bitmap 信息到bmp 结构中
③调用GetBitmapBits()函数,将指定位图的位拷贝到缓冲区
算法8:grey()
[1] 算法功能
灰度处理
[2] 算法基本思想
通过句柄消息获取bmp 文件位置,大小等数据并打开相应bmp 文件
[3] 算法空间、时间复杂度分析
O(n)
[4] 代码逻辑(可用伪代码描述)
①找到相应bmp 文件
②调用GetObject()函数,获得bitmap 信息到bmp 结构中
③调用GetBitmapBits()函数,将指定位图的位拷贝到缓冲区
算法9:save()
[1] 算法功能
保存bmp 文件
[2] 算法基本思想
将文件保存至本地
[3] 算法空间、时间复杂度分析
O(n)
[4] 代码逻辑(可用伪代码描述)
①定义bmp 结构
②构建pbmi
③计算文件大小,获取位图信息
④写文件
算法10:myclock(GraphicWindows &cwin)
[1] 算法功能
画方形时钟
[2] 算法基本思想
[3] 算法空间、时间复杂度分析、
O(n)
[4] 代码逻辑(可用伪代码描述)
①存储秒和毫秒,调用_ftime()将日历时间转化为本地时间
②画表盘, 调用rectangle 类,设定长宽相等,背景色,边框色等值,画图 定义点类,画12个点
③画表针 ,句柄接收时针,分针,秒针不动点,实现时针,分针,秒针线段按时间正确顺序转动
程序运行结果分析
3. 总结
4.1课题的难点和关键点
由于以前并未接触windows 程序,运用是很不习惯,所以调试有困难。通过百度和询问同学老师,学到了很多相关知识,解决了编译中的错误。
3.2 本课题的评价
第11页
本课题切合实际,在学习能力范围内,是很好的课题。自己需要学的东西还有很多,对windows 变成只是初步了解,学到了一些调试程序的方法,会继续歇息相关知识,完善程序。如没有设定笔擦功能,可以尝试用背景色为白色,以鼠标选择笔擦功能为条件进行实现。
4.3心得体会
1.Windows 应用程序包括入口函数WinMain 和窗口函数WndProc 。
2. 绘图工具使用的一般步骤
1. 获取Win 系统库存画笔/或创建画笔/刷
2. 将画笔/刷选入设备环境,使用函数:SelectObject(hdc,hP/hBr)。删除画笔/刷,使用函数:DeleteObject(hP/hBr)。
3..Windows 应用程序变化万千,但消息机制和窗口过程却是Windows 应用程序的基石和骨架,贯穿于所有windows 应用程序之中。
这次课程设计虽只是做了一个极其简单的绘图工具的制作,但也让我从设计者的角度看到了设计程序以及电脑软件工具的实质及难度,看似一个很简单的工具,其制作的背后工作是很大的,不光是图标,按钮的设置,程序的编写,代码的实现都是很精密且不容许一点错误的工作。平时我们使用的很顺手的一个小小工具,其开发的各项小号都不可小觑,由此,我们需要学的东西还太多太多。
4. 参考文献
[1]百度文库
第12页
程序设计实践
设
计
报
告
课题名称:__windows编程画图时钟______
学生姓名:__孙振超____________________
班 级:___2012211111_______________
班内序号:___24_______________________
学 号:___2012210326_______________
日 期:___2014_年_4_月_30 _号_______
1. 课题概述
1.1课题目标和主要内容
1. 熟悉在Visual studio 2010 环境下编辑、编译、调试和运行一个实际
窗口式应用程序的步骤和方法;
2. 能进行简单的windows 绘图程序设计;提高实际动手能力。
开发平台:windows32系统
主要工具:
Visual studio 2010
1.2系统的主要功能
windows 绘图程序设计
一. 画图
1. 画点: point()函数实现
2. 画直线: line()函数实现
3. 画矩形:
4. 画圆: rectangle()函数实现 circle()函数实现
5. 画椭圆: ellipse()函数实现
6. 画时钟: myclock()函数实现
二.bmp 文件处理
1. 打开bmp 文件 :open()函数实现;
2. 灰度处理: grey()函数实现;
3. 保存bmp 文件: save(HBITMAP hb, string &f) 函数实现
一. 画图功能
二.Bmp 文件处理功能
三. 菜单栏
时钟: 实现画方形时钟,功能
fig2: 实现自定义画图功能,一中的点,线等
Exit : 实现退出程序功能
打开文件: 打开本地*.bmp
另存为: 保存窗体中bmp 文件
灰度处理: 处理窗体中bmp 文件灰度
2. 系统设计
2.1 系统总体框架
系统框架图或层次逻辑图
设计思想
一.定义基类Shape ,为基本图类, 提供坐标,边框颜色及填充色信息,定义派
生类Point,Line,Circle,rectangle 设定相应参数,定义Message 接收消息
二.运用上述类,及句柄处理函数实现画图程序
三.处理BMP 文件
2.2 系统详细设计
[1] 模块划分图及描述
一.画图:
画笔宽度是通过成员整形变量width 控制,每一个宽度按钮对应不同的width
值。通过选择宽度按钮,即可选择不同的Width 值,创建画笔获得width 值后,就可画出不同的宽度。
调用相应类及函数实现画线,画点,矩形,椭圆等的功能。
2.3 关键算法分析
算法1:point()
[1] 算法功能
画点
[2] 算法基本思想
通过获取用户定义坐标,画笔宽度,颜色等信息实现画点功能
[3] 算法空间、时间复杂度分析
O(1)
[4] 代码逻辑(可用伪代码描述)
①.获取位置坐标
②.创建画笔信息并调用SelectObject()函数,把刚才创建的画笔
与绘图纸关联绘图
③.完成后删除画笔
注:画线line()功能思想类似,所以省略
算法2:ellipse(double x, double y, double ra, double rb,COLORREF
mColor,COLORREF fillColor)
[1] 算法功能
画椭圆
[2] 算法基本思想
通过获取用户定义坐标,画笔宽度,颜色等信息实现画椭圆功能,并填充颜色
[3] 算法空间、时间复杂度分析
O(n)
[4] 代码逻辑(可用伪代码描述)
①若填充色设置有效,则创建画刷并保存在oldbrush 中,
并通过SelectObject ()函数实现笔刷与绘图纸关联
②创建画笔并保存在oldpen 中,并通过SelectObject ()函数实
现笔刷与绘图纸关联
③画图操作和背景色填充操作
④删除画笔
算法3:_rectangle(double xfrom,double yfrom,double l,double ,COLORREF
mColor,COLORREF fillColor)
[1] 算法功能
画矩形
[2] 算法基本思想
通过获取用户定义坐标,画笔宽度,颜色等信息实现画矩形功能,并填充颜
色
[3] 算法空间、时间复杂度分析
O(1)
[4] 代码逻辑(可用伪代码描述)
①若填充色设置有效,则创建画刷并保存在oldbrush 中,并通过
SelectObject ()函数实现笔刷与绘图纸关联
②调用line ()函数画矩形四边,参数意义:(xfrom,yfrom)为矩形
中心点,l 为长,w 为宽
③背景色填充操作
算法4:getHBitmap()
[1] 算法功能
由窗口HDC 转向HBITMAP 消息
[2] 算法基本思想
通过建立内存和位图关系,使得句柄可处理位图
[3] 算法空间、时间复杂度分析
O(1)
[4] 代码逻辑(可用伪代码描述)
① 建立内存DC 和位图
② 获得内存DC 旧位图
③hdc 的内容写入到内存DC
④恢复内存DC 的旧位图,得到刚写入的hdc 内容
算法5:myOpen(HWND hwnd, HDC mainwin_hdc)
[1] 算法功能
打开bmp 文件至窗口
[2] 算法基本思想
通过将dc 位图放到内存dc ,通过处理内存dc ,即可实现对bmp 文件的处理
[3] 算法空间、时间复杂度分析
O(1)
[4] 代码逻辑(可用伪代码描述)
①获取窗口客户取坐标
②获得位图DC 并将dc 位图放到内存dc
③绘制内存背景
④清除现有的句柄消息
算法6:mpaint()
[1] 算法功能
画图,圆,椭圆,线,点
[2] 算法基本思想
调用已经定义好的椭圆,线,点函数,实现画图功能
[3] 算法空间、时间复杂度分析
O (1)
[4] 代码逻辑(可用伪代码描述)
①将窗体设为背景色,白色
②调用ellipse(-7.0,1.0,2.0,1.0,RGB(0,0,255),RGB(255,0,255));画椭
圆
③调用point ()函数画点
④调用 line(-20,0,-10,0,RGB(0,0,255))画线
⑤调用_rectangle(5,1,3,3,RGB(0,0,255),RGB(0,0,255))画矩形
算法7:open()
[1] 算法功能
打开bmp 文件
[2] 算法基本思想
通过句柄消息获取bmp 文件位置,大小等数据并打开相应bmp 文件
[3] 算法空间、时间复杂度分析
[4] 代码逻辑(可用伪代码描述)
①找到相应bmp 文件
②调用GetObject()函数,获得bitmap 信息到bmp 结构中
③调用GetBitmapBits()函数,将指定位图的位拷贝到缓冲区
算法8:grey()
[1] 算法功能
灰度处理
[2] 算法基本思想
通过句柄消息获取bmp 文件位置,大小等数据并打开相应bmp 文件
[3] 算法空间、时间复杂度分析
O(n)
[4] 代码逻辑(可用伪代码描述)
①找到相应bmp 文件
②调用GetObject()函数,获得bitmap 信息到bmp 结构中
③调用GetBitmapBits()函数,将指定位图的位拷贝到缓冲区
算法9:save()
[1] 算法功能
保存bmp 文件
[2] 算法基本思想
将文件保存至本地
[3] 算法空间、时间复杂度分析
O(n)
[4] 代码逻辑(可用伪代码描述)
①定义bmp 结构
②构建pbmi
③计算文件大小,获取位图信息
④写文件
算法10:myclock(GraphicWindows &cwin)
[1] 算法功能
画方形时钟
[2] 算法基本思想
[3] 算法空间、时间复杂度分析、
O(n)
[4] 代码逻辑(可用伪代码描述)
①存储秒和毫秒,调用_ftime()将日历时间转化为本地时间
②画表盘, 调用rectangle 类,设定长宽相等,背景色,边框色等值,画图 定义点类,画12个点
③画表针 ,句柄接收时针,分针,秒针不动点,实现时针,分针,秒针线段按时间正确顺序转动
程序运行结果分析
3. 总结
4.1课题的难点和关键点
由于以前并未接触windows 程序,运用是很不习惯,所以调试有困难。通过百度和询问同学老师,学到了很多相关知识,解决了编译中的错误。
3.2 本课题的评价
第11页
本课题切合实际,在学习能力范围内,是很好的课题。自己需要学的东西还有很多,对windows 变成只是初步了解,学到了一些调试程序的方法,会继续歇息相关知识,完善程序。如没有设定笔擦功能,可以尝试用背景色为白色,以鼠标选择笔擦功能为条件进行实现。
4.3心得体会
1.Windows 应用程序包括入口函数WinMain 和窗口函数WndProc 。
2. 绘图工具使用的一般步骤
1. 获取Win 系统库存画笔/或创建画笔/刷
2. 将画笔/刷选入设备环境,使用函数:SelectObject(hdc,hP/hBr)。删除画笔/刷,使用函数:DeleteObject(hP/hBr)。
3..Windows 应用程序变化万千,但消息机制和窗口过程却是Windows 应用程序的基石和骨架,贯穿于所有windows 应用程序之中。
这次课程设计虽只是做了一个极其简单的绘图工具的制作,但也让我从设计者的角度看到了设计程序以及电脑软件工具的实质及难度,看似一个很简单的工具,其制作的背后工作是很大的,不光是图标,按钮的设置,程序的编写,代码的实现都是很精密且不容许一点错误的工作。平时我们使用的很顺手的一个小小工具,其开发的各项小号都不可小觑,由此,我们需要学的东西还太多太多。
4. 参考文献
[1]百度文库
第12页