基于VC++MFC程序設计简易画图板.doc(3)

电脑杂谈  发布时间:2019-08-21 08:04:35  来源:网络整理

也就是去掉上述代码OnMouseMove函数中更改线段起点的代码。程序代码如下:voidCGraphicView::OnMouseMove(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefault{//创建并获得设备描述CClientDCdc(this);//创建宽度为1的虚线红色画笔CPenpen(PS_SOLID,1,RGB(255,0,0));//把创建的画笔选入设备描述CPen*pOldpen=dc.SelectObject(&pen);if(m_bDraw==true){dc.MoveTo(m_ptOrigin);dc.LineTo(point);}//恢复设备描述dc.SelectObject(pOldpen);CView::OnMouseMove(nFlags,point);}3.3.3画刷再为此程序添加一个子菜单,菜单名称为“画刷”,并为其添加三个菜单项,分别用来控制不同的画刷。MFC提供了一个CBrush类,可以拿来创建画刷对象。

画刷通常用来填充一块区域。简单画刷、位图画刷、透明画刷,程序代码如下:voidCDrawView::OnLButtonUp(UINTnFlags,CPointpoint){//创建一个红色画刷CBrushbrush(RGB(255,0,0));//建立并获取设备描述表CClientDCdc(this);//运用黑色画刷填充鼠标拖拽过程中产生的方形区域dc.FillRect(CRect(m_ptOrigin,point),&brush);//创建位图对象CBitmapbitmap;//读取位图资源bitmap.LoadBitmap(IDB_BITMAP1);//创建位图画刷CBrushbrush(&bitmap);//构建并获取设备描述表CClientDCdc(this);//运用黑色画刷填充鼠标拖拽过程中产生的方形区域dc.FillRect(CRect(m_ptOrigin,point),&brush);//构建并获取设备描述表CClientDCdc(this);//创建一个空画刷CBrush*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//将空画刷选入设备描述表CBrush*pOldBrush=dc.SelectObject(pBrush);//绘制一个矩形dc.Rectangle(CRect(m_ptOrigin,point));//恢复先前的画刷dc.SelectObject(pOldBrush);m_bDraw=FALSE;CView::OnLButtonUp(nFlags,point);}在简洁画刷程序中,首先构建一个蓝色画刷;接着建立设备描述表对象;然后读取设备描述表对象的成员变量FillRect,利用指定的画刷填充一块选定的圆形区域,而光标拖动过程中的起点和终点就决定了还要填充的矩形区域,因此,代码中借助CRect类利用鼠标拖放的起点和终点构造了这快矩形区域。

CRect类提供了多个构造变量,这里使用的是上面这种构造数组,即借助指定矩形区域的左上角和右下角这两个点来构造一块方形区域。CRect(POINTtopLeft,POINTbottomRight);代码中的CDC类的成员变量FillRect,该数组的用途是用选定的画刷填充一个方形。该变量将填充全部的圆形,包括上左侧界,但不填充右底边界。FillRect函数的声明如下:voidFillRect(LPCRECTlpRect,CBrush*pBrush);该变量有两个参数,lpRect是指向一个RECT结构体或CRect对象的指针,该结构体或对象中包括了要填充的圆形的逻辑坐标。pBrush是对准用于填充矩形的画刷对象的指针。在位图画刷程序中,CBrush类有上面这样一种构造函数。CBrush(CBitmap*pBitmap);该构造变量要求一个CBitmap类型的指针,CBitmap类是位图类,于是我们还会这样想:利用这个构造变量是否就可以建立一个位图画刷呢?事实确实如此。创建CBitmap对象时,仅读取其构造变量并不能得到一个有用的位图对象,还还要读取一个初始化变量来初始化这个位图对象。

CBitmap类提供了多个初始化函数,例如,LoadBitmap、CreateBitmap、BitmapIndirect等。这里用LoadBitmap函数来读取一副位图,该变量的声明如下:BOOLLoadBitmap(LPCTSTRlpszResourceName);BOOLLoadBitmap(UINTnIDResource);其中第二种声明应该一个资源ID作为参数。首先给程序降低一个位图资源。为一个项目建立资源有多种推动方式,其中一种步骤可以借助【Insert】菜单下的【Resource…】命令,在跳出的对话框中选取Bitmap资源类别,单击【New】按钮,即可创建一个默认名称为IDB_BITMAP1的位图资源,并在VC++集成开发环境右边的代码编辑区中开启位图编辑器。可以借助编辑器左边的调色板和画图软件来编辑位图资源,还可以借助拉伸位图编辑器中网格周围的金色方点来微调位图的大小。在透明画刷程序中,我们借助GetStockObject这个函数来获取一个蓝色或橙色的画刷句柄。这个变量是否无法获取一个透明画刷句柄呢?从MSND提供的帮助信息中,可以提到该方程的参数取值之一可以是NULL_BRUSH,以获取一个空画刷。

mfc画图_mfc画图板_洞洞板画图软件

那么,这个空画刷是否就是我们所还要的透明画刷呢?结论是恰当的。但此时存在一个弊端,我们获得的是句柄,而在进行重绘操作时还要的是一个画刷对象。如何从画刷句柄转化为画刷对象呢?CBrush类提供了一个FromHandle函数来推动这样的功能。该变量的声明如下:StaticCDC*PASCALFromHandle(HDChDC);3.3.4设置对话框为程序添加一个设定对话框,允许用户选定画笔的类别、线宽,并让之后的绘图操作就使用用户选定的新设定值来进行绘制。为了推动这一用途,首先还要为程序添加一个对话框资源,并按下表更改属性。属性值IDIDD_DLG_SETTINGCaptionSettingFont宋体设置线型、线宽对话框的代码如下:voidCGraphicView::OnSetting(){//TODO:AddyourcommandhandlercodehereCSettingDlgdlg;dlg.m_nLineWidth=m_nLineWidth;dlg.m_nLineStyle=m_nLineStyle;if(IDOK==dlg.DoModal()){m_nLineWidth=dlg.m_nLineWidth;m_nLineStyle=dlg.m_nLineStyle;}}3.3.5颜色形状对话框看上去比较复杂。

实际上,MFC为我们提供了一个类:CColorDialog,可以很便于的构建这样的一个样式对话框。voidCGraphicView::OnColor(){//TODO:AddyourcommandhandlercodehereCColorDialogdlg;dlg.m_cc.Flags|=CC_RGBINIT|CC_FULLOPEN;dlg.m_cc.rgbResult=m_clr;if(IDOK==dlg.DoModal()){m_clr=dlg.m_cc.rgbResult;}}3.3.6打开与保存voidCGraphicView::OnFileOpen(){//TODO:AddyourcommandhandlercodehereHMETAFILEhmetaFile;hmetaFile=GetMetaFile("meta.wmf");m_dcMetaFile.PlayMetaFile(hmetaFile);DeleteMetaFile(hmetaFile);Invalidate();}voidCGraphicView::OnFileSave(){//TODO:AddyourcommandhandlercodehereHMETAFILEhmetaFile;hmetaFile=m_dcMetaFile.Close();CopyMetaFile(hmetaFile,"meta.wmf");m_dcMetaFile.Create();DeleteMetaFile(hmetaFile);}第4章结果及结论4.1运行结果运行结果如图7、8、9图7图8图94.2结论显然学任何一种语言都是一样的。

应该谦逊+自信+人品=失败,这是我觉得的一个公式。这里毅力和刻苦是个人原因,而人品这是先天的。如果先前没有接触过编程语言的话,在接触VC前我建议你先学习一些基础语言,比如C等都是一些比较好学的基础语言,我以前就是从C语言过分学VC的。学基础语言的目的是学习句型结构和如何编写概念,只有你理解和把握了很多编程用的软件就能学习初级语言。这些基础语言中我建议大家学C语言,其实VC就是C++也就是C语言的"丈夫","老爸"学习上去比较容易上手,但碰到类似WINDOWS的程序的时侯比较死板不易于沟通,在这种条件下才有了"孩子","老公"比较稳重应变能力强,但是就因为他很多缺点才使初学者无法把握。VC是C++语言,是一种面向对象的编程语言。他于基础语言不同点在于,基础语言是一条路走到底的(中断技术除外),而面向对象是等待你的指令才往后走,是主动的编程语言。这点是学习VC前需要扭转的概念。通过现在学年设计,我知道vc++是Windows平台上的C++编程环境,学习VC要知道好多Windows平台的特点使得需要把握MFC、ATL、COM等的常识,难度比较大。

Windows下编程应该知道Windows的消息体系以及回调(callback)方程的机理;MFC是Win32API的包装类,需要理解文档视图类的构架,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要把握其基本机理等等。基于我们现在用VC++编写了一个简洁的绘图板,功能不是好多,但是从中的到不少收获。主要有:1.对项目和文档的知道,我们在编写程序时,要对不同的文件进行编写。其中工程就是文件的集合,包括头文件、源代码文件、资源文件。文档窗口也称编辑窗口,是用户进行键入或编辑头文件、源文件、资源的区域。在编辑文件时,为了减少程序的可读性,系统用橙色显示注解语句,用显示关键字。2.菜单:我们勾画画图板时,就要建立一个“绘图”菜单。对于“绘图”菜单下也有几个子菜单项,通过确立菜单同时让它推动菜单上的命令,这还要我们对每个菜单项进行设定,诸如,ID、标题、快捷键、热键等。还有一些属性设定,设置不好,容易错误,所以每天完善菜单,都需谨慎修改,记住每个菜单对应的参数。3.文件开启与储存,对于我们描绘出一幅照片,那么我们还要把它保存出来。如果我们没法保存,我们做了也就没没什么意义了。

对于图形的保存于打开,我们还存在太多弊端,自定义储存不同文件夹下尚未解决mfc画图板,所以还还要我们进一步的学习和知道,争取实珂高丽华张迎新编著清华中学出版社出版附录:简易画图板主要程序代码//GraphicView.cpp:implementationoftheCGraphicViewclass#include"stdafx.h"#include"Graphic.h"#include"GraphicDoc.h"#include"GraphicView.h"#include"SettingDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CGraphicViewIMPLEMENT_DYNCREATE(CGraphicView,CView)BEGIN_MESSAGE_MAP(CGraphicView,CView)//{{AFX_MSG_MAP(CGraphicView)ON_COMMAND(IDM_DOT,OnDot)ON_COMMAND(IDM_LINE,OnLine)ON_COMMAND(IDM_RECTANGLE,OnRectangle)ON_COMMAND(IDM_ELLIPSE,OnEllipse)ON_COMMAND(IDM_SHANXING,OnShanxing)ON_COMMAND(IDM_LIANXUXIAN,OnLianxuxian)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_COMMAND(IDM_SETTING,OnSetting)ON_COMMAND(IDM_COLOR,OnColor)ON_COMMAND(IDM_JDHS,OnJdhs)ON_COMMAND(IDM_WTHS,OnWths)ON_COMMAND(IDM_TMHS,OnTmhs)ON_COMMAND(ID_FILE_OPEN,OnFileOpen)ON_COMMAND(ID_FILE_SAVE,OnFileSave)//}}AFX_MSG_MAP//StandardprintingcommandsON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CGraphicViewconstruction/destructionCGraphicView::CGraphicView(){//TODO:addconstructioncodeherem_nDrawType=0;m_ptOrigin=0;m_bDraw=false;m_nLineWidth=0;m_nLineStyle=0;m_clr=(255,0,0);m_dcMetaFile.Create();}CGraphicView::~CGraphicView(){}BOOLCGraphicView::PreCreateWindow(CREATESTRUCT&cs){//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcsreturnCView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////////CGraphicViewdrawingvoidCGraphicView::OnDraw(CDC*pDC){CGraphicDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahereHMETAFILEhmetaFile;hmetaFile=m_dcMetaFile.Close();pDC->PlayMetaFile(hmetaFile);m_dcMetaFile.Create();m_dcMetaFile.PlayMetaFile(hmetaFile);DeleteMetaFile(hmetaFile);}///////////////////////////////////////////////////////////////////////////////CGraphicViewprintingBOOLCGraphicView::OnPreparePrinting(CPrintInfo*pInfo){//defaultpreparationreturnDoPreparePrinting(pInfo);}voidCGraphicView::OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addextrainitializationbeforeprinting}voidCGraphicView::OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addcleanupafterprinting}///////////////////////////////////////////////////////////////////////////////CGraphicViewdiagnostics#ifdef_DEBUGvoidCGraphicView::AssertValid()const{CView::AssertValid();}voidCGraphicView::Dump(CDumpContext&dc)const{CView::Dump(dc);}CGraphicDoc*CGraphicView::GetDocument()//non-debugversionisinline{看到这里了。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-120024-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...