图形设备接口及绘图(精选)
(设备管理)L图形设备接口

Lesson 07-08 图形设备接口Windows系统具有丰富的图形界面。
Windows系统提供许多函数来实现绘图的要求。
而图形设备接口(Graphics Device Interface,简写为GDI)就可看作是这些函数的集合。
GDI表示的是一个抽象的接口。
通过该接口可以实现对图形的颜色、线条的粗细等属性的控制(甚至包括输出文字在内)。
应用程序可以通过调用这些GDI函数和硬件打交道,而不必知道到底是哪个厂家生产的硬件,从而实现了设备无关性。
Windows系统本身也使用GDI来绘制用户界面的各个部分。
一、设备环境1.设备环境Windows默认使用客户区坐标系,其原点在窗口客户区的左上角,X轴的正方向指向右边,Y轴的正方向指向下边。
当应用程序并没有设置颜色、字体等时,系统使用默认的设置。
这些默认的设置保存在设备环境中。
如果没有设备环境,则每输出一个字符串(调用一次TextOut函数),就需要把字体和颜色也作为参数传递给TextOut函数,而且这样的参数有很多。
为了避免这样的麻烦,Windows就把这些可能会重复的参数放在了设备环境中,这样每次只需要多传入一个设备环境的指针就可以了,大大减少了重复工作。
设备环境(Device Context,缩写为DC,有时译为设备上下文,也称设备描述表)是一种包含各种绘图属性(如字体、颜色等等)和方法(即各种绘图函数)的数据结构(或者集合)。
它不仅可以绘制各种图形,而且还可以确定在应用窗口中绘制图形的方式,即确定绘图混和模式和映射模式。
用户在绘图之前,必须获取绘图窗口区域的一个设备环境DC,才能进行GDI函数的调用,执行适合于设备环境DC的命令(就像OnDraw函数中的pDC指针)。
DC中除了提供绘图的函数(如:TextOut)以外,还会提供给用户改变绘图属性的函数,如颜色。
Windows的设备环境是GDI的关键元素,它代表了不同的物理设备。
分为4种类型:显示型、打印机型、内存型和信息型。
图形设备接口及绘图

§3.2 图形设备接口(GDI)
1. 图形设备接口—提供专门的数据结构即设备描述表(DC)和对DC操 作的绘图函数。
2. 设备描述表(DC)—用于代表图形输出设备如显示屏、打印机;
3. 设备无关性—利用GDI,所有的绘图操作都对设备描述表而不是具体 的物理设备。
设备描述表
• 一种专门用于代表图形输出设备(如屏幕、打 印机和绘图仪等)的数据结构 –画布 –绘图工具(设备描述表属性)
hNewPen=(HPEN)SelectObject(hdc,hOldPen); DeleteObject(hNewPen); EndPaint(hWnd, &ps); break;
使用CGDIObject类
• 数据成员m_hObject • Attach函数 Detach函数 • 派生类: CPen、CBrush、CFont、
– yViewport=(yWindowyWinOrg)*(yViewExt/yWinExt)&ewportOrgEx函数
BOOL SetViewportOrgEx( HDC hdc, // 设备描述表句柄 int X, // 使用设备单位,视口原点的X坐标值 int Y, // 使用设备单位,视口原点的Y坐标值 LPPOINT lpPoint // 指向POINT结构变量,存放 原始的视口原点坐标
PAINTSTRUCT • typedef struct tagPAINTSTRUCT {
HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT
(2) EndPaint function
计算机常见外部接口图解

计算机常见外部接口图解3.5mm插头USB接口串口VGA接口网卡(LAN)接口并口电脑内数据接口IEEE1394接口eSATA接口Micro-USBDVIHDMI3.5mm插头最常见的立体声耳机分三层,也有两层的,每一层都有对应的功能,要DIY的话一定要分层。
标准分布为“左右地红白”(从端部到根部依次是左声道、右声道、地线,其中左声道常用红色线皮,右声道常用白色的)。
最常见的是银白色的和铜黄色的,银色的是铜镀银,铜黄色的就是铜。
由于银的稳定性和电子工程性优于铜,所以铜镀上银后可以升级使用该插头设备的用户体验。
USB接口USB是一种常用的pc接口,他只有4根线,两根电源两根信号,故信号是串行传输的,usb接口也称为串行口,usb2.0的速度可以达到480Mbps。
可以满足各种工业和民用需要.USB接口的输出电压和电流是: +5V 500mA 实际上有误差,最大不能超过+/-0.2V 也就是4.8-5.2V 。
usb接口的4根线一般是下面这样分配的,需要注意的是千万不要把正负极弄反了,否则会烧掉usb设备或者电脑的南桥芯片:黑线:gnd 红线:vcc 绿线:data+ 白线:data-USB接口定义图USB接口定义颜色一般的排列方式是:红白绿黑从左到右定义:红色-USB电源:标有-VCC、Power、5V、5VSB字样白色-USB数据线:(负)-DATA-、USBD-、PD-、USBDT-绿色-USB数据线:(正)-DATA+、USBD+、PD+、USBDT+黑色-地线: GND、GroundUSB接口的连接线有两种形式,通常我们将其与电脑接口连接的一端称为“A”连接头,而将连接外设的接头称为“B”连接头(通常的外设都是内建USB数据线而仅仅包含与电脑相连的“A”连接头)。
USB接口是一种越来越流行的接口方式了,因为USB接口的特点很突出:速度快、兼容性好、不占中断、可以串接、支持热插拨等等,所以如今有许多打印机、扫描仪、数字摄像头、数码相机、MP3播放器、MODEM等都开始使用USB做为接口模式,USB接口定义也很简单:1 +5V2 DATA-数据-3 DATA+数据+4 GND 地USB接口定义图USB全称是Universal Serial Bus,USB支持热插拔,即插即用的优点,所以USB接口已经成为电脑外设最主要的接口方式。
图形设备接口

图形设备接口学前提示Windows中负责图形输出的是图形设备接口 GDI(Graphic Device Interface)。
GDI通过将应用程序与不同的输出设备特性相隔离,使Windows应用程序能够无须修改即可在Windows支持的任何图形输出设备上运行,即具有设备无关性。
本章主要介绍图形设备接口的知识——设备描述表,坐标系统,映射模式,绘图函数和绘图工具知识要点设备上下文坐标的映射绘制基本图形创建画笔设备上下文类为了支持GDI绘图,MFC提供了两种重要的类设备上下文类,包括 CDC及其派生类,用于设置绘图属性和绘制图形绘图对象类,封装了各种GDI绘图对象,包括画笔,画刷,字体,位图,调色板和区域等设备上下文类包括CDC类和它的派生类CClientDC,CPaintDC,CWindowDC ,CMetaFileDC。
7.2 坐标的映射坐标的映射方式简单地讲就是坐标的安排方式,系统默认的映射模式为 MM_TEXT , 即 X 坐标向右增加,Y 坐标向下增加,(0,0)在屏幕左上方,DC 中的每一点就是屏幕上的一个象素,如图 7.3所示。
如语句 pDC->Rectangle(CRect(0,0,300,300))表示将绘制出一个矩形,这个矩形的左上角落在屏幕的左上方,长和宽均为 300 个象素 屏幕坐标 X 坐标向右增加7.2.1 设置映射模式用户可以通过int CDC::SetMapMode( int nMapMode) 指定映射模式,映射模式从 X轴和Y轴的比例是否可变来说,可分为固定映射模式和可变比例映射模式两类(1)固定比例映射模式,其具体值如表 7.2 所示表 7.2 固定比例映射模式上述几种映射默认的原点在屏幕左上方,(2)可变比例映射模式7.3 绘制基本图形CDC类在它的成员函数中封装了全部Windows 图形 API ,这些成员函数包括—画点的函数,画线的函数,画形状的函数,填充和翻转形状的函数,滚动屏幕的函数,绘制文本的函数,绘制位图和图表的函数7.3.1 画点画点即在指定的坐标处按给定的颜色画出像素点,点的绘制不过是改变单个像素点的颜色。
c# GDI+简单绘图

c# GDI+简单绘图最近对GDI+这个东西接触的比较多,也做了些简单的实例,比如绘图板,仿QQ截图等.最早接触这个类,是因为想做仿QQ截图的效果.巧的很,学会了如何做截图后,.NET课堂上老师也正巧要讲关于c#绘图方面的知识,并且我自己又在网上学习金老师的培训班,也是要用到这个类.在学习中有一些体会,所以准备把这些体会记下来,因为内容比较多,可能我会分几次写.废话不多说了,我们先来认识一下这个GDI+,看看它到底长什么样.GDI+:Graphics Device Interface Plus也就是图形设备接口,提供了各种丰富的图形图像处理功能;在C#.NET中,使用GDI+处理二维(2D)的图形和图像,使用DirectX处理三维(3D)的图形图像,图形图像处理用到的主要命名空间是System . Drawing:提供了对GDI+基本图形功能的访问,主要有Graphics 类、Bitmap类、从Brush类继承的类、Font类、Icon类、Image类、Pen类、Color类等.大概了解了什么是GDI+后,我们来看一下绘图要用到的主要工具,要画图,肯定要画板吧,在C#中画板可以通过Graphics这个类来创建,有了画板,总得弄个笔什么之类的吧,不然怎么画呀,难不成我们用手指画.笔又可以分好多种类,比如铅笔,画刷等.它们的区别主要是铅笔可以用来画线条,而画刷呢,嘿嘿,自己考虑下.在c#中我们可以用Pen,Brush类来实现类似功能.颜料则自然是用Color类了.有了工具,我们就可以开始动手了!(所需命名空间:using ;)实现效果:在空白窗体中画基本图形首先准备一个画板:创建一个画板主要有3种方式:A: 在窗体或控件的Paint事件中直接引用Graphics对象B: 利用窗体或某个控件的CreateGraphics方法C: 从继承自图像的任何对象创建Graphics对象这次我们就先以A为例说明问题:private void Form1_Paint(object sender, PaintEventArgs e){Graphics g = ; }然后,我们要只笔:private void Form1_Paint(object sender, PaintEventArgs e){Graphics g = ; Pen p = new Pen, 2);private void Form1_Paint(object sender, PaintEventArgs e){Graphics g = ; Pen p = new Pen, 2);1.首先我们来看下上一片中我们使用过的Pen.Pen的属性主要有: Color(颜色),DashCap(短划线终点形状),DashStyle(虚线样式),EndCap(线尾形状), StartCap(线头形状),Width(粗细)等.我们可以用Pen 来画虚线,带箭头的直线等Pen p = new Pen, 5);下来我们来看下Brush的使用作用:我们可以用画刷填充各种图形形状,如矩形、椭圆、扇形、多边形和封闭路径等,主要有几种不同类型的画刷:•SolidBrush:画刷最简单的形式,用纯色进行绘制•HatchBrush:类似于 SolidBrush,但是可以利用该类从大量预设的图案中选择绘制时要使用的图案,而不是纯色•TextureBrush:使用纹理(如图像)进行绘制•LinearGradientBrush:使用沿渐变混合的两种颜色进行绘制•PathGradientBrush :基于编程者定义的唯一路径,使用复杂的混合色渐变进行绘制我们这里只是简单介绍使用其中的几种:Graphics g = ();Rectangle rect = new Rectangle(10, 10, 50, 50);标轴变换在winform中的坐标轴和我们平时接触的平面直角坐标轴不同,winform中的坐标轴方向完全相反:窗体的左上角为原点(0,0),水平向左则X增大,垂直下向则Y增大接下来,我们来实际操作下,通过旋转坐标轴的方向来画出不同角度的图案,或通过更改坐标原点的位置来平衡坐标轴的位置.Graphics g = ();后我们来看下Graphics这个画板上我们还可以画什么其实我们上面用到的都是在画一些简单的图形,直线,矩形,扇形,圆孤等,我们还可以用它来绘制图片,这可以用它的DrawImage方法.这里我不详细讲解,大家有兴趣可以自己去MSDN了解下.我们后面会讲到的截图就会用到这个方法.感谢大家的支持,这几天从早忙到晚,一个字累呀!!!现在挺困的,但是又不习惯这么早睡觉,哎~~还是利用这个时间继续来写第三篇吧.前两篇已经基本向大家介绍了绘图的基本知识.那么,我就用我们上两篇所学的,做几个例子.我们先来做一个简单的----仿QQ截图,关于这个的例子其实网上已经有这方面的资料了,但是为了文章的完整性,还是觉得有必要讲解.我们先来看一下效果:(图1)(图2)接下来看看这是如何做到的.思路:聊天窗体上有一个截图按钮,点击按钮后,程序将整个屏幕画在一个新的全屏窗体上,然后显示这个窗体.因为是全屏的窗体,并且隐藏了菜单栏、工具栏等,所以在我们看来就好像是一个桌面的截图,然后在这个新窗体上画矩形,最后保存矩形中的内容并显示在原来的聊天窗体中.步骤:A.新建一个窗体.命名为Catch.然后设置这个窗体的FormBorderStyle为None,WindowState为Maximized.B.我们对代码进行编辑:using System;usingusing;using;using;using;usingnamespace Client{public partial class Catch : Form{public Catch(){InitializeComponent();}#region用户变量private Point DownPoint = ;建了Catch窗体后,我们在截图按钮(位于聊天窗体上)上加入以下事件:private void bCatch_Click(object sender, EventArgs e){if{(); [0].; [0].);是在绘制第二个图形时,我们先用与底色相同的颜色将上次绘制的图形重新绘制一下.但这往往需要底色为纯色时使用.2.我们并不直接将图形画在画板上,我们用一个图片A来保存原画板上的图片.然后再新建一个与图片A相同的图片B,将我们要绘制的图形画在该图片B上,然后再将该图片B 画在画板上.这样图片A并没有被改变.于是第二次画的时候我们还是同样新建一个与图片A相同的图片进行绘制.那么上一次的图形就不会被保留下来.问题也就解决了.前几篇我已经向大家介绍了如何使用GDI+来绘图,并做了一个截图的实例,这篇我向大家介绍下如何来做一个类似windows画图的工具.个人认为如果想做一个功能强大的绘图工具,那么单纯掌握GDI还远远不够,我的目前也只能做一个比较简单的绘图工具了.不足之处,欢迎大家讨论!先来看一下最终效果吧:主要实现功能:画直线,矩形,橡皮,圆形,切换颜色,打开图片,保存图片,清除图片,手动调节画布大小;软件刚启动时,为一张空白画布,我们可以直接在画布上绘画,也可以通过菜单中的“打开”,导入一张图片,然后我们就可以在这张图片上进行绘制。
图形设备接口及绘图

✓
绘图函数:Ellipse()…
✓
文本输出:TextOut()SetTextColor()…
✓
数据成员m_hdc:设备描述表句柄。
PPT文档演模板
图形设备接口及绘图
➢CPaintDC:
✓ construction CWnd::BeginPaint ✓ destruction CWnd::EndPaint
);
PPT文档演模板
图形设备接口及绘图
坐标系的转换
1. DPToLP() 2. LPToDP() 3. ClientToScreen() 4. ScreenToClient()
PPT文档演模板
图形设备接口及绘图
3.8 使用CDC类绘制图形
• 绘制点和线
–COLORREF SetPixel( POINT point, COLORREF crColor );
PPT文档演模板
hNewPen=(HPEN)SelectObject(hdc,hOldPen);
DeleteObject(hNewPen);
EndPaint(hWnd, &ps);
break;
图形设备接口及绘图
使用CGDIObject类
• 数据成员m_hObject • Attach函数 Detach函数 • 派生类: CPen、CBrush、CFont、
–CPoint MoveTo( POINT point ); –BOOL LineTo( POINT point );
PPT文档演模板
–BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
–BOOL AngleArc( int x, int y, int
GDI编程 绘图

第8章 GDI编程1-绘图GDI(Graphics Device Interface,图形设备接口)是Windows操作系统的传统图形子系统,负责与设备无关的图形绘制,Win32 API为应用程序提供了丰富的绘图函数和功能,MFC对它们进行了C++类封装,参见图8-1。
图8-1 GDI与Windows操作系统(其中彩色部分为操作系统)于1985年11月推出的,新式GDI+则是随Windows XP于2001年10月推出的GDI的改进版,增加了α混色、渐变画刷、样条曲线、矩阵变换、图像处理、持久路径等新功能。
随Windows Vista及.NET框架于2006年11月又推出了基于DirectX和.NET框架的全新图形子系统WPF(Windows Presentation Foundation,视窗显示/展现基础),它统一了桌面和浏览器等客户端应用程序的图形界面,采用XAML声明式编程,将用户界面的设计和编程彻底分离开来,是Windows的下一代GUI显示系统。
本书从第8章到第11章,将详细讨论如何使用GDI进行传统的Windows图形编程,包括绘图、文字、图像、动画、图标、图元文件和打印等内容。
GDI+是建立在GDI之上的,计划在第14和15章中作简单介绍。
WPF则是以.NET框架为基础的,准备在第19上和20章中再加以讨论。
在MFC应用程序中,绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw 中进行,例如:void CDrawView::OnDraw(CDC* /*pDC*/) {CDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码}每次需要重绘窗口时(如程序启动、窗口大小改变、全部或部分窗口重现、程序员调用函数RedrawWindow 或Invalidate/UpdateWindow ),应用程序框架都会调用此CWnd 消息响应成员函数(的覆盖)来绘制窗口客户区。
第七章 图形设备接口与绘图应用

基于 MFC 的 Windows 编程与以往 Windows 编程不同,它总是选择一个 MFC 类对设备环境 进行访问。 MFC 提供了几种不同的设备环境类, CDC 是以下所列设备环境类的基类,它封装了 GDI 的一些图形处理函数。常用的派生类有以下 几种: CClientDC : 绘图区域指窗口的客户区,用来立 即响应鼠标事件进行绘图,设备环境的建立和初始 化都在鼠标消息对应的处理程序中。 所谓客户区是指窗口区域中除去边框、标题 栏、菜单栏或可能有的状态栏、对话栏等以外的 部分。坐标( 0 , 0 )通常指客户区的左上角。在 使用 CClientDC 绘图时,通常先调用窗口的 GetClientRect ( )来获取客户区的大小。
Company Logo
CBrush (画刷):利用它可为区域内部填充颜色。 CFont (字体):选择一种具有某种风格和尺寸的字体。 字体常常被当作资源存于磁盘中,其中有一些还依赖于特 定设备。 CRgn (区域):定义一个由多边形、椭圆或一由组合形 成的范围,可以利用它来进行填充、裁剪以及鼠标点击操 作。 . CPalette (调色板):选择一种颜色映射接口,它允许 应用程序在不干扰其他应用程序的前提下,充分利用输出 设备的颜色描绘图形。 CBitmap (位图):定义位图。它是一个象素矩阵。用户 可以利用位图来表示图象,也可以利用它来创建画刷。 通常情况下都是使用 GDI 绘图对象类所创建的对象绘 制各种图形,就好像画家手里必须拿着画笔才能作画一样。
图形设备接口与绘图应用
图形设备接口( GDI , Graphics Device Interface )是 windows 系统中的核心模块,它是一个可执行程序 ( GDI.exe )。 在 windows 应用程序中,图形和文本都是通过 GDI 以图 形方式来处理的, GDI 接受了 windows 应用程序的绘图 请求后,它会根据设备环境( DC )的设置,将这些请求 传给相应的设备驱动程序,从而完成特定硬件的输出。 GDI 之所以能够完成应用程序的绘图请求,是因为它含 有在 Windows 应用程序内部可调用的、且与设备无关的 图形操作函数,这些函数可产生各种各样的线、正文和位 图,它们可以输出到许多不同的输出设备上。 GDI 允许一个应用程序产生画笔、画刷、字体和位图等绘 图工具,以供特定的输出操作使用。