C++面向对象简易图形编辑器Word文件下载.docx
《C++面向对象简易图形编辑器Word文件下载.docx》由会员分享,可在线阅读,更多相关《C++面向对象简易图形编辑器Word文件下载.docx(39页珍藏版)》请在冰豆网上搜索。
![C++面向对象简易图形编辑器Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/30/ede75a66-0f10-424a-b6af-caa868dd6d75/ede75a66-0f10-424a-b6af-caa868dd6d751.gif)
效果图如下:
2.2绘制直线
首先定义一个直线的结构体数组
structMySaveLine//直线保存
{
POINTptS;
POINTptE;
COLORREFcolor;
intpenWidth;
intpenStyle;
};
绘制直线的函数如下:
voidDrawMyLine(HDChdc)//绘制直线
HPENhPen;
HPENhPenOld;
intj;
for(j=0;
j<
MAX;
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//矩形保存
HBRUSHhNewBrush;
intbrushColor;
绘制矩形的函数如下:
voidDrawMyRectangle(HDChdc)//绘制矩形
HBRUSHhOldBrush;
hPen=CreatePen(SaveRectangle[j].penStyle,SaveRectangle[j].penWidth,SaveRectangle[j].color);
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);
}
Rectangle(hdc,SaveRectangle[j].ptS.x,SaveRectangle[j].ptS.y,
SaveRectangle[j].ptE.x,SaveRectangle[j].ptE.y);
SelectObject(hdc,hOldBrush);
}
2.4绘制椭圆
首先定义一个椭圆的结构体数组
structMySaveEllipse//椭圆保存
绘制椭圆的函数如下:
voidDrawMyEllipse(HDChdc)//绘制椭圆
hPen=CreatePen(SaveEllipse[j].penStyle,SaveEllipse[j].penWidth,SaveEllipse[j].color);
hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(SaveEllipse[j].brushColor));
hOldBrush=(HBRUSH)SelectObject(hdc,SaveEllipse[j].hNewBrush);
Ellipse(hdc,SaveEllipse[j].ptS.x,SaveEllipse[j].ptS.y,
SaveEllipse[j].ptE.x,SaveEllipse[j].ptE.y);
2.5输入文本
输入文本前可以选择文本的字体、颜色,然后点击鼠标左键在该处输入文本。
先定义一个文本的结构体数组
structMySaveText//文本保存
POINTpt;
charg_EditInput[1024];
COLORREFcrText;
HFONThFont;
选择字体的函数如下:
voidChooseFont(HWNDhwnd)
{
staticLOGFONTlogfont;
staticCHOOSEFONTcf;
staticHFONThFont;
GetObject(GetStockObject(SYSTEM_FONT),sizeof(LOGFONT),
(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(&
InvalidateRect(hwnd,NULL,TRUE);
选择颜色的函数如下:
voidChooseColor(HWNDhwnd)
staticCHOOSECOLORcc;
staticCOLORREFcrCustomColors[16];
staticCOLORREFcrText=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];
输出函数的文本如下:
voidDrawMyText(HDChdc)
for(j=0;
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文本保存
代码如下
voidSaveMyData(structMySaveLine*SaveLine,intLineCount,structMySaveRectangle*SaveRectangle,intRectangleCount,structMySaveEllipse*SaveEllipse,intEllipseCount,structMySaveText*SaveText,intTextCount)
staticHANDLEhFile;
hFile=CreateFile("
e:
\\abc.f"
GENERIC_WRITE,0,
NULL,CREATE_ALWAYS,0,NULL);
if(hFile!
=INVALID_HANDLE_VALUE)
DWORDdwByte1=0;
DWORDdwByte2=0;
DWORDdwByte3=0;
DWORDdwByte4=0;
WriteFile(hFile,&
LineCount,sizeof(int),
&
dwByte1,NULL);
RectangleCount,sizeof(int),
dwByte2,NULL);
EllipseCount,sizeof(int),
dwByte3,NULL);
TextCount,sizeof(int),
dwByte4,NULL);
WriteFile(hFile,SaveLine,LineCount*sizeof(MySaveLine),
WriteFile(hFile,SaveRectangle,RectangleCount*sizeof(MySaveRectangle),
WriteFile(hFile,SaveEllipse,EllipseCount*sizeof(MySaveEllipse),
WriteFile(hFile,SaveText,TextCount*sizeof(MySaveText),
CloseHandle(hFile);
2.7文本读取
代码如下:
voidLoadMyData(structMySaveLine*SaveLine,intLineCount,structMySaveRectangle*SaveRectangle,intRectangleCount,structMySaveEllipse*SaveEllipse,intEllipseCount,structMySaveText*SaveText,intTextCount)
GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,0,NULL);
ReadFile(hFile,&
ReadFile(hFile,SaveLine,LineCount*sizeof(MySaveLine),
ReadFile(hFile,SaveRectangle,RectangleCount*sizeof(MySaveRectangle),
ReadFile(hFile,SaveEllipse,EllipseCount*sizeof(MySaveEllipse),
ReadFile(hFile,SaveText,TextCount*sizeof(MySaveText),
3实验总结
本实验最大的特点是使用结构体数组,这也是我第一次使用结构体数组,从不使用结构体到使用结构体指针最后升级到结构体数组是一个循序渐进的过程,在这个过程中我越来越感觉到结构体在管理数据方面的优势。
我的感觉是在主CPP文件中代码应该是越少越好,很多地方只要调用函数就可以了,然后在另外的CPP中写函数。
这样的程序给人的感觉是分层做的比较好,调理比较清晰。
附录关键代码
一、主CPP
/*******************************************************************
程序:
Paint
文件:
Paint.cpp
功能:
简易的图像编辑器
********************************************************************/
#include"
draw.h"
#defineMAX100
TCHARszAppName[];
structMySaveLineSaveLine[MAX];
structMySaveRectangleSaveRectangle[MAX];
structMySaveEllipseSaveEllipse[MAX];
structMySaveTextSaveText[MAX];
intlineCount;
intrectangleCount;
intellipseCount;
inttextCount;
DRAWDATA*pDrawData;
HACCELhAccel;
HDChdc;
inti,m,n,p,q;
BOOLInitWindow(HINSTANCEhInstance,intnCmdShow);
LRESULTCALLBACKWinProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam);
函数:
WinMain()
Win32应用程序入口函数。
创建主窗口,处理消息循环
intWINAPIWinMain(HINSTANCEhInstance,//当前实例句柄
HINSTANCEhPrevInstance,//前一个实例句柄
PSTRszCmdLine,//命令行字符
intiCmdShow)//窗口显示方式
MSGmsg;
char*p;
//创建主窗口
if(!
InitWindow(hInstance,iCmdShow))
returnFALSE;
p=0;
//进入消息循环:
从该应用程序的消息队列中检取消息,
//送到消息处理过程,当检取到WM_QUIT消息时,退出消息循环。
while(GetMessage(&
msg,NULL,0,0))
TranslateMessage(&
msg);
DispatchMessage(&
returnmsg.wParam;
/******************************************************************
InitWindow()
创建窗口。
*******************************************************************/
staticBOOLInitWindow(HINSTANCEhInstance,intiCmdShow)
HWNDhwnd;
//窗口句柄
WNDCLASSwcMainWnd;
//窗口类结构
ATOMa;
//填充窗口类结构
wcMainWnd.style=CS_VREDRAW|CS_HREDRAW;
wcMainWnd.lpfnWndProc=WinProc;
wcMainWnd.cbClsExtra=0;
wcMainWnd.cbWndExtra=0;
wcMainWnd.hInstance=hInstance;
wcMainWnd.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
wcMainWnd.hCursor=LoadCursor(NULL,IDC_ARROW);
wcMainWnd.hbrBackground=(structHBRUSH__*)GetStockObject(WHITE_BRUSH);
wcMainWnd.lpszMenuName=(LPSTR)IDR_MENU1;
;
wcMainWnd.lpszClassName=szAppName;
LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));
hAccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));
//注册窗口类
a=RegisterClass(&
wcMainWnd);
a)
MessageBox(NULL,TEXT("
注册窗口类失败!
"
),szAppName,
MB_ICONERROR);
return0;
hwnd=CreateWindow(szAppName,//窗口类名称
TEXT("
简易的图形编辑器作者:
娄通"
),//窗口标题
WS_OVERLAPPEDWINDOW,//窗口风格
200,//窗口位置的x坐标
200,//窗口位置的y坐标