您好,欢迎来到纷纭教育。
搜索
您的当前位置:首页MFC-绘图

MFC-绘图

来源:纷纭教育
第8课 MFC框架-绘图

===================================================================== 预备:常用的图形包 (1)OpenGL (2)ActiveX

(3)MFC-Windows GDI(Graphics Device Interface-图形设备接口)

===================================================================== 一、MFC基础绘图(003_基础绘图)

要求:掌握直线、矩形、椭圆的绘制。

方法:直接在“View”类中的“OnDraw”函数中写代码:

--------------------------------------------------------------------- (一)建立一个单文档项目

(二)直接在“…View”类中的“OnDraw()”函数中写代码:

--------------------------------------------------------------------- void CMy003View::OnDraw(CDC* /*pDC*/) {

CMy003Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return;

//------------------------------------------------ CClientDC dc(this); //直线

dc.MoveTo(100,100); dc.LineTo(200,200); //矩形

dc.Rectangle(300,100,400,200); //椭圆

dc.Ellipse(500,100,650,200);

//------------------------------------------------ // TODO: 在此处为本机数据添加绘制代码 }

------------------------------------------------------

(三)在“„View”类中建立一个函数

1、在“„View”类上按鼠标右键—>添加—>添加函数

2、在弹出的对话框中设置函数的类型(void)与名称(draw1),点击“完成”生成函数

3、编辑“draw1()”函数,将前面“OnDraw()”函数中的绘图代码剪切到这里 void CMy003View::draw1(void) {

CClientDC dc(this); //直线

dc.MoveTo(100,100);

dc.LineTo(200,200); //矩形

dc.Rectangle(300,100,400,200); //椭圆

dc.Ellipse(500,100,650,200); }

4、在“OnDraw()”函数中调用“draw1()”函数 void CMy003View::OnDraw(CDC* /*pDC*/) {

CMy003Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return;

//------------------------------------------------ draw1();

//------------------------------------------------ // TODO: 在此处为本机数据添加绘制代码 }

---------------------------------------------------------------------------- (四)建立菜单项调用绘图函数 1、建立菜单项

(1)切换到“资源视图”(菜单:“视图”->“资源视图”),在上面的列表中选择“Menu”—>“IDR_MAINFRAME”,双击,右侧弹出主菜单。 (2)在主菜单条中添加一项“绘图”,在其下面添加一个子菜单项“draw1”,ID为“ID_DRAW1”,如图所示:

2、菜单项调用函数

右击“draw1”菜单项,在弹出的菜单中选择“添加事件处理程序”,如图所示:

3、弹出窗口如下所示,在右侧的类列表中选择“„View”类,表示此函数建立在“„View”类中,点击“添加编辑”按钮。

4、出现函数编辑界面,在其中添加代码如下: void CMy003View::OnDraw1() {

draw1();

// TODO: 在此添加命令处理程序代码 }

运行程序,测试菜单项的功能

(五)添加工具条按钮,完成菜单项“draw1”的功能

在“Resouse(资源)”中选择“ToolBar”—>“IDR_MAINFRAME_256”。双击,在右侧工具条中添加一个按钮,ID设置为“ID_DRAW1”,与菜单项一致。用绘图工具在图标上画一条线。运行后点击工具按钮,会自动调用“draw1”函数。

===============================================================================二、画笔与画刷(线型、颜色、填充)(004_绘图_画笔与画刷)

===============================================================================

1、画笔:在“„View”类中建立绘图函数“draw1()”

void CMy004View::draw1(void) {

CClientDC dc(this);//定义DC CPen *pen;//定义画笔 pen=new CPen;//建立画笔

pen->CreatePen(PS_SOLID,3,RGB(255,0,0));//生成画笔 dc.SelectObject(pen);//装载画笔 dc.MoveTo(100,100); dc.LineTo(300,300);

pen->DeleteObject();//删除画笔

pen->CreatePen(PS_SOLID,5,RGB(0,0,255)); dc.SelectObject(pen);

dc.Rectangle(400,100,500,300); ReleaseDC(&dc);//释放DC }

----------------------------------------------- 2、画刷:在“„View”类中建立绘图函数“draw2()”

void CMy004View::draw2(void) {

CClientDC dc(this);//定义DC CBrush *brush;//定义画刷 brush=new CBrush;//建立画刷

brush->CreateSolidBrush(RGB(0,255,0));//生成画刷 dc.SelectObject(brush);//装载画刷

dc.Rectangle(100,100,200,200);//画矩形

brush->DeleteObject();//删除画刷

// brush->CreateHatchBrush(2,RGB(255,0,0));//图案画刷 brush->CreateStockObject(NULL_BRUSH);//空画刷 dc.SelectObject(brush);

dc.Rectangle(300,300,400,400); ReleaseDC(&dc);//释放DC }

------------------------------------------------------------------- 三、手绘直线(005_绘图_手绘直线) 1、建立项目 2、准备数据

(1)由于数据只在“View”类中使用,且比较简单,所以直接在“View”类中定义数据,如下所示。

//-------------------------------------------------------------------------- CPoint p0; //起始点 CPen *pen;//画笔

//-------------------------------------------------------------------------- (2)数据初始化

在“View”类的构造函数中对数据进行初始化,如下所示:

CTttView::CTttView() {

//-------------------------------------------------------------------------- Pen=new CPen; pen->CreatePen(PS_SOLID, 5, RGB(255, 0, 0));//画笔 //-------------------------------------------------------------------------- }

3、添加鼠标的消息函数代码 (1)OnLButtonDown

voidCMy005View::OnLButtonDown(UINT nFlags, CPoint point) {

//-------------------------------------------------------------------------- p0=point;//初始点

//-------------------------------------------------------------------------- CView::OnLButtonDown(nFlags, point); }

(2)OnLButtonUp

voidCMy005View::OnLButtonUp(UINT nFlags, CPoint point) {

//-------------------------------------------------------------------------- CClientDC dc(this);//定义DC dc.SelectObject(pen);//设置画笔 //画线 dc.MoveTo(p0); dc.LineTo(point);

//-------------------------------------------------------------------------- dc.TextOutW(0,0,_T(\" \"));//显示直线,弥补软件缺陷 CView::OnLButtonUp(nFlags, point);

}

------------------------------------------------------------------- 四、橡皮筋直线(006_绘图_橡皮筋直线) 1、建立项目

建立单文档项目。 2、 准备数据

(1)在上例的基础上,增加一个点pm,用于擦除(p0-pm)。增加一个标志f1,判断是否左键按下。否则鼠标移动时代码一直执行,会让程序死住。 CPoint p0,pm; //起始点和动态的终点变量 CPen *pen;//新画笔/橡皮筋临时线/旧画笔 bool f1;//鼠标左键按下标志 (2)数据初始化

CMy006View:: CTttView() { Pen->CreatePen(PS_SOLID, 5, RGB(255, 0, 0));//画笔 f1=false;//鼠标左按下标志 }

3、 鼠标的消息函数 (1)OnLButtonDown

void CMy006View::OnLButtonDown(UINT nFlags, CPoint point) { f1=true;//左键按下 p0=point;//初始点 pm=p0;//pm初始化 CView::OnLButtonDown(nFlags, point); }

(2)OnLButtonUp

void CMy006View::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default f1=false; CClientDC dc(this); dc.SelectObject(pen);//设置画笔 //画线 dc.MoveTo(p0); dc.LineTo(point); CView::OnLButtonUp(nFlags, point); }

(3)OnMouseMove

void CMy006View::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this);

}

dc.SelectObject(pen); if(f1==true) { dc.SetROP2(R2_XORPEN); //擦除 if(p0!=pm)//此判断主要解决第一个点被误擦除的问题 { dc.MoveTo(p0); dc.LineTo(pm); } //画橡皮线 dc.MoveTo(p0); dc.LineTo(point); pm=point;//将当前点转赋给pm, 为下一次擦除做准备 }

CView::OnMouseMove(nFlags, point);

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- fenyunshixun.cn 版权所有 湘ICP备2023022495号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务