第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);