C++面向对象简易图形编辑器.docx
《C++面向对象简易图形编辑器.docx》由会员分享,可在线阅读,更多相关《C++面向对象简易图形编辑器.docx(32页珍藏版)》请在冰豆网上搜索。
山东大学(威海)机电与信息工程学院
2011级
面向对象编程技术实验五实验报告
班 级:
学 号:
姓 名:
时 间:
2013-12-01
目 录
1实验要求 1
A、基本功能要求 1
B、高级要求 1
2实验过程及结果 1
2.1交互式绘制图形 1
2.2绘制直线 1
2.3绘制矩形 2
2.4绘制椭圆 3
2.5输入文本 4
2.6文本保存 6
2.7文本读取 7
3实验总结 8
附录关键代码 8
一、主CPP 8
二、附CPP 22
三、头文件 28
面向对象编程技术实验报告
1实验要求
A、基本功能要求
1.交互式绘制图形(至少包括线、矩形和文本),绘制完成的图形能够正确地重现
2.绘制结果可以正确持久化(存储到文件、从文件中读出)//
3.最终交付的工程中至少包含两个源文件(.cpp文件,即除主程序外,将部分函数分离到单独的源文件)、一个rc文件
用“椭圆”绘制
B、高级要求
1.线、矩形、文本的颜色(线色和填充色)、文本字体可调。
2.能够通过鼠标点击选中图形,并进行属性的修改,修改的内容可包括:
l位置
l大小
l颜色
l线型
l字体(对应文本图元而言)
3.能够删除选中的图形
2实验过程及结果
2.1交互式绘制图形
此次绘制图形的程序和例程中EasyDraw不同,相比后者,本程序的绘制是建立在结构体数组的基础上的。
绘制结果完全可以满足实验要求。
效果图如下:
2.2绘制直线
首先定义一个直线的结构体数组
0
面向对象编程技术实验报告
structMySaveLine //直线保存
{
POINTptS;
POINTptE;
COLORREFcolor;intpenWidth;
intpenStyle;
};
绘制直线的函数如下:
voidDrawMyLine(HDChdc) //绘制直线
{
HPENhPen;HPENhPenOld;intj;
for(j=0;j{
hPen=CreatePen(SaveLine[j].penStyle,SaveLine[j].penWidth,SaveLine[j].color);hPenOld=(HPEN)SelectObject(hdc,hPen);
MoveToEx(hdc,SaveLine[j].ptS.x,SaveLine[j].ptS.y,NULL);LineTo(hdc,SaveLine[j].ptE.x,SaveLine[j].ptE.y);SelectObject(hdc,hPenOld);
DeleteObject(hPen);
}
}
2.3绘制矩形
首先定义一个矩形的结构体数组
structMySaveRectangle //矩形保存
{
POINTptS;
POINTptE;
COLORREFcolor;HBRUSHhNewBrush;intbrushColor;
intpenWidth;intpenStyle;
};
绘制矩形的函数如下:
voidDrawMyRectangle(HDChdc) //绘制矩形
{
intj;
HBRUSHhOldBrush;HPENhPen;
2
HPENhPenOld;for(j=0;j{
hPen = CreatePen(SaveRectangle[j].penStyle, SaveRectangle[j].penWidth,SaveRectangle[j].color);
hPenOld=(HPEN)SelectObject(hdc,hPen);switch(pDrawData->iSelectionBrush)
{
caseIDM_BRUSH_WHITE:
caseIDM_BRUSH_LTGRAY:
hOldBrush = (HBRUSH)SelectObject (hdc,GetStockObject(SaveRectangle[j].brushColor));
break;
caseIDM_BRUSH_COLORSOLID:
caseIDM_BRUSH_CROSS:
hOldBrush=(HBRUSH)SelectObject(hdc,SaveRectangle[j].hNewBrush);break;
}
Rectangle(hdc,SaveRectangle[j].ptS.x,SaveRectangle[j].ptS.y,SaveRectangle[j].ptE.x,SaveRectangle[j].ptE.y);
SelectObject(hdc,hPenOld);DeleteObject(hPen);SelectObject(hdc,hOldBrush);
}
}
2.4绘制椭圆
首先定义一个椭圆的结构体数组
structMySaveEllipse //椭圆保存
{
POINTptS;
POINTptE;
COLORREFcolor;HBRUSHhNewBrush;intbrushColor;
intpenWidth;intpenStyle;
};
绘制椭圆的函数如下:
voidDrawMyEllipse(HDChdc) //绘制椭圆
HPENhPenOld;for(j=0;j{
hPen = CreatePen(SaveEllipse[j].penStyle, SaveEllipse[j].penWidth,SaveEllipse[j].color);
hPenOld=(HPEN)SelectObject(hdc,hPen);switch(pDrawData->iSelectionBrush)
{
caseIDM_BRUSH_WHITE:
caseIDM_BRUSH_LTGRAY:
hOldBrush = (HBRUSH)SelectObject (hdc,GetStockObject(SaveEllipse[j].brushColor));
break;
caseIDM_BRUSH_COLORSOLID:
caseIDM_BRUSH_CROSS:
hOldBrush=(HBRUSH)SelectObject(hdc,SaveEllipse[j].hNewBrush);break;
}
Ellipse(hdc,SaveEllipse[j].ptS.x,SaveEllipse[j].ptS.y,
SaveEllipse[j].ptE.x,SaveEllipse[j].ptE.y);SelectObject(hdc,hPenOld);
DeleteObject(hPen);SelectObject(hdc,hOldBrush);
}
}
2.5输入文本
输入文本前可以选择文本的字体、颜色,然后点击鼠标左键在该处输入文本。
先定义一个文本的结构体数组
structMySaveText //文本保存
{
POINTpt;
charg_EditInput[1024];COLORREF crText;HFONThFont;
};
选择字体的函数如下:
voidChooseFont(HWNDhwnd)
{
staticLOGFONT logfont;staticCHOOSEFONT cf;staticHFONT hFont;
GetObject(GetStockObject(SYSTEM_FONT),sizeof(LOGFONT),
29
(PTSTR)&logfont); //初始化结构logfont
cf.lStructSize =sizeof(CHOOSEFONT);cf.hwndOwner =hwnd;
cf.hDC =NULL;
cf.lpLogFont =&logfont;
cf.iPointSize =0;
cf.Flags =CF_INITTOLOGFONTSTRUCT|CF_SCREENFONTS|CF_EFFECTS;
cf.rgbColors =0;
cf.lCustData =0;
cf.lpfnHook =NULL;cf.lpTemplateName=NULL;cf.hInstance =NULL;
cf.lpszStyle =NULL;
cf.nFontType =0;
cf.nSizeMin =0;
cf.nSizeMax =0;if(ChooseFont(&cf))
{
if(SaveText[q].hFont) DeleteObject(SaveText[q].hFont);SaveText[q].hFont=CreateFontIndirect(&logfont);
InvalidateRect(hwnd,NULL,TRUE);
}
}
选择颜色的函数如下:
voidChooseColor(HWNDhwnd)
{
staticCHOOSECOLOR cc;
staticCOLORREF crCustomColors[16];staticCOLORREF crText=RGB(0,0,0);
//初始化结构cc
cc.lStructSize =sizeof(CHOOSECOLOR);cc.hwndOwner =hwnd;
cc.hInstance =NULL;
cc.rgbResult =RGB(0,0,0);cc.lpCustColors =crCustomColors;
cc.Flags =CC_RGBINIT|CC_FULLOPEN;
cc.lCustData =0;
cc.lpfnHook =NULL;cc.lpTemplateName=NULL;
if(ChooseColor(&cc))
{
SaveText[q].crText=crCustomColors[0];InvalidateRect(hwnd,NULL,TRUE);
}
}
输出函数的文本如下:
voidDrawMyText(HDChdc)
{
intj;
for(j=0;j{
if(SaveText[j].hFont)SelectObject(hdc,SaveText[j].hFont);//选用逻辑字体SetTextColor(hdc,SaveText[j].crText);
TextOut (hdc, SaveText[j].pt.x,SaveText[j].pt.y,SaveText[j].g_EditInput
strlen(SaveText[j].g_EditInput));
SelectObject(hdc,GetStockObject(SYSTEM_FONT)); //还原逻辑字体
}
}.
2.6文本保存
代码如下
void