C++MFC编程笔记day06 MFC向导、MFC绘图类使用

MFC绘图

MFC绘图类包括绘图设备类和绘图对象类

1 绘图设备类

CDC类-父类是CObject,封装的是一般的绘图设备,例如:显示器,

打印机等。

CWindowDC类-父类是CDC类,封装的是窗口对象,包括客户区和非

客户区。

CClientDC类-父类是CDC类,封装的仍然是窗口,但是只包括客户区。

CPaintDC类-父类是CDC类,封装的是窗口的客户区。但是,它只用

在窗口的WM_PAINT消息处理函数中。

CMetaFileDC类-父类是CDC类,作用保存绘制命令。

2 使用

创建MFC AppWizard(exe)工程,添加菜单项,然后使用类向导生成消息命令的函数体框架。

2.1 CDC::CreateDC()-创建绘图设备

virtual BOOL CreateDC(

LPCTSTR lpszDriverName,//设备的驱动名称

LPCTSTR lpszDeviceName,//设备名称

LPCTSTR lpszOutput,//接口

const void* lpInitData//设备的初始化参数

);

设备为显示器时,("DISPLAY",NULL,NULL,NULL);

2.2 使用

....

2.3 CDC::DeleteDC()-删除设备

2.4 CDC的子类CWindowDC、CClientDC、CPaintDC,在构造函数中

调用CreateDC(),在析构函数中调用DeleteDC(),所以,子类使用

只需要构造对象即可。

2.5 CMetaFileDC类的使用

2.5.1 创建

CMetaFileDC::Create

2.5.2 绘制

....

2.5.3 关闭,返回句柄 HMETAFILE

CMetaFileDC::Close

2.5.4 使用

CDC::PlayMetaFile

2.5.5 删除

DeleteMetaFile

3 绘图对象类

3.1 CPen-画笔

3.2 CBrush-画刷

3.3 CFont-字体

3.4 CBitmap-位图

3.5 CRgn-区域

3.6 CPalette-调色板

RGB(0~255,0~255,0~255),每个颜色值占3个字节。

彩色位图,800*600像素,位图大小是:800*600*3 字节

颜色表大小 48*3 +800*600*1

3.7 使用

3.7.1 CPen、CBrush、CFont的使用

3.7.2 CBitmap的使用

3.7.3 CRgn的使用

1 创建

CRgn::CreateXXX

2 将两个CRgn对象进行几何运算

CRgn::CombineRgn

3 填充

CDC::FillRgn

4 填充边框

CDC::FrameRgn

程序示例:

在****view类中,定义一个成员变量:

HMETAFILE m_hMetafile;

//功能实现部分主要代码

void CMFCdrawView::OnDcCwindowdc()
{
	// TODO: Add your command handler code here
	CWindowDC dc(AfxGetMainWnd());
	dc.TextOut(0,0,"Hello CWindowDC");

}

void CMFCdrawView::OnDcCmetafiledc()
{
	// TODO: Add your command handler code here
	//创建
	CMetaFileDC dc;
	dc.Create();
	//绘制命令
	dc.TextOut(100,100,"DcCmetafile");
	dc.MoveTo(150,150);
	dc.LineTo(200,200);
	//关闭,并返回句柄
	m_hMetafile= dc.Close();
	CClientDC dc2(this);
	dc2.PlayMetaFile(m_hMetafile);
}

void CMFCdrawView::OnDcCclientdc()
{
	// TODO: Add your command handler code here
	CClientDC dc(this);
	dc.TextOut(0,0,"Hello CClientDC");
}

void CMFCdrawView::OnDcCdc()
{
	// TODO: Add your command handler code here
	CDC dc;
	dc.CreateDC("DISPLAY",NULL,NULL,NULL);//打印到屏幕上
	RECT rc={0};
	rc.left=0;rc.right=200;rc.top=0;rc.bottom=100;
	dc.DrawText("hello cdc",&rc,DT_MODIFYSTRING);
	dc.DeleteDC();
}

void CMFCdrawView::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	dc.TextOut(0,20,"Hell0 Paint");
	//使用CMetaFile
	if(m_hMetafile)	dc.PlayMetaFile(m_hMetafile);
	//OnGdiBitmap();
	// Do not call CView::OnPaint() for painting messages
}

void CMFCdrawView::OnGdiBitmap()
{
	// TODO: Add your command handler code here
	CClientDC dc(this);
	CDC dcBitmap;//内存dc
	dcBitmap.CreateCompatibleDC(&dc);
	CBitmap bmp;//位图对象
	bmp.LoadBitmap(IDB_BITMAP1);//插入的图片资源
	CBitmap*oldbmp=dcBitmap.SelectObject(&bmp);//放入内存dc
	//dc.BitBlt(300,300,110,37,&dcBitmap,0,0,SRCCOPY);//成像
	RECT rc={0};
	GetClientRect(&rc);
	//拉伸成像
	dc.StretchBlt(0,0,rc.right,rc.bottom,&dcBitmap,0,0,101,37,SRCCOPY);
	dcBitmap.SelectObject(oldbmp);
	dcBitmap.DeleteDC();//删除内存dc
	bmp.DeleteObject();//删除位图对象

}

void CMFCdrawView::OnGdiBrush()
{
	// TODO: Add your command handler code here
	//CBrush brush(HS_CROSS,RGB(0,255,0));//普通画刷
	CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2);
	CBrush brush(&bmp);//位图画刷
	CClientDC dc(this);
	CBrush*oldbrush=dc.SelectObject(&brush);
	dc.RoundRect(50,50,220,220,2,2);
	dc.SelectObject(oldbrush);
	brush.DeleteObject();

}

void CMFCdrawView::OnGdiFont()
{
	// TODO: Add your command handler code here
	CFont font;
	font.CreatePointFont(500,"黑体");
	CClientDC dc(this);
	CFont*oldfont=dc.SelectObject(&font);
	dc.TextOut(150,150,"OnGdiFont");
	dc.SelectObject(oldfont);
	font.DeleteObject();
}

void CMFCdrawView::OnGdiPen()
{
	// 创建画笔
	CPen pen(PS_SOLID,5,RGB(255,0,0));
	//将画笔选择当前设备
	CClientDC dc(this);
	CPen * oldpen=dc.SelectObject(&pen);
	dc.TextOut(10,10,"OnGdiPen");
	dc.RoundRect(100,100,200,200,2,2);
	dc.SelectObject(oldpen);
	pen.DeleteObject();

}

void CMFCdrawView::OnGdiRgn()
{
	CRgn rgn1,rgn2;
	//创建
	rgn1.CreateEllipticRgn(100,100,300,300);
	rgn2.CreateEllipticRgn(150,100,350,300);
    //几何运算
	rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR);
	//填充
	CClientDC dc(this);
	CBrush brush(RGB(255,0,0));
	CBrush brush2(RGB(0,0,255));
	dc.FillRgn(&rgn1,&brush);
	//dc.FillRgn(&rgn2,&brush2);
	//填充边框
	dc.FrameRgn(&rgn1,&brush2,5,1);
	//将窗口的区域设置成rgn1
	AfxGetMainWnd()->SetWindowRgn(rgn1,TRUE);
}

效果:

2、模拟绘图软件,鼠标点下进行绘图,放开则绘制指定的图形。

新建立 MFC 应用程序,并按照如下操作:

在****view 中,加入成员变量:

CPoint m_ptBegin;//起点坐标

CPoint m_ptEnd;//终点坐标

UINT m_nType;//类型:1-直线,2-距形,3-圆

BOOL m_bFlag;//是否开始画线

****view中主要实现代码:

//构造函数
CMFCdraw2View::CMFCdraw2View()
{
	// TODO: add construction code here
	m_nType=0;
	m_bFlag=FALSE;
	m_ptBegin=m_ptEnd=0;
}

void CMFCdraw2View::OnDrawElipse()
{
	// TODO: Add your command handler code here
	m_nType=3;
}

void CMFCdraw2View::OnDrawLine()
{
	// TODO: Add your command handler code here
	m_nType=1;
}

void CMFCdraw2View::OnDrawRect()
{
	// TODO: Add your command handler code here
	m_nType=2;
}

void CMFCdraw2View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	m_bFlag=TRUE;//开始绘图
    m_ptBegin=m_ptEnd=point; //确定起点位置
	CView::OnLButtonDown(nFlags,point);
}

void CMFCdraw2View::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	m_bFlag=FALSE;//结束画线
	CView::OnLButtonUp(nFlags, point);
}

void CMFCdraw2View::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);
	if(m_bFlag)
	{
		//擦线
		DrawShape(&dc,m_ptBegin,m_ptEnd);
		//画线
		DrawShape(&dc,m_ptBegin,point);
		//保存终点位置,为擦线准备
		m_ptEnd=point;
    }
	CView::OnMouseMove(nFlags, point);
}
void CMFCdraw2View::DrawShape(CDC *pDC, CPoint p1, CPoint p2)
{
	//设置绘图模式,R2_NOT与当前画线处颜色相反
	pDC->SetROP2(R2_NOT);
	//设置画刷为透明画刷
	CBrush *pOldBrush=
		(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
	switch (m_nType)
	{
	case 1://直线
		pDC->MoveTo(p1);
		pDC->LineTo(p2);
		break;
	case 2://矩形
		pDC->Rectangle(p1.x,p1.y,p2.x,p2.y);
		break;
	case 3://椭圆
		pDC->Ellipse(p1.x,p1.y,p2.x,p2.y);
		break;
	}
	//恢复默认画刷
	pDC->SelectObject(pOldBrush);

}

void CMFCdraw2View::OnUpdateDrawElipse(CCmdUI* pCmdUI)
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(m_nType==3);//更改选中的状态
}

void CMFCdraw2View::OnUpdateDrawLine(CCmdUI* pCmdUI)
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(m_nType==1);
}

void CMFCdraw2View::OnUpdateDrawRect(CCmdUI* pCmdUI)
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(m_nType==2);
}

效果:

C++MFC编程笔记day06 MFC向导、MFC绘图类使用

时间: 2024-10-16 16:30:43

C++MFC编程笔记day06 MFC向导、MFC绘图类使用的相关文章

C++MFC编程笔记day07 MFC单文档绘图保存、多文档绘图保存

完善绘图例子(day06中的),加上保存功能 1 设计和编写图形类 CShape 1.1 成员变量 CPoint m_ptBegin; CPoint m_ptEnd; UINT m_nType; 1.2 支持序列化 1.2.1 继承自CObject 1.2.2 添加序列化的声明宏和实现宏 1.2.3 重写虚函数Serilize(),在函数中,完成成员变量的序列化 2 由于保存多个图形,引入MFC的集合类CObArray,保存的是CObject 对象的地址. 3 图形数据需要保存到文档类中,在该类

C++MFC编程笔记day10 MF界面控件的使用2、属性页对话框、MFC线程

一 树型控件 1 相关类 CTreeCtrl-父类是CWnd,控件类. CTreeView-父类是CCtrlView,视图类.CTreeView=CView+CTreeCtrl CTreeView::GetTreeCtrl 2 CTreeCtrl的使用 对比CListCtrl:列表控件的每个数据项之间是平等关系,通过数据项 的索引值得到数据项的信息.树控件每个数据项称之为节点.节点之间 的关系包括父子关系和兄弟关系.通常通过节点句柄得到某个节点. 通常用来表示层次关系的数据. 2.1 设置控件的

C++MFC编程笔记day08 MFC对话框的使用

一 MFC对话框 1 分类 模式和非模式 2 相关类 CDialog类-父类是CWnd,本质上是一个窗口,对话框类的父类. CCommonDialog类以及子类-通用对话框,颜色对话框.文件对话框. 查找替换对话框.字体设置对话框.打印设置对话框和 打印对话框. CPropertyPage类-属性页对话框. 3 在Win32向导中,使用MFC的类创建对话框程序 3.1 模式对话框 3.1.1 创建和显示对话框 CDialog::DoModal() 3.1.2 对话框的关闭(无需用户处理) CDi

C++MFC编程笔记day09 MF界面控件的使用1

一 MFC控件 1 控件介绍 1.1 静态控件包括图片.静态文本和分组框.生成的控件的ID统一是 IDC_STATIC.很少程序中访问和操作,只是使用静态控件显示信息 1.2 编辑框控件,控件类是CEdit,通常使用它接收用户的输入,显示 信息给用户. 1.3 按钮控件包括一般按钮.复选按钮和单元按钮,控件类都是CButton 单选按钮注意,同一组的按钮Tab键顺序的编号连续(Ctrl+d  显示tab顺序),而且编号小的 按钮设置group属性,才能在同一个对话框中,实现多个单选按钮的 多个分

C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理

一.MFC概念和作用 1.全称Microsoft Foundation Class Library,我们称为微软基础类库,封闭了绝大部分的win32 Api函数,C++语法中的数据结构,程序的执行流程 MFC就是一个库(动态库,静态库) MFC还是一个程序框架 2.为什么使用MFC 基于框架编程,提高工作效率,减少开发周期,节约开发成本. 二.几个重要的头文件 afx.h    -绝大部分类的声明头文件 afxwin.h -包含了afx.h和windows.h afxext.h -提供了扩展窗口

C++MFC编程笔记day04 运行时类信息和窗口的动态、静态切分

运行时类信息 程序在运行时,获取对象类的信息及类的继承关系 实现: 1.定义类继承自CObject类. 2.类内声明宏DECLARE_DYNAMIC(),类外实现宏IMPLEMENT_DYNAMIC() 3.使用: BOOL IsKindOf(CRuntimeClass* pClass)//对象是否属于某个类 CRuntimeClass* GetRuntimeClass( );//获取对象运行时类信息,经常使用RUNTIME_CLASS(类名)代替. 示例: #include "stdafx.h

C++MFC编程笔记day05 文档类-单文档和多文档应用程序

文档类 1 相关类 CDocument类-父类是CCmdTarget类,所以,文档类也可以处理菜单等 命令消息.作用保存和管理数据. 注意事项:如何解决断言错误 2 在视图中显示文档中的数据 2.1 CView::OnInitialUpdate 作用初始化视图,在附加文档之后,显示之前,由框架调用. 2.2 CView::GetDocument 获取与视图相关的文档 2.3 CFrameWnd::InitialUpdateFrame 作用,初始化更新框架,可以引起CView::OnInitial

C++MFC编程笔记day03 MFC工具栏、状态栏、视图窗口

MFC工具栏 相关类: CToolBarCtrl - 父类是 CWnd  封装了工具栏控件相关操作 CToolBar - 父类是CControlBar  封装了工具栏和框架窗口之间的关系 工具栏使用: //把工具栏对象定义为 CMyFrameWnd成员: CToolBar toolbar; //在窗口创建时,加载工具栏资源 int CMyFrameWnd::OnCreate(LPCREATESTRUCT lpc) { toolbar.CreateEx(this,TBSTYLE_FLAT,WS_C

C++MFC编程笔记day02 MFC消息映射机制、菜单资源使用

机制3:MFC消息映射机制: 类内声明,类外定义宏,绑定消息处理函数 派生自CCmdTarget 类内声明宏:DECLARE_MESSAGE_MAP() 类外添加实现宏: BEGIN_MESSAGE_MAP(类名,父类名) END_MESSAGE_MAP() //数据结构 struct AFX_MSGMAP_ENTRY { UINT nMessage;   // 消息ID UINT nCode;      // 通知码 UINT nID;        // 控件ID或消息 UINT nLast