C++面向对象简易图形编辑器Word文件下载.docx

上传人:b****5 文档编号:18678169 上传时间:2022-12-31 格式:DOCX 页数:39 大小:69.75KB
下载 相关 举报
C++面向对象简易图形编辑器Word文件下载.docx_第1页
第1页 / 共39页
C++面向对象简易图形编辑器Word文件下载.docx_第2页
第2页 / 共39页
C++面向对象简易图形编辑器Word文件下载.docx_第3页
第3页 / 共39页
C++面向对象简易图形编辑器Word文件下载.docx_第4页
第4页 / 共39页
C++面向对象简易图形编辑器Word文件下载.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

C++面向对象简易图形编辑器Word文件下载.docx

《C++面向对象简易图形编辑器Word文件下载.docx》由会员分享,可在线阅读,更多相关《C++面向对象简易图形编辑器Word文件下载.docx(39页珍藏版)》请在冰豆网上搜索。

C++面向对象简易图形编辑器Word文件下载.docx

效果图如下:

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坐标

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1