简易绘图程序 使用API和MFCWord格式文档下载.docx
《简易绘图程序 使用API和MFCWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《简易绘图程序 使用API和MFCWord格式文档下载.docx(20页珍藏版)》请在冰点文库上搜索。
绘制圆弧线
Polybezir:
绘制弯曲线
b)区域绘图函数
Rectant:
绘制矩形
Roundrect:
绘制圆边矩形
Ellips:
绘制椭圆
Pie:
绘制扇形
2)自由绘图:
拖动鼠标可以自由绘制曲线,可以通过一个对话框选择所需线形线宽等。
3)清空功能:
1)全部清空:
可以清空整个屏幕内容。
2.系统设计
2.1系统总体框架
API:
MFC:
2.2系统详细设计
2.2.1模块划分图及描述
a)绘图函数模块:
通过各种系统自带的绘图函数,直接调用绘图。
设置他们的位置,并添加到菜单项,使点击菜单项则可出现相应图形。
b)自由绘图模块:
按下鼠标左键,初始化起始位置,在选定自由绘图模式的情况下,拖动鼠标的同时,获取鼠标当前位置为终点位置,调用MoveTo和LineTo函数连接两点。
连线完成后,将上一条直线的终点作为下一次连线的起始位置。
反复进行该操作,直到鼠标左键不再处于按下状态。
当连线的频率足够快时,所画出的图形能近似于曲线,就能实现自由绘图。
更改画笔线宽、线形:
设置一个对话框,分别定义两个成员变量储存用户选择的现款和线形,再用一个整形变量,在每次绘图前,声明一个CPen类型的画笔对象,并用储存的颜色和线宽对该对象进行初始化,随后把该画笔选入设备描述表中。
c)窗口图形模块:
通过在资源视图中设置菜单栏,将菜单栏设置成绘图函数、设置、清空(等板块;
并默认为自由线画图,分别定关联函数和变量来记录做出的选择。
2.2.2类关系图及描述
本程序主要在视图类中进行操作,原有类主要是CDrawView类有更改,其他类都由系统生成,未做很大更改。
另外,新定义了一个Csettingdlg类来存储线宽和线形的设置。
名称
属性
备注
m_ptOrgin
成员变量
记录画图起点
m_ptEnd
记录画图终点
m_color
记录画笔和画刷颜色
m_width
记录画笔线宽
m_SolidBrush
判断是否选择实心画刷
m_pBrush
存储画图时使用的画刷
LDown
判断鼠标左键是否按下
OnLine()
成员函数
绘图函数中选择“直线”选项响应函数
OnRectangle()
绘图函数中选择“矩形”选项响应函数
OnEllipse()
绘图函数中选择“椭圆”选项响应函数
Onpie()
绘图函数中选择“扇形”选项响应函数
OnLButtonDown()
绘图模式中鼠标左键按下响应函数
OnLButtonUp()
鼠标左键弹起响应函数
Onquanbuqingkong()
选择“清除屏幕”选项响应函数
OnMouseMove()
鼠标移动响应函数
Onxiantiao()
储存选择的线条宽度和线条形状
2.2.3程序流程图及描述
2.3关键算法分析
函数一:
//窗口函数
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,
WPARAMwParam,LPARAMlParam)
{
staticintmenuId=0;
//静态变量
intwmId,wmEvent;
HDChdc;
PAINTSTRUCTps;
switch(message)
{
caseWM_CREATE:
SetTimer(hwnd,1,1000,NULL);
break;
caseWM_TIMER:
InvalidateRect(hwnd,NULL,TRUE);
break;
caseWM_COMMAND:
//处理菜单消息
wmId=LOWORD(wParam);
wmEvent=HIWORD(wParam);
switch(wmId)
{
caseIDM_FIG1:
menuId=IDM_FIG1;
InvalidateRect(hwnd,NULL,TRUE);
//实现会动的时钟
caseIDM_FIG2:
menuId=IDM_FIG2;
//实现三角形的绘制
caseIDM_EXIT:
DestroyWindow(hwnd);
//实现退出程序功能
}
break;
caseWM_PAINT:
hdc=BeginPaint(hwnd,&
ps);
if(menuId){
cwin.open(hwnd,hdc);
switch(menuId){
caseIDM_FIG1:
mclock();
caseIDM_FIG2:
DrawTriangle(hwnd,hdc);
break;
//其它绘图程序
break;
}
EndPaint(hwnd,&
caseWM_DESTROY:
KillTimer(hwnd,1);
//销毁计时器
PostQuitMessage(0);
default:
//缺省时采用系统消息缺省处理函数
returnDefWindowProc(hwnd,message,wParam,lParam);
}
return(0);
}
函数二:
会动的时钟
voidmclock()
{Shape*pShape;
cwin<
<
Message(Point(-2,7),"
走动的时钟"
);
/*画表盘*/
intradius=6;
Pointorg(0,0);
pShape=&
org;
pShape->
SetColor(RGB(255,255,255));
//白色,设置表芯点的颜色
CircleclkPlate(org,radius);
clkPlate;
SetColor(RGB(0,255,255));
//蓝色,设置表盘圆周颜色c5
doublex,y,x_s,y_s,x_m,y_m,x_h,y_h;
inti;
for(i=0;
i<
12;
i++)//设置个整点的圆点
{
x=0.9*radius*sin(PI*i/6);
y=0.9*radius*cos(PI*i/6);
PointmPoint(x,y);
pShape=&
mPoint;
pShape->
SetColor((RGB(255,255,255)));
cwin<
structtmlocal;
time_tt;
//获取系统日历时间
t=time(NULL);
//将日历时间转化为本地时间
localtime_s(&
local,&
t);
x_s=0.89*radius*sin(PI*(local.tm_sec)/30);
//秒针
y_s=0.89*radius*cos(PI*(local.tm_sec)/30);
x_m=0.7*radius*sin(PI*(local.tm_min)/30);
//分针
y_m=0.7*radius*cos(PI*(local.tm_min)/30);
x_h=0.5*radius*sin(PI*(local.tm_hour)/6);
//时针
y_h=0.5*radius*cos(PI*(local.tm_hour)/6);
/*画表针*/
PointhEnd(x_h,y_h),mEnd(x_m,y_m),sEnd(x_s,y_s);
LinehLine(org,hEnd),mLine(org,mEnd),sLine(org,sEnd);
hLine.SetColor((RGB(255,0,0)));
//红色
mLine.SetColor((RGB(0,255,0)));
//绿色
sLine.SetColor((RGB(255,255,0)));
//黄色
hLine<
mLine<
sLine<
函数三:
画三角形
voidDrawTriangle(HWNDhwnd,HDChdc)
{//获得客户区域
RECTr;
GetClientRect(hwnd,&
r);
//设置映像模式
SetMapMode(hdc,MM_ISOTROPIC);
//设置窗口坐标范围
SetWindowExtEx(hdc,100,100,NULL);
//设置视口坐标范围
SetViewportExtEx(hdc,r.right,r.bottom,NULL);
//绘制三角形
Pointp[]={Point(10,10),Point(10,19),Point(22,19)};
MoveToEx(hdc,p[0].get_x(),p[0].get_y(),NULL);
for(inti=0;
i<
3;
i++)
{if(i==2)
{LineTo(hdc,p[0].get_x(),p[0].get_y());
continue;
LineTo(hdc,p[i+1].get_x(),p[i+1].get_y());
MFC:
画直线
voidCMYdrawView:
:
OnDrawLineto()
//TODO:
在此添加命令处理程序代码
CClientDCdc(this);
dc.MoveTo(300,300);
dc.LineTo(400,400);
画矩形
OnDrawRectangle()
dc.Rectangle(450,100,650,250);
画椭圆
OnDrawEllipse()
dc.Ellipse(450,400,650,500);
函数四:
OnLButtonDown(UINTnFlags,CPointpoint)
在此添加消息处理程序代码和/或调用默认值
CView:
OnLButtonDown(nFlags,point);
SetCapture();
:
SetCursor(m_hCross);
m_ptOrigin=point;
m_bDragging=true;
函数五:
OnLButtonUp(UINTnFlags,CPointpoint)
//CView:
OnLButtonUp(nFlags,point);
if(m_bDragging)
m_bDragging=false;
ReleaseCapture();
函数六:
OnMouseMove(UINTnFlags,CPointpoint)
//TODO:
CView:
OnMouseMove(nFlags,point);
if(m_bDragging)
{
CMYdrawDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
pDoc->
AddLine(m_ptOrigin,point);
//加入线段到指针数组
CClientDCdc(this);
CPenpen(m_nLineStyle,m_nLineWidth,RGB(0,0,0));
dc.SelectObject(&
pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOrigin=point;
函数七:
清空函数
OnDrawInvalidate()
this->
Invalidate();
函数八:
设置对话框
CSettingDlg:
CSettingDlg(CWnd*pParent/*=NULL*/)
CDialogEx(CSettingDlg:
IDD,pParent)
m_nLineWidth(0)
m_nLineStyle(0)
3.程序运行结果分析
图一:
图二三角形绘制
图三菜单
图四:
绘图函数展示
图五:
自由线画图展示
设置功能
4.总结
4.1课题的难点和关键点
难点:
课题的难点在于使用了对Windows的编程,使用到了大量的类,使用了全新的工具MFC。
VC是C++语言,是一种面向对象的编程语言。
他于基础语言不同点在于,基础语言是一条路走到底的(中断技术除外),而面向对象是等待你的指令才往下走,是被动的编程语言。
关键点:
vc++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。
Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;
MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;
COM是代码共享的二进制标准,需要掌握其基本原理等等。
4.2本课题的评价
本课题很有意思,初次接触式充满了意思。
设计以及编写时需要查大量的资料,丰富了我们的知识;
编写时极容易遇到困难,增加了我们的耐心;
最关键的还是学到了很多有用的关于VC的方法技巧。
便于我们在今后的学习中将MFC作为一种基本而优良的工具。
4.3心得体会
对于WINDOWS编程很游泳而且有意思,我们要好好学习,在以后的运用中才能熟能生巧。
3.参考文献
[1]《VisualC++6.0》XXX
[2]《基于MFC设计建议画图板》包头师范学校论文