第5章图形操作 内容摘要 1.CD和CDC类 2.GD和 CGdiobject类 3.绘图程序实例 4.绘图程序实例二
第5章 图形操作 内容摘要: 1. CD和CDC类 2. GDI和CGdiObject类 3. 绘图程序实例一 4. 绘图程序实例二 返回目录
5.1 51CD和CDC类 学习目标 1.了解设备环境( Device context,简称DC)和设 备环境类(CDC) 2.利用设备环境类进行简单绘图
5.1 CD和CDC类 学习目标 1.了解设备环境(Device Context,简称DC) 和设 备环境类(CDC) 2. 利用设备环境类进行简单绘图 5.1 返回第5章
5.1 使用设备环境类绘图的一个简单例子 1.利用 AppWizard生成基于对话框程序框架( Bmp Test) 2.添加画线和画椭圆的代码( OnPaint()函数)见下页 3.代码解释 (1) CPaintdc dc(this);这句代码是生成一个 CPaintDo类的实例dc,生成后 就可以调用他的函数来进行绘图了。 (2) dc. Move To(30,30);调用dc的 MoveTo函数把画线的起点定在对话框的 (30,30)坐标点。 Move To函数的一般调用格式为: Move To(intx,int y),其中参数x,y是要画直线的起始点坐标。 (3) dc Line To(30,30);调用dc的 Lineto函数画线到(100,100)坐标点。 Lineto函数的一般调用格式为: Lineto(ntx,inty),其中参数x,y是所 画直线的终止点坐标。 (4) dc Ellipse(120,120,160,160);本句代码的作用是调用设备环境对象dc 的画椭圆函数 Ellipse画椭圆。 Ellipse函数的一般调用格式为: Ellipse ( LPCRECTlpRect),其中参数 lpRect是所画椭圆的外接矩形
使用设备环境类绘图的一个简单例子 1. 利用AppWizard生成基于对话框程序框架(BmpTest ) 2. 添加画线和画椭圆的代码 (OnPaint()函数) 见下页 3. 代码解释: (1)CPaintDC dc(this);这句代码是生成一个CPaintDC类的实例dc,生成后 就可以调用他的函数来进行绘图了。 (2)dc.MoveTo(30,30);调用dc的MoveTo函数把画线的起点定在对话框的 (30,30)坐标点。MoveTo函数的一般调用格式为:MoveTo(int x,int y),其中参数x,y是要画直线的起始点坐标。 (3)dc.LineTo(30,30);调用dc的LineTo函数画线到(100,100)坐标点。 LineTo函数的一般调用格式为:LineTo(int x,int y),其中参数x,y是所 画直线的终止点坐标。 ( 4)dc.Ellipse(120,120,160,160);本句代码的作用是调用设备环境对象dc 的画椭圆函数Ellipse画椭圆。Ellipse函数的一般调用格式为: Ellipse (LPCRECT lpRect),其中参数 lpRect是所画椭圆的外接矩形 。 5.1
void CBmp TestDlg: OnPaint if (sIconico) CPaintDc dc(this): l/ devce context for painting SendMessage(WM ICoNERASEBKGND, (WPARAM)dc. GetSafeHdco, 0) 1/ Center icon in client rectangle int axIcon GetSystemMetrics(SM_CXICON) int cylon GetSystemMetrICs(SM CYICON): CRect rect int x=(rect Width(-CXlcon+1)/2 int y=(rect. Height0-cylcon 1)/2: ∥ Draw the icon dc. Drawlcon(x, y, m hIcon) CPaintDC dc(this); device context for painting dc. Move To(10, 10); dc Line To(100, 100) dc Ellipse(120,120,160,160); CDialog: OnPaint
5.1 void CBmpTestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND,(WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CPaintDC dc(this); // device context for painting dc.MoveTo(10,10); dc.LineTo(100,100); dc.Ellipse(120,120,160,160); CDialog::OnPaint(); } }
4.改变画图颜色 2.1 void CBmp TestDlg: OnPaint if ( lsIconicO) ∥与前一页代码相同; else CPaintDC dc(this); /device context for painting CPen newpen(PS SOLID, 1, RGB(0, 255, 0)) CBrush newbrush(RGB(0, 0, 255)) CPen *pOldpen=dc Selectobject(&newpen) CBrush *pOldbrush=dc Selectobject(&newbrush) dc MoveTo(10, 10) dc LineTo(100, 100) dc. B ipse(8080,120.12 dc Selectobject(poldpen); dc Selectobject(poldbrush) CDialog On Paint
2.1 void CBmpTestDlg::OnPaint() { if (IsIconic()) { //与前一页代码相同; else { CPaintDC dc(this); // device context for painting CPen newpen(PS_SOLID,1,RGB(0,255,0)); CBrush newbrush(RGB(0,0,255)); CPen *pOldpen=dc.SelectObject(&newpen); CBrush *pOldbrush=dc.SelectObject(&newbrush); dc.MoveTo(10,10); dc.LineTo(100,100); dc.Ellipse(80,80,120,120); dc.SelectObject(pOldpen); dc.SelectObject(pOldbrush); CDialog::OnPaint(); } } 4.改变画图颜色
5.1 代码解释: 1. CPen newmen( PS SOLID,1,RGB(0,2550));生成一支颜色为绿色、宽度为1个像 素的实心画笔。 2 CBrush newbrush(RGB(0,0,255));生成一只颜色为蓝色的画刷。 3CPen* pOldpen= dc Selectobject(& newmen);把刚生成的画笔选进设备环境对象dc, 这样再画线就用新的笔了。当 Selectobject函数的参数为画笔类型时,返回值为原来所 用画笔的指针, 4 CBrush* pOldbrush=dc. Selectobject(& Rnewbrush);把刚生成的画刷选进设备环境对 象dc。当 Selectobject函数的参数为画刷类型时,返回值为原来所用画刷的指针 5dc. Selectobject( pOldpen);绘图完毕后把原来的画笔再选进设备环境对象。 6dc. Selectobject( pOldbrush);绘图完毕后把原来的画刷再选进设备环境对象 Cpen类的构造函数声明是: CPen(int nPenStyle, int n Width, COLORREF crColor) 参数 oPen Style指明画笔的风格。 n width指明以象素为单位的画笔宽度。 crColor包含了 画笔的RGB值 n Pen Style的取值有以下几种: PS SOLD:创建一支实线画笔 PS DASH:创建一支虚线画笔 PS DOT:创建一支点线画笔 PS DASHDOT:创建一支虚线和点交替的画笔 PS DASHDOTDOT:创建一支虚线和两点交替的画笔
5.1 代码解释: 1.CPen newpen(PS_SOLID,1,RGB(0,255,0));生成一支颜色为绿色、宽度为1个像 素的实心画笔。 2.CBrush newbrush(RGB(0,0,255));生成一只颜色为蓝色的画刷。 3.CPen *pOldpen=dc.SelectObject(&newpen);把刚生成的画笔选进设备环境对象dc, 这样再画线就用新的笔了。当SelectObject函数的参数为画笔类型时,返回值为原来所 用画笔的指针。 4.CBrush *pOldbrush=dc.SelectObject(&newbrush);把刚生成的画刷选进设备环境对 象dc。当SelectObject函数的参数为画刷类型时,返回值为原来所用画刷的指针。 5.dc.SelectObject(pOldpen);绘图完毕后把原来的画笔再选进设备环境对象。 6.dc.SelectObject(pOldbrush);绘图完毕后把原来的画刷再选进设备环境对象。 Cpen类的构造函数声明是: CPen(int nPenStyle,int nWidth,COLORREF crColor); 参数nPenStyle指明画笔的风格。nWidth指明以象素为单位的画笔宽度。crColor包含了 画笔的RGB值。 nPenStyle的取值有以下几种: PS_SOLD: 创建一支实线画笔。 PS_DASH : 创建一支虚线画笔。 PS_DOT : 创建一支点线画笔。 PS_DASHDOT: 创建一支虚线和点交替的画笔。 PS_DASHDOTDOT: 创建一支虚线和两点交替的画笔
5.2 52GD和 CGdiobject类 学习目标 1.了解图形设备接口 2.了解类 CGdiobject极其派生类
5.2 GDI和CGdiObject类 学习目标 1.了解图形设备接口 2. 了解类CGdiObject极其派生类 5.2 返回第5章
5.2 绘图程序实例 1.用应用向导产生单文档程序框架( Bmp Test) 2.修改、添加瓷源 1.添加菜单 1. ID GRAPH TRACK 轨迹 2. ID GRAPH MOVE 移动 2.添加位图 IDB BITI 2. IDB BIT2 3.添加数据类型及变量
绘图程序实例一 1. 用应用向导产生单文档程序框架(BmpTest ) 2. 修改、添加资源 1. 添加菜单 1. ID_GRAPH_TRACK 轨迹 2. ID_GRAPH_MOVE 移动 2. 添加位图 1. IDB_BIT1 2. IDB_BIT2 3. 添加数据类型及变量 5.2
class CMoveTestView: public Cview 5.2 protected: /create from serialization only CMoveTestviewO DECLARE_ DYNC REATE(CMoveTestview) private CString flag: BOoL drawtrack struct pointstruct( CPoint point; struct pointstruct "next } struct pointstruct *pointlisthead, * pointlisttrail flag:判断选择的是“轨道”菜单项还是“车轮”菜单项按钮: drawtrack:当用户选择轨道菜单项时,判断是否画轨道; struct pointstruct:用来记录轨道中各个点的结构体 pointlisthead:用户所绘制轨道的点链表的头结点 pointlisttrail:用户所绘制轨道的点链表的尾结点
class CMoveTestView : public CView { protected:// create from serialization only CMoveTestView(); DECLARE_DYNCREATE(CMoveTestView) private: CString flag; BOOL drawtrack; structpointstruct{ CPointpoint; structpointstruct*next; }; structpointstruct*pointlisthead,*pointlisttrail; …… } 5.2 flag:判断选择的是“轨道”菜单项还是“车轮”菜单项按钮; drawtrack:当用户选择轨道菜单项时,判断是否画轨道; struct pointstruct:用来记录轨道中各个点的结构体; pointlisthead:用户所绘制轨道的点链表的头结点; pointlisttrail:用户所绘制轨道的点链表的尾结点
4.添加函数 5.2 1.添加菜单响应函数 void CMove TestView:: On GraphMoveo flag="move MoveObjecto void CMove Testview:: On Graph Track flag="track 代码解释: 2当选择菜单“移动”时,把贴值为么a2 1.当选择菜单“轨迹”时,把fag赋值为“ move i 3. Moveobject();调用此函数可产生沿着画好轨道运动的 车轮。该函数将在后面给出
4. 添加函数 1.添加菜单响应函数 5.2 void CMoveTestView::OnGraphMove() { flag="move"; MoveObject(); } void CMoveTestView::OnGraphTrack() { flag="track"; } 代码解释: 1.当选择菜单“轨迹”时,把flag赋值为“track”; 2.当选择菜单“移动”时,把flag赋值为“move”; 3.MoveObject();调用此函数可产生沿着画好轨道运动的 车轮。该函数将在后面给出