程序设计实践
设 计 报 告
课题名称:实验一画图程序
第1页
北京邮电大学信息与通信工程学院
1. 课题概述
1.1课题目标和主要内容
1.1.1主要内容和目标:
A. 基本功能
界面中使用鼠标画点、圆、线等功能(使用菜单选择画什么即可)
设置颜色(使用菜单设定几种颜色即可)
保存,打开bmp文件
选做功能
保存,打开自定义格式文件
图像二值化、平滑、连通域标记等
B.目标
对windows程序编程有一个初步的认识,对其消息处理有初步理解,掌握编程工具如vs的调试方法,熟练使用
1.1.2编译环境:visual studio 2012
第2页
北京邮电大学信息与通信工程学院
1.2系统的主要功能
功能列表或功能框图,以及功能的简要说明。
2. 系统设计 2.1 系统总体框架
包括系统框架图或层次逻辑图,设计思想等
winmain.cpp:系统消息的获得与处理
Graphicwindow.h:类的定义
第3页
北京邮电大学信息与通信工程学院
Graphicwindow.cpp:类中函数的定义
fig.rc、resource.h:完成菜单的添加
ccc_shap.h、ccc_shape.cpp完成图形类的定义
test.h:实现画图函数的声明
test.cpp:实现画图函数的声明
2.2 系统详细设计
[1] 类关系图及描述
第4页
北京邮电大学信息与通信工程学院
[2] 程序流程图及描述
winmain.cpp对接收到的消息进行处理,进而根据消息调用相应类函数,类函数中真正画图函数的实现在test.cpp中
[3] 存储结构、内存分配
定义了全局栈vector1,对鼠标移动中的坐标点进行记录
定义全局point 类型,对鼠标左键up和down时的坐标点进行记录
以下均为全局变量:
int WIDTH=3,RORTR=1; //WIDTH方便改变线条粗细,RORTR判断是输出圆还是椭圆
Point endot,bedot; //分别记录终点和起点,用于画直线、圆、椭圆、长方形
COLORREF mmcolor=RGB(0,0,0); //线条颜色
COLORREF ficolor=RGB(0,0,0); //填充颜色
第5页
北京邮电大学信息与通信工程学院
2.3 关键算法分析
算法一:
case WM_MOUSEMOVE: //记录鼠标移动过程的点
{
int x=LOWORD(lParam);
int y=HIWORD(lParam);
if ((wParam&MK_LBUTTON))
{ //鼠标在移动过程中按着LBUTTON和SHIFT键
logoutput(\"鼠标在移动过程中按着LBUTTON和SHIFT键\");
vector1.push_back(Point(x,y));
}
}
InvalidateRect(hwnd,NULL,TRUE);
第6页
北京邮电大学信息与通信工程学院
break;
根据系统以及定义好的消息—WM_MOUSEMOVE,每当鼠标移动变回收到这个消息,进而将鼠标轨迹中的点压入栈中
算法二:
case WM_LBUTTONDOWN: //记录起点
{
int x=LOWORD(lParam);
int y=HIWORD(lParam);
bedot=Point(x,y);
}
获得按下鼠标左键时的点,以便在画直线、圆、椭圆时应用
相似的可以利用WM_LBUTTONUP消息获得
算法三:
void mydot(GraphicWindow & cwin) //画点
第7页
北京邮电大学信息与通信工程学院
{
extern COLORREF mmcolor;
for (int i=0;i Point x =vector1[i]; Point x1(cwin.disp_to_user_x(x.get_x()),cwin.disp_to_user_y(x.get_y())); x1.SetColor(mmcolor); cwin << x1; } } 从栈中取点并画出,同时通过SetColor()来设置颜色。 时间复杂度:n 空间复杂度:n 算法四: 第8页 北京邮电大学信息与通信工程学院 void myline(GraphicWindow & cwin) //画线 { extern int WIDTH; extern COLORREF mmcolor; for (int i=0;i Point be =vector1[i]; Point x1(cwin.disp_to_user_x(be.get_x()),cwin.disp_to_user_y(be.get_y())); if(i+1 Point x2(cwin.disp_to_user_x(en.get_x()),cwin.disp_to_user_y(en.get_y())); Line A(x1,x2); A.SetColor(mmcolor); 第9页 北京邮电大学信息与通信工程学院 cwin<} 将vector1中的点依次用直线连接,因为每两个点之间间隔非常小,所以最终达到画出曲线的效果 时间复杂度:n 空间复杂度:n 算法五: void mydline(GraphicWindow & cwin) //直线 { extern COLORREF mmcolor; extern Point endot; extern Point bedot; extern int WIDTH; Point be =bedot; Point x1(cwin.disp_to_user_x(be.get_x()),cwin.disp_to_user_y(be.get_y())); 第10页 北京邮电大学信息与通信工程学院 Point en=endot; Point x2(cwin.disp_to_user_x(endot.get_x()),cwin.disp_to_user_y(endot.get_y())); Line A(x1,x2); A.SetColor(mmcolor); A.b=WIDTH;
Copyright © 2019- dfix.cn 版权所有 湘ICP备2024080961号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务