版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章GDI与Windows绘图设备环境类绘图工具绘图函数位图与位操作图标与光标1设备文本的概念设备文本用于程序的可视化输出设备文本提供一张画布,可在上面书写文字,或绘制点、直线、曲线等图形既可通过屏幕显示,还可通过打印机等设备输出应用程序GDI设备驱动程序输出设备2设备环境类(1)CDC:MFC的设备文本基类CClientDC:客户区(不包括边框、标题栏和菜单栏)的设备文本类CWindowDC:程序窗口的设备文本类CPaintDC:OnPaint函数使用的设备文本类CMetaFileDC:图元文件的设备文本类3设备环境类(3)画线程序的例子(CClientDC)voidCTestView::OnLButtonUp(UINTnFlags,CPointpoint){CClientDCdc(this);//CClientDCdc(GetParent());dc.MoveTo(start);dc.LineTo(point);}5设备环境类(4)画线程序的例子(CWindowDC)voidCTestView::OnLButtonUp(UINTnFlags,CPointpoint){CWindowDCdc(this);//CWindowDCdc(GetParent());//CWindowDCdc(GetDesktopWindow());dc.MoveTo(start);dc.LineTo(point);}6设备环境类(5)7CPoint、CSize与CRect(1)CPoint:封装POINT结构的类定义一个点坐标,成员为x、yCRect:封装RECT结构的类定义一个矩形区域,成员为left、right、top、bottomCSize:封装SIZE结构的类定义矩形区域的大小,成员为cx、cy9CPoint、CSize与CRect(2)CPoint类的例子POINTp;p.x=10;p.y=10;pDC->TextOut(p.x,p.y,"POINT为一个结构,成员只有x,y");CPointq,q1(10,10),q2(0,90);q=q1+q2;pDC->TextOut(q.x,q.y,"CPoint为一个类,封装POINT结构,成员有x,y等");10绘图工具(1)设备文本类(CDC)提供绘图工具,例如CPen、CBrush与CFont等,基类是CGdiObject默认的画笔是黑色,宽度是一个像素,默认的画刷是白色颜色由RGB值来指定RGB(Red,Green,Blue)0x00
FF
FF
FFBGR11绘图工具(3)SelectStockObject的例子pDC->SelectStockObject(BLACK_PEN);pDC->MoveTo(10,100);pDC->LineTo(550,100);pDC->SelectStockObject(LTGRAY_BRUSH);pDC->Ellipse(50,50,150,150);pDC->SelectStockObject(DKGRAY_BRUSH);pDC->Ellipse(200,50,350,150);pDC->SelectStockObject(NULL_BRUSH);pDC->Rectangle(400,50,500,150);13自定义画笔(1)单步构造方法两步构造方法画笔风格是实线,宽度是5,颜色是蓝色CPenNewPen(PS_SOLID,5,RGB(0,0,255));CPenNewPen;NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255));14自定义画笔(2)画笔类型说明PS_SOLID实线画笔PS_DASH划线(虚线)画笔PS_DASHDOT点划线画笔PS_DASHDOTDOT双点划线画笔PS_DOT点线画笔PS_NULL空画笔库存画笔的类型(除实线外,宽度为1)15自定义画笔(4)17自定义画刷(1)实心(solid)风格CreateSolidBrush(COLORREFcrColor);网格(hatched)风格CreateHatchBrush(intnIndex,COLORREFcrColor);模式(patterned)风格CreatePatternBrush(CBitmap*pBitmap);18自定义画刷(2)网格样式说明HS_CROSS十字线填充HS_HORIZONAL水平线填充HS_VERTICAL垂直线填充HS_FDIAGONAL斜线填充HS_BDIAGONAL反斜线填充HS_DIAGCROSS斜十字线填充19自定义画刷(4)21绘图函数(1)绘图函数的坐标是逻辑单位。默认的左上角坐标为(0,0),逻辑单位为像素绘图函数设置像素(SetPixel)、当前位置(Moveto)、画直线(Lineto)、画弧线(Arc)、画矩形(Rectangle)、画椭圆(Ellipse)、画饼图(Pie)、画多边型(Polygon)22绘图函数(2)圆角矩形弧线pDC->Rectangle(100,100,300,200);pDC->MoveTo(200,150);pDC->LineTo(300,175);pDC->MoveTo(200,150);pDC->LineTo(125,100);pDC->Arc(100,100,300,200,300,175,125,100);pDC->Rectangle(100,100,300,200);pDC->RoundRect(100,100,300,200,50,40);23绘图函数(4)用点线画矩形边框(DrawFocusRect)用画刷填充矩形,不画边框(FillRect)pDC->DrawFocusRect(CRect(100,100,200,200));CBrushNewBrush;NewBrush.CreateSolidBrush(RGB(0,0,255));pDC->SelectObject(&NewBrush);pDC->FillRect(CRect(100,100,200,200),&NewBrush);25绘图函数(5)用画刷画矩形边框,不填充内部(FrameRect)CBrushNewBrush;CBrush*pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255));pOldBrush=pDC->SelectObject(&NewBrush);pDC->FrameRect(CRect(100,100,200,200),&NewBrush);pDC->SelectObject(pOldBrush);26绘图模式(2)R2_NOT的例子蓝色(0x00FF0000)反色为黄色(0x0000FFFF)白色(0x00FFFFFF)反色为黑色(0x00000000)在CTestView::OnDraw()中CBrushNewBrush;CBrush*pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255));pOldBrush=pDC->SelectObject(&NewBrush);pDC->Rectangle(100,100,300,200);pDC->SelectObject(pOldBrush);29绘图模式(3)在CTestView::OnLButtonDown()中CDC*pDC=GetDC();CPenNewPen;CPen*pOldPen;NewPen.CreatePen(PS_SOLID,3,RGB(0,0,255));pOldPen=pDC->SelectObject(&NewPen);pDC->SetROP2(R2_NOT);pDC->MoveTo(50,150);pDC->LineTo(350,150);pDC->SelectObject(pOldPen);
ReleaseDC(pDC);30绘图模式(4)31绘图模式(5)R2_XORPEN的例子0x00FF0000^0x00FF0000=0x000000000x00FFFFFF^0x00FF0000=0x0000FFFF在CTestView::OnDraw()中CBrushNewBrush;CBrush*pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255));pOldBrush=pDC->SelectObject(&NewBrush);pDC->Rectangle(100,100,300,200);pDC->SelectObject(pOldBrush);32绘图模式(6)在CTestView::OnLButtonDown()中CDC*pDC=GetDC();CPenNewPen;CPen*pOldPen;NewPen.CreatePen(PS_SOLID,3,RGB(0,0,255));pOldPen=pDC->SelectObject(&NewPen);pDC->SetROP2(R2_XORPEN);pDC->MoveTo(50,150);pDC->LineTo(350,150);pDC->SelectObject(pOldPen);
ReleaseDC(pDC);33绘图模式(7)34CRgn与区域(1)设置区域保证绘图时不超过给定范围MFC的CRgn封装区域,其成员函数有:CreateRectRgn、CreateEllipseRgn、CreatePolygonRgn等CombineRgn用于将新的区域合并CDC的FillClipRgn或PaintRgnyong填充区域,SelectClipRgn设置剪裁区域,SelectObject将区域选入设备文本35CRgn与区域(2)在CTestView::OnDraw()中pDC->DrawFocusRect(CRect(10,10,200,200));CRgnrgn;rgn.CreateRectRgn(10,10,200,200);pDC->SelectObject(rgn);pDC->MoveTo(0,50);pDC->LineTo(300,50);pDC->MoveTo(50,0);pDC->LineTo(50,300);36CRgn与区域(3)37映射模式(1)在视图窗口绘制图形时,给定的坐标为逻辑坐标,视图对象的实际坐标为设备坐标绘图函数的坐标是逻辑坐标,鼠标消息处理函数的坐标是设备坐标映射模式定义逻辑坐标与设备坐标单位的关系约束映射模式:比例因子固定非约束映射模式:由矩形区域推导出比例因子及轴向38映射模式(2)CDC的SetMapMode用于设置映射模式LPtoDP:逻辑坐标转为设备坐标DPtoLP:设备坐标转为逻辑坐标MM_TEXT:默认映射模式,每个单位映射为一个像素,X轴向右、Y轴向下MM_HIENGLISH:每个单位映射成0.001英寸,X轴向右、Y轴向上39映射模式(3)MM_TEXT与MM_HIENGLISH的区别pDC->SetMapMode(MM_TEXT);CRectrect;GetClientRect(&rect);intx=rect.right/2;inty=rect.bottom/2;pDC->SetViewportOrg(x,y);pDC->MoveTo(-20,0);pDC->LineTo(100,0);pDC->MoveTo(0,-20);pDC->LineTo(0,100);CPointpt(100,100);intr=50;pDC->Ellipse(pt.x-r,pt.y-r,pt.x+r,pt.y+r);40文本处理(1)文本输出函数TextOut:在指定位置输出文本DrawText:在指定矩形区域输出文本ExtTextOut:在指定位置输出文本,并使用当前选择字体TabbedTextOut:在指定位置输出文本,并使用指定的字符间距41文本处理(2)文本属性设置函数SetBkMode:设置背景模式SetBkColor:设置背景颜色SetTextColor:设置文本颜色SetTextAlign:设置文本对齐方式SetTextCharacterExtra:设置字符间隔值42文本处理(3)文本属性设置的例子pDC->SetBkMode(OPAQUE);pDC->SetBkColor(RGB(0,255,255));pDC->SetTextColor(RGB(0,0,255));pDC->SetTextAlign(TA_CENTER|TA_BOTTOM);pDC->SetTextCharacterExtra(10);pDC->TextOut(100,50,"设置文本属性");pDC->MoveTo(0,50);pDC->LineTo(200,50);pDC->MoveTo(100,0);pDC->LineTo(100,100);43文本处理(4)44字符属性(1)字符属性包括:字符大小、行距typedefstructtagTEXTMETRIC{LONGtmHeight;//字符高度LONGtmAscent;//字符上升高度LONGtmDescent;//字符下降高度LONGtmExternalLeading;//行间距……}TEXTMETRIC;45字符属性(2)tmAscent与tmDescent的含义46字符属性(3)字符属性的例子TEXTMETRICtm;pDC->GetTextMetrics(&tm);CStringstr;str.Format("字符高度(tmHeight)=%d,行间距(tmExternalLeading)=%d",tm.tmHeight,tm.tmExternalLeading);pDC->TextOut(50,50,str);47字符属性(4)CStringstr;CSizesz;sz=pDC->GetTextExtent("字");str.Format("字的宽度=%d,高度=%d",sz.cx,sz.cy);pDC->TextOut(50,50,str);sz=pDC->GetTextExtent("a");str.Format("a的宽度=%d,高度=%d",sz.cx,sz.cy);pDC->TextOut(50,100,str);sz=pDC->GetTextExtent("m");str.Format("m的宽度=%d,高度=%d",sz.cx,sz.cy);pDC->TextOut(50,150,str);sz=pDC->GetTextExtent("i");str.Format("i的宽度=%d,高度=%d",sz.cx,sz.cy);pDC->TextOut(50,200,str);48字体操作(1)库存字体的类型字体类型说明SYSTEM_FONT系统字体SYSTEM_FIXED_FONT固定宽度系统字体ANSI_FIXED_FONTANSI固定宽度系统字体ANSI_VAR_FONTANSI可变宽度系统字体DEVICE_DEFAULT_FONT设备相关缺省字体OEM_FIXED_FONTOEM相关固定宽度字体49字体操作(2)库存字体的例子pDC->TextOut(50,50,"DEFAULT字体");pDC->SelectStockObject(ANSI_FIXED_FONT);pDC->TextOut(50,100,"ANSI_FIXED_FONT字体");pDC->SelectStockObject(SYSTEM_FONT);pDC->TextOut(50,150,"SYSTEM_FONT字体");50字体操作(3)两步构造方法在LOGFONT结构中定义逻辑字体调用CreateFontIndirect()函数单步构造方法直接调用CreateFont()函数51字体操作(4)LOGFONTlf;lf.lfHeight=30;//高度为30lf.lfWidth=0;//默认宽度lf.lfEscapement=150;//逆时针旋转15度lf.lfWeight=FW_BOLD;//粗体lf.lfUnderline=false;//无下划线lf.lfItalic=false;//非斜体lf.lfStrikeOut=false;//无删除线lf.lfCharSet=GB2312_CHARSET;//GB2312字符集CFontNewFont,*pOldFont;NewFont.CreateFontIndirect(&lf);pOldFont=pDC->SelectObject(&NewFont);pDC->TextOut(100,100,"例子Example");pDC->SelectObject(pOldFont);52位图操作(1)BMP是与硬件无关的图像格式,采用位映射存储方式,除图像深度可选外,不使用其它压缩图像深度包括:1位(单色)、4位(16色)、8位(256色)、24位(16M色)BMP文件结构文件头:文件类型、大小、起始位置等信息头:图像大小、压缩方法等颜色表与位图数据:在24位BMP中,每个像素由BGR表示53位图操作(2)位图用位模式形成图像,MFC提供CBitmap类管理位图,LoadBitmap()从资源装载位图CDC提供传输图形数据的函数PatBlt():用选定画刷填充一个矩形BitBlt():将图像数据输出到指定位置StetchBlt():与BitBlt()类似,可改变图像数据大小54位图操作(3)画刷参数的类型画刷参数说明WHITENESS区域为白色BLACKNESS区域为黑色PATCOPY画刷复制到填充区域PATINVERT画刷异或到填充区域DSTINVERT填充区域被反相55位图操作(4)PatBlt的例子CBitmapbm;bm.LoadBitmap(IDB_MYBITMAP);CBrushNewBrush,*pOldBrush; NewBrush.CreatePatternBrush(&bm);pOldBrush=pDC->SelectObject(&NewBrush);RECTrect;GetClientRect(&rect);pDC->PatBlt(0,0,rect.right,rect.bottom,PATCOPY);pDC->SelectObject(pOldBrush);bm.DeleteObject();56位图操作(5)57位图操作(6)BitBlt的例子CBitmapbm;bm.LoadBitmap(IDB_MYBITMAP);CDCMemDC;MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(&bm);BITMAPtmp;bm.GetBitmap(&tmp);pDC->BitBlt(0,0,tmp.bmWidth,tmp.bmHeight,&MemDC,0,0,SRCCOPY);bm.DeleteObject();58位图操作(7)StretchBlt的例子CBitmapbm;bm.LoadBitmap(IDB_MYBITMAP);CDCMemDC;MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(&bm);BITMAPtmp;bm.GetBitmap(&tmp);pDC->StretchBlt(0,0,tmp.bmWidth/2,tmp.bmHeight/2,&MemDC,0,0,tmp.bmWidth,tmp.bmHeight,SRCCOPY);bm.DeleteObject();59位图操作(7)60图标操作(1)图标(Icon)是一种特殊的位图,其与位图的区别是固定大小CWinApp提供LoadStandardIcon(),用于加载系统预定义的图标CWinApp提供LoadIcon(),用于加载图形编辑器创建的图标61图标操作(2)系统预定义的图标预定义图标宏说明IDI_APPLICATION默认图标IDI_ASTERISK信息图标IDI_EXCLAMATION惊叹号图标IDI_HAND严重警告图标IDI_QUESTION问号图标62图标操作(3)显示图标的例子HICONhIcon;hIcon=AfxGetApp()->LoadStandardIcon(IDI_QUESTION);//hIcon=AfxGetApp()->LoadIcon(IDI_MYICON);CRectrect;GetClientRect(&rect);pDC->DrawIcon((rect.right-GetSystemMetrics(SM_CXICON))/2,(rect.bottom-GetSystemMetrics(SM_CYICON))/2,hIcon);63图标操作(4)64光标操作(1)光标(Cursor)用于显示鼠标操作时,鼠标所在位置与显示形状CWinApp提供LoadStandardCursor(),用于加载系统预定义的光标CWinApp提供LoadCursor(),用于加载图形编辑器创建的光标SetCursor用于设置光标形状65光标操作(2)系统预定义的光标光标类型说明光标类型说明IDC_ARROW箭头IDC_UPARROW垂直箭头IDC_CROSS十字光标IDC_SIZEALL四向箭头IDC_WAIT沙漏光标IDC_SIZENWSE左上右下角双箭头IDC_IBEAM输入光标IDC_SIZENESW右上左下角双箭头IDC_SIZE装入方框IDC_SIZEWE水平双箭头IDC_ICON空肖像IDC_SIZENS垂直双箭头66光标操作(3)在CTestView::OnLButtonDown()中SetCapture();HCURSORhCursor;hCursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//hCursor=AfxGetApp()->LoadCursor(IDC_MYCURSOR);SetCursor(hCursor);RECTrect;GetClientRect(&rect);ClientToScreen(&rect);ClipCursor(&rect);67光标操作(4)在CTestView::OnLButtonUp()中ReleaseCapture();ClipCursor(NULL);68鼠标画线的例子(1)在CTestView类定义中在CTestView构造函数中private:intm_Draw;HCURSORm_Cursor;CPointm_Old,m_Origin;m_Draw=0;m_Cursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);69鼠标画线的例子(2)在CTestView::OnLButtonDown()中在CTestView::OnLButtonUp()中m_Old=point;m_Origin=point;SetCapture();SetCursor(m_Cursor);
m_Draw=1;CRectrect;GetClientRect(&rect);ClientToScreen(&rect);ClipCursor(&rect);m_Draw=0;ReleaseCapture();ClipCursor(NULL);}70鼠标画线的例子(3)在CTestView::OnMouseMove()中CClientDCdc(this);dc.SetROP2(R2_NOT);if(m_Draw==1){dc.MoveTo(m_Origin);dc.LineTo(m_Old);dc.MoveTo(m_Origin);dc.LineTo(point);m_Old=point;}71鼠标画线的例子(4)72背景与贴图的例子(1)在CTestView类定义中在CTestView构造函数中private:CBitmapm_Back;CBitmapm_Bird0;CBitmapm_Bird1;m_Back.LoadBitmap(IDB_BACK);m_Bird0.LoadBitmap(IDB_BIRD0);m_Bird1.LoadBitmap(IDB_BIRD1);73背景与贴图的例子(2)在CMainFrame::PreCreateWindow()中在CTestView::OnDraw()中CDCMemDC;MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(&m_Back);pDC->BitBlt(0,0,534,432,&MemDC,0,0,SRCCOPY);cs.cx=534;cs.cy=432;cs.style&=~WS_MAXIMIZEBOX;74背景与贴图的例子(3)在CTestView::OnLButtonDown()中CDC*pDC=GetDC();CDCMemDC;MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(&m_Bird0);pDC->BitBlt(point.x,point.y,point.x+137,point.y+99,&MemDC,0,0,SRCAND);MemDC.SelectObject(&m_Bird1);pDC->BitBlt(point.x,point.y,point.x+137,point.y+99,&MemDC,0,0,SRCPAINT);ReleaseDC(pDC);75背景与贴图的例子(4)76扇面效果的例子(1)在CTestView类中添加数据成员在CTestView构造函数中初始化在CTestView::OnLButtonDown中private:BOOLm_Draw;CPointm_Old,m_Origin;m_Draw=false;m_Draw=true;m_Old=point;m_Origin=point;77扇面效果的例子(2)在CTestView::OnMou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 办公室合租租赁合同
- 风力发电场检查井施工合同
- 维修叉车协议的合同范本
- 砂浆购销合同
- 临时代课老师聘用合同3篇
- 2024年度高铁护坡工程保险服务合同
- 二零二四年度建筑钢管扣件安装服务合同
- 公办教师聘任合同
- 建设施工合同补充协议完整版
- 售后服务合同
- 社区动物救助计划
- 提升直通率方案
- 二次结构及粗装修施工方案
- 难免压疮上报表
- 新视野大学英语(第四版)读写教程1(思政智慧版)课件 Unit 5 Friendship across border and gender Section B
- 道路运输企业投诉的处理流程与规范
- 山南电视台招聘考试真题
- 全过程造价咨询服务 投标方案(技术方案)
- 四年级上册道德与法治7《健康看电视》教学反思三篇
- 3-1实验室废弃物的处理
- 七年级音乐下册 第5单元《康定情歌》课件3 花城版
评论
0/150
提交评论