windows的图形设备接口及windows绘图
c++第5章 图形绘制
![c++第5章 图形绘制](https://img.taocdn.com/s3/m/08bd5e7d27284b73f2425091.png)
第5章图形绘制在Visual C++6.0中,掌握图形程序设计方法是非常重要的。
因为图形在任何一个可视化工程项目中都是不可缺少的。
CDC(设备环境)类封装了图形绘制所需要的各种操作。
本章我们将通过实际例子和较详细的阐述,来了解和掌握如何使用设备环境类(CDC)及图形设备接口(GDI)进行图形绘制。
5.1 设备环境与设备环境类(CDC)5.1.1 设备环境设备环境也称设备上下文(Device Context,简称DC),是计算机物理设备的代表,也是图形设备接口的主要组成部分。
由于Windows是一个与设备无关的操作系统,即Windows不允许直接访问硬件,如果用户想将文本和图形绘制到显示器或其它设备中去,必须通过“设备环境”这个抽象层与硬件进行通信,设备上下文对象的作用就是实现Windows的设备无关性,任何向屏幕上进行输出的功能都要间接地通过它来完成。
设备上下文是Windows的一种数据结构,它包含了有关如显示器或打印机等设备的绘图属性信息。
所有绘画都是通过设备上下文对象来实现的,该对象封装了Windows的画线、图形和文本的API函数。
设备上下文允许在Windows下独立于设备的绘画。
设备上下文不仅能够被用来在屏幕上绘画,它也可以将绘画输出到打印机和图元文件中。
5.1.2 设备环境类设备环境类CDC直接继承于CObject类,该类定义了一类设备对象。
CDC对象提供了非常多的成员函数,与设备环境的显示器、打印机等一起工作。
例如,如果要在显示器等设备上绘制图形,我们可以用MFC提供的设备环境类CDC类,因为CDC类中包含了绘图所需要的所有成员函数。
同时。
MFC还提供了以下几个CDC的派生类:1、CPaintDC类此类比较特殊,它的构造函数和析构函数都是针对OnPaint进行的。
用户一旦获得相关的CDC指针,就可以将它当做任何设备环境(包括屏幕、打印机)指针来使用,CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。
图形设备接口及绘图
![图形设备接口及绘图](https://img.taocdn.com/s3/m/df07b1e758fb770bf68a5509.png)
§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
VC++实验 windows绘图
![VC++实验 windows绘图](https://img.taocdn.com/s3/m/302aac95daef5ef7ba0d3ce5.png)
实验4 Windows绘图实验目的1、掌握设备描述表2、掌握CDC类和CGDIObject类及其派生类的应用3、掌握CFont类的一个用4、定时器的应用与定时消息的处理实验内容:本节主要掌握Windows的绘图功能,主要内容包括图形设备接口、CDC类和CGDIObject 类、用CDC类进行图形绘制、用CGDIObject类的派生类CPen类和CBrush类进行绘图。
还讲述了用CGDIObject类的派生类CFont类设置字体以及用定时器实现简单的动画效果。
1.设备描述表设备描述表(Device Context)是一个用来确定任何设备的GDI出书的位置和形象属性的集合。
应用程序病不能直接访问设备描述表,但是应用程序可以使用设备描述表的句柄来间接地存取设备描述表及其属性。
创建的设备描述表包含了它所有的属性和默认值。
在Windows环境下,所有图形文字的输出都是基于坐标系统的,图形坐标系统与基于文本的函数所使用的坐标系统是一致的。
默认的坐标系统以用户区域的左上角为原点,向右的每一个像素表示沿正X轴的一个单位,向下的每一个像素表示沿正Y轴的一个单位。
3.绘图工具绘图工具包括画线的画笔、填充图形内部以及书写正文的字体工具。
所有这些工具的使用都要经过3个步骤,即建立工具、选择工具和使用完后删除相应的工具。
4.CDC类和CGDIObject类CDC类封装了Windows的DC(设备描述表),是MFC设备环境类的基类,其他的MFC设备环境类都是CDC类的派生类。
CDC类指针的生成是用GetDC()函数来实现的,CDC类指针的销毁是用ReleaseDC()函数来实现的。
如:CDC *pDC=GetDC();ReleaseDC(pDC);CGDIObject类及其派生类只封装了GDI中的部分实体,所以CGDIObject类和GDI并不具有想CDC类和DC那样的对应关系。
CGDIObject类具有以下几个主要派生类:CBitmap:位图CBrush类:画刷CPen类:画笔CPalette类:调色板CFont类:字体CRgn类:区域构造CGDIObject派生类的对象通用有两种方法:(一)一步构造法。
C++_Windows绘图
![C++_Windows绘图](https://img.taocdn.com/s3/m/ccc61a19650e52ea5518988b.png)
5.4.1 与绘图相关的数据类型
2.CRect类和RECT结构 CRect类等同于RECT结构,它用top、left、bottom、 right成员来定义一个矩形区域,RECT的形式是: typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT;
5.1.2 图形刷新
3.刷新方法 常用的Windows应用程序刷新窗口的方法如下: 在内存中保持一个显示输出的副本,当需要重绘 窗口时,将副本拷贝到相应的窗口中。该方法适 用于刷新位图等复杂图形。 记录曾经发生的事件,在窗口需要刷新时重新调 用窗口执行这个事件。 重新绘制图形,一般对于简单图形常采用重新绘 制图形方法执行刷新。在应用程序中,将图形绘 制处理程序放在消息WM_PAINT的响应模块中, 一旦程序接收到刷新请求即可重绘图形。
GDI是Windows用来管理图形操作的一个与设备 无关的模块。上面提到的Windows的DC也包含在 GDI中,GDI还提供了许多有关图形操作的API函 数,这些函数都与DC有关(DC句柄作为参数之 一)。MFC针对DC提供了CDC类,并且把与DC 有关的图形操作API函数封装进CDC类,作为其 成员函数。针对GDI提供的其他一些实体,如笔、 刷子等绘图工具,MFC均提供了GDI实体类,如 CPen、CBrush类等,这些实体类的抽象基类就 是CGDIObject类。
画笔是用来绘制各种直线和曲线的一种图形工具。 系统默认的画笔具有一个像素宽,风格为实线, 颜色为黑色。系统中共有4种画笔,称为库存画笔。 应用程序可以使用GetStockObject()函数来调用 Windows系统定义的画笔。4种库存画笔分别是 WHITE_PEN、BLACK_PEN、DOC_PEN、 NULL_PEN。用户也可以使用CreatePen()函数创 建出具有各种不同属性的画笔。 画笔的操作包括创建画笔、将画笔选入设备环境 和删除画笔。
【干货】VC中跟绘图有关的HDC、CDC、ClientDC、WindowsDC区别
![【干货】VC中跟绘图有关的HDC、CDC、ClientDC、WindowsDC区别](https://img.taocdn.com/s3/m/c025fc84daef5ef7ba0d3ce8.png)
VC中跟绘图有关的HDC、CDC、ClientDC、WindowsDC区别
一般在绘制图形或文字时需要GDI(graph device interface 图形设备接口)函数和DC,GDI提供绘制的动作,如画线、矩形、园等,而DC提供绘制使用的材料和工具,具体如颜色、画笔、画刷等。
DC device context 设备环境的英文缩写,在绘制图形、文字等之前使用的画布、画笔、画刷的环境。
HDC是DC的最原始句柄
CDC在MFC中将DC封装成一个类才操作,需要自己释放
CClientDC解决CDC需要自己释放问题而封装的类,窗口客户区可以让开发者
访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC:一般指向本窗口或当前活动视图;用法是:CClientDC dc(this); CWindowDC在全屏幕绘图封装的类
CPaintDC只响应WM_PAINT消息的DC,BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。
EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。
图形设备接口及绘图
![图形设备接口及绘图](https://img.taocdn.com/s3/m/9c858d6e7cd184254b3535f6.png)
✓
绘图函数: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
软件工具与应用实验指导书
![软件工具与应用实验指导书](https://img.taocdn.com/s3/m/fd6ac7ea2dc58bd63186bceb19e8b8f67c1cef62.png)
软件工具与应用实验指导书一、实验平台VisualC++是Microsoft公司为开发Windows应用程序而创建的一种新的编程工具,它是生产效率最高的C++工具,用于创建性能最高的Windows应用程序和Web程序。
儿乎所有的世界级软件,从领先的Web浏览器到以任务为主的应用程序,都是用MiCrOSOflViSUaIC++开发系统创建的。
ViSUalC++6.0给C++带来了高水准的生产效率,并具有使用灵活、性能强大和控制简单等优点。
它的高性能及高度集成的开发环境,可使用户比从前更方便、快捷地创建、修改和调试WindOWS应用程序,而无需手工编制程序语句。
VisualC++6.0与以前的版本相比有了多方面的改进。
它的编译器、调试器、连接器、编辑器、资源编辑器都有所加强,在编辑器中还提供了自动语句生成功能,编辑器会像VisualBasic一样自动提示函数的参数、对象的成员。
另夕卜,VisualC++6.0还提供了很多向导。
MFC提供了一些新的类,提供了更强大的数据访问功能。
用户可利用ViSUalC++6.0以两种方式编写Win32应用程序,一种方式是基于WindowsAPI的编程方式,另一种是基于MFC的编程方式。
二、实习目的和要求软件工具与应用是一门实际技术课程,有很强的实践性。
通过实验教学环节,对学生进行实践技能和科学研究方法的训练,巩固其在课堂上所学书本知识,加深印象、熟练掌握。
实验中,一是理解使用ViSUalC++进行面向对象与可视化程序设计的基本原理和方法;二是掌握使用API函数进行可视化编程、使用MFC进行可视化编程和VisualC++高级编程的技能;三是锻炼对前后章节知识的综合运用的能力,逐步全面掌握面向对象与可视化编程技术,为实际的软件开发打下基础。
三、实验实验一:ViSlIaIC++基础及开发环境实验目的:让学生熟悉VisualC++开发环境。
实验内容和要求:通过上机实习熟悉ViSUalC++开发环境及其各个成分的使用方法:菜单、工具栏、项目工作区窗口、文档窗口、输出窗口。
GDI编程 绘图
![GDI编程 绘图](https://img.taocdn.com/s3/m/43a8adfda216147916112880.png)
第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 消息响应成员函数(的覆盖)来绘制窗口客户区。
Windows7的图形架构与DX的那点事
![Windows7的图形架构与DX的那点事](https://img.taocdn.com/s3/m/8e714418227916888486d7af.png)
Windows7的图形架构与DX的那点事Posted on 2010-09-03 09:07 竹印 阅读(288) 评论(3)编辑收藏 所属分类: 图形最近看了一些关于GDI/GDI+/D2D/D3D的东东,看到几篇不错的文章,分享一下。
一:原文链接 : 2D Drawing APIs in Windows在 Windows 7 操作系统中,微软花费了很大的力气构建了一套新的 2D 绘图 API。
我们称之为 Direct2D ,隶属于 DirectX 家族。
这个 API 的开发填补了 Windows 图形平台的一些缺陷。
其中非常重要的一点就是普通的 2D 程序渲染不再缺乏硬件加速。
而在 Windows Vista 中,我们知道 GDI 是无法进行硬件加速的。
微软寄望于开发的这个 API 具备很多现代特性。
比如支持抗锯齿和 Alpha Blend 的 2D 渲染,和其它现代图形 API 交互,服务器端渲染,诸如此类。
为了方便理解微软为何开发 Direct2D ,我们先来回顾一下当初开发 Windows 时的历史。
最初的渲染系统叫做 GDI (图形设备接口),今天仍然存在。
它最初为 16 位 Windows 写就,随后升级到 32 位 Windows (Windows 95 和 Windows NT)。
因为 GDI 是为很久以前那些计算能力低下的计算机而开发的,所以它并没有诸如抗锯齿之类的特性,大多数 API 亦不支持 Alpha 通道。
在 Windows 95 期间,DirectX 发布了第一版。
DirectDraw 是其中最早的组件之一。
当初的本意是在硬件加速启用的情况下,开发人员可以绕过 WinG 允许,直接访问硬件。
这样的一个协议堆栈既可以和 GDI 协作,但是又真正处在同一地位。
随着图形硬件(显卡)演进,GDI 通过 DDI (设备驱动接口) 获得了硬件加速的能力。
很多视频卡实现了这些 DDI ,而通过购买一块视频卡来改善你的 Windows 性能亦成为平常之事。
GDI
![GDI](https://img.taocdn.com/s3/m/b00f191b2bf90242a8956bec0975f46527d3a769.png)
如果有必要,我们可以使用一些GDI函数获取和改变设备描述表中的属性值。
感谢观看
GDI+在区域(regions)方面对GDI进行了改进,在GDI中,Regions存储在设备坐标中,对Regions唯一可进 行图形变换的操作就是对区域进行平移。而GDI+用世界坐标存储区域(Regions),允许对区域进行任何图形变换 (譬如如图所示的缩放),图形变换以变换矩阵存储,下面例子是一个区域变换前后的例子(缩放、旋转、平移)
在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就 可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI的出现使程序员无需要关心硬件设备 及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方 便了开发工作。
你可能会注意到上面显示的图形,红色未平移区域与变换后区域有一部分交叉区域,这一部分形成的梦幻效 果就是由GDI+支持的Alpha Blending(混合)实现的,利用alpha融合,你可以指定填充颜色的透明度,透明颜 色与背景色相互融合,填充色越透明,背景色显示越清晰,四个椭圆被填充了同样的颜色,但由于拥有不同的透 明度而呈现不同的显示效果。
GDI+提供了矩阵对象,一个非常强大的工具,使得编写图形的旋转、平移、缩放代码变得非常容易。一个矩 阵对象总是和一个图形变换对相起来,比方说,路径对象(PATH)有一个Transform方法,它的一个参数能够接 受矩阵对象的,每次路径绘制时,它能够根据变换矩阵绘制。下面的图形是一个图形变换前后的例子,变换按照 先缩放后旋转完成。
06图形设备接口GDI基本概念
![06图形设备接口GDI基本概念](https://img.taocdn.com/s3/m/1520ea4b640e52ea551810a6f524ccbff121cae4.png)
设备坐标系分为屏幕坐标系、窗口坐标系和客户区坐标系三种相互独立的坐标系。屏幕坐标系以屏幕左上角为原点,一些与整个屏幕有关的函数均采用屏幕坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是屏幕坐标。窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。
1. GDI的一些基本概念
Windows绘图过程和设备无关性的实现:
GDI处于设备驱动程序的上一层,当程序调用绘图函数时,GDI将绘图命令传送给当前设备的驱动程序,以调用驱动程序提供的接口函数。驱动程序的接口函数将Windows绘图命令转化为设备能够执行的输出命令,实现图形的绘制。不同设备具有不同的驱动程序,设备驱动程序是设备相关的。
如果采用MFC方法编程,MFC提供了不同类型的DC类,每一个类都封装了DC句柄,并且它们的构造函数自动调用获取DC的API函数,析构函数自动调用释放DC的API函数。因此,在程序中通过声明一个MFC设备环境类的对象就自动获取了一个DC,而当该对象被销毁时就自动释放了获取的DC。MFC AppWizard应用程序向导创建的OnDraw()函数自动支持所获取的DC。MFC的DC类包括CDC、CPaintDC、CClientDC、CWindowDC和CMetaFileDC等,其中CDC类是MFC设备环境类的基类,其它的MFC设备环境类都是CDC的派生类。
获取设备环境DC的方法:
在程序中不能直接存取DC数据结构,只能通过系统提供的一系列函数或使用设备环境的句柄HDC来间接地获取或设置设备环境结构中的各项属性,如显示器高度和宽度、支持的颜色数及分辨率等。如果采用SDK方法编程,获取DC的方法有两种:在WM_PAINT消息处理函数中通过调用API函数BeginPaint()获取设备环境,在消息处理函数返回前调用API函数EndPaint()释放设备环境。在其他函数中通过调用API函数GetDC()获取设备环境,调用API函数ReleaseDC()释放设备环境。
第07课 - 绘图工具
![第07课 - 绘图工具](https://img.taocdn.com/s3/m/ed51a42fdd36a32d737581f9.png)
5
设备环境句柄
Windows程序设计-基础教程
HDC 设备环境句柄
HDC 是数据类型 HDC 代表了程序当前显示设备
HDC的用途:在程序中代表显示设备 在绘图时,必须要指定一个设备环境(DC),用 来将某个窗口或设备与设备环境类的句柄指针关 联起来,所有的绘图操作都与该句柄有关。 HDC的获得
绘图消息
Windows程序设计-基础教程
WM_PAINT
所有的绘图操作都在该消息下产生 窗口刷新的时候产生该消息
• 如:窗口尺寸发生变化、窗口被其他窗口覆盖
函数:
InvalidateRect 执行的时候产生该消息 使用例子: InvalidateRect(hWnd,NULL,TRUE);
4
GDI特点
Windows程序设计-基础教程
GDI特点:
不需要程序直接访问物理显示硬件,通过称为“设备 环境”的抽象接口,间接访问显示硬件; 程序需要与显示硬件(显示器、打印机等)进行通讯 时,必须首先获得与特定窗口相关联的设备环境; 用户无需关心具体的物理设备类型; Windows参考设备环境的数据结构完成数据的输出。
*矩形绘制
Windows程序设计-基础教程
BOOL Rectangle( HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
*绘制椭圆
Windows程序设计-基础教程
BOOL Ellipse( HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
WINCE屏幕绘图基础
![WINCE屏幕绘图基础](https://img.taocdn.com/s3/m/bc26e0bdf121dd36a32d8201.png)
第2章屏幕绘图概述在第1章,示例程序HelloCE完成一项工作:在屏幕上显示一行文字。
显示这行文字只需要调用一次DrawText即可,因为Windows CE代为处理了很多细节,例如字体、字体颜色、文本行在屏幕上的位置等等。
借助图形用户接口的力量,应用程序不只能在屏幕上输出本文行,还能做更多的事情。
应用程序可以绘制出非常精细的显示外观。
纵观微软Windows操作系统,用于绘制屏幕的函数数量发生了巨大的扩展。
Windows每个后续的版本里,都增加了许多函数以扩展程序员可以使用的工具集。
虽然新函数增加了,但旧函数依然被保留,这样即使有旧函数被新函数取代,旧程序依然可以继续运行在新版本的Windows 上。
这种函数不断堆积,旧函数被保留以向后兼容的策略,在最初的Windows CE版本里却被废弃了。
因为需要制作更小版本的Windows,CE团队苦览Win32 API,并只复制适合Windwos CE目标市场的应用程序绝对需要的API。
这种精简对Win32 API影响最大的领域之一就是图形函数。
到不是您会缺乏用于工作的函数,只是在Win32 API的冗余度方面,对图形函数做了教大的精简。
程序员面临的新挑战之一就是不同的Windows CE平台支持略微不同的API集合。
Windows CE图形功能与桌面系统不同之处,其中之一就是Windows CE不支持不同的映射模式,而这在其他Windows系统里是支持的。
Windows CE设备环境始终设置为MM_TEXT映射模式。
坐标转化在Windows CE下也不支持。
虽然这些特性在一些类型的应用中很有用,但在小型便携式设备的Windows CE环境里,这些需求并不突出。
所以当你阅读本章里使用的函数和技术时,请记住其中一些可能不能在所有平台上被支持。
通过GetDeviceCaps函数,程序可以判断系统支持什么函数。
GetDeviceCaps返回当前图形设备的实际能力。
第06课 - 图形设备接口
![第06课 - 图形设备接口](https://img.taocdn.com/s3/m/a6bf222d2f60ddccda38a0f9.png)
消 息 队 列
线程
17
return 0; }
鼠标消息
Windows程序设计-基础教程
鼠标的消息有哪些?
WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK WM_MBUTTONDOWN WM_MOUSEMOVE WM_MOUSEWHEEL WM_NCLBUTTONDOWN WM_NCLBUTTONUP
18
鼠标消息
Windows程序设计-基础教程
WM_LBUTTONDOWN 参数功能:
wParam 存放一个标志,该标志注明了当鼠标左键按 下的时候还有什么键同时被按下。 lParam 存放当前光标的在窗口中的位置。
19
鼠标消息
Windows程序设计-基础教程
光标的位置:
xPos = LOWORD(lParam); yPos = HIWORD(lParam);
34
Windows程序设计-基础教程
绘制直线
பைடு நூலகம்
35
画线函数
Windows程序设计-基础教程
BOOL MoveToEx( HDC hdc, int X, //起始xpos int Y, //起始ypos LPPOINT lpPoint //光标的旧位置 ); 功能:确定直线的起始坐标 BOOL LineTo( HDC hdc, int nXEnd, int nYEnd); 功能:确定直线的结束坐标,并画线
27
设备环境句柄
Windows程序设计-基础教程
HDC 设备环境句柄
补充(5)图形设备接口(GDI)
![补充(5)图形设备接口(GDI)](https://img.taocdn.com/s3/m/f25f1f0ff12d2af90242e6a6.png)
SetViewportOrg和 SetViewportOrg和SetWindowOrg
(4) pDC->SetMapMode(MM_LOMETRIC); pDC->SetViewportOrg(100, 100); (4) pDC->Rectangle(0,0,200,200); (5) pDC->SetMapMode(MM_LOMETRIC); pDC->SetWindowOrg(100, 100); pDC->Rectangle(0,0,200,200); (5) 注意:MM_LOMETRIC模式下逻辑坐标系 与设备坐标系Y方向相反。 移动窗口原点或视口原点都能达到移动图形的目的,但移动的量是不 一样的。移动窗口原点,移动量以逻辑坐标为单位;移动视口原点, 移动量以像素为单位。
VC坐标系解析——逻辑坐标 VC坐标系解析——逻辑坐标 坐标系解析——
逻辑坐标除MM_TEXT模式外均指物理尺寸,如mm,inch等。 Windowsd GDI函数用逻辑坐标系。 逻辑坐标的坐标X,Y正方向随着映射模式的不同而不同。 当程序员在调用一个画线的GDI函数LineTo,画出25.4mm(1英寸) 长的线时,他并不需要考虑输出的是何种设备。若设备是VGA显示器, Windows自动将其转化为96个像素点;若设备是一个300dpi的激光打 印机,Windows自动将其转化为300个像素点。
映射模式
要指定绘图位置,需使用坐标系。Windows提供了若干种不同的坐标 系,它们分为两类:设备坐标系和逻辑坐标系。除以下三种设备坐标 系外,其余的均为逻辑坐标系: (1) 屏幕坐标系:使用整个屏幕作为坐标区域。 (2) 窗口坐标系:使用包括边界在内的整个应用程序窗口作为坐标区域。 (3) 用户区坐标系:只使用窗口中的用户区作为坐标区域,不包括边界 及菜Байду номын сангаас栏和滚动条等。
WINDOWS图像编程
![WINDOWS图像编程](https://img.taocdn.com/s3/m/52b80baad1f34693daef3e53.png)
WINDOWS图像编程[ 主页 ][上一层]图形设备接口(GDI,Graphics Device Interface)的主要目标之一是支持在输出设备(如视频显示器、打印机和绘图仪)上的与设备无关的图形。
GDI通过将应用程序与不同输出设备特性相隔离,使Windows应用程序能够毫无问题地在Windows支持的任何图形输出设备上运行。
Windows中的图形基本上是由从GDI.EXE模块中输出的函数处理的(尽管一些绘制函数实际上具有USER.EXE的入口点),GDI.EXE模块调用在不同驱动程序文件中的例程,其中有一个.DRV驱动程序文件用于控制显示屏幕,并且可能有一个或多个其他的.DRV驱动程序文件用来控制打印机或绘图仪。
Windows GDI使用两种坐标系统。
使用虚拟坐标系统可以使程序不依赖于具体的硬件,使用设备坐标系统可以使程序和硬件紧密相联。
GDI含有在Windows应用程序内部执行、且与设备无关的图形操作函数,这些函数可产生各种各样的线、正文和位图,它们可以输出到许多不同的输出设备上。
GDI允许一个应用程序产生笔、刷子、字体和位图,以供特定的输出操作使用。
下面列出GDI中几组比较常用的函数:·设备上下文函数·椭圆和多边形函数·绘图工具函数·位图函数·绘图属性函数·正文函救·映射函数。
·坐标函数·元文件(metafile)函数·区域函数·裁剪(clipping)函数·窗口应用程序输出图形的操作步骤如下:①取得指定窗口的当前显示设备上下丈,显示设备上下文实际上是一个数据结构,它包括该窗口的参数及各种图形、文字属性的现行设定值,它们对以后的图形、文字输出命令起控制作用。
②选择用户坐标系及映射方式。
③设定用户坐标系中的观察窗口和设备坐标系中的显示视区。
④输出图形、文字和图象。
⑤释放所使用的显示设备上下文。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SetWindowOrgEx函数的原形为: BOOL SetWindowOrgEx ( HDC hdc, int X,Y, //以逻辑单位表示的窗口原点坐标 LPPOINT lpPoint //函数调用前原点坐标的POINT结构的地址 );
二、绘图工具与颜色
1. 画笔
画笔的操作
创建画笔 将画笔选入设备环境 删除画笔
3. 颜色
Windows使用宏RGB定义绘图的颜色,其形式为: RGB(nRed, nGreen,nBlue) 蓝色值 RGB(0,0,255) 绿色值 RGB(0,255,0) 红色值 RGB(255,0,0)
三、 常用绘图函数
1.设置画笔当前位置的函数MoveToEx, BOOL MoveToEx (HDC hdc, int X,Y, // X、Y分别为新位置的逻辑坐标 LPPOINT lpPoint //存放原画笔位置的POINT结构地址 )
创建画笔后,必须调用SelectObject函数将其选入设备环境。 SelectObject(hdc,hP); //hP为所创建或获取的画笔句柄 不再使用当前画笔时,需删除画笔,以免占内存 DeleteObject(hP);
2. 画刷 画刷的创建与应用与画笔很相似,操作画刷也包括创建、选入设 备环境和删除。 (1) 画刷的创建 使用画刷需事先定义一个画刷句柄。形式如下: HBRUSH hBr; //hBr为画刷句柄 然后调用函数GetStockObject获取Windows系统提供的7种画刷 hBr=(HBRUSH)GetStockObject(nBrushStyle)画刷样式 BLACK_BRUSH DKGRAY_BRUSH GRAY_BRUSH HOLLOW_BRUSH LTGRAY_BRUSH NULL_BRUSH WHITE_BRUSH 黑色画刷 深灰色画刷 灰色画刷 虚画刷 亮灰色画刷 空画刷 白色画刷
第3讲 Windows的图形设备接口及windows绘图
Windows图形设备接口(GDI)是为与设备无关的图形 设计的。所谓设备的无关性,就是操作系统屏蔽了硬件设 备的差异,因而设备无关性能使用户编程时无需考虑特殊 的硬件设置 一、图形设备按口(GDI)
GDI负责系统与用户或绘图程序之间的信息交换,并控制在输出设 备上显示图形或文字, 是Windows系统的重要组成部分 windows 利用GDI和 windows设 备驱动程序 开发人员只要建 立与输出设备的 关联,让系统加 载相应的设备驱 动程序即可
(x1,y1)
(x4,y4)
(x3,y3)
(x2,y2)
5. 绘制饼图,并用当前画刷进行填充 BOOL Pie ( HDC hdc, int X1,intY1, //边框矩形左上角的逻辑坐标 int X2,int Y2, //边框矩形右下角的逻辑坐标 int X3,int Y3, //椭圆弧起始经线的确定点坐标 int X4,int Y4 //椭圆弧终止经线的确定点坐标 )
HS_BDIAGONAL 45度从左上到右下 HS_DIAGCROSS 45度叉线 HS_FDIAGONAL 45度从左下到右上 HS_CROSS 垂直相交的阴影线 HS_HORIZONTAL 水平阴影线 HS_VERTICAL 垂直阴影线
(2) 选入设备环境 创建画刷后, 通过SelectObject(hdc,hBr);将其选入设备环境 (3) 删除画刷 不使用画刷时,可用DeleteObject(hBr);删除画刷,释放内存
3. 获取设备环境的方法
获取设备环境是应用程序输出图形的先决条件,常用的两种方法是调 用函数BeginPaint或GetDC (1) 调用BeginPaint函数 应用程序响应WM_PAINT消息进行图形刷新时,主要通过调用 BeginPaint函数获取设备环境 hdc=BeginPaint(hwnd,&ps); //ps为PAINTSTRUCT类型结构 定义方式为:PAINTSTRUCT ps; 系统获取设备环境的 同时填写ps结构,以 标识无效矩形区
(1) 画笔的创建 使用画笔之前必须事先定义一个画笔句柄。形式如下: HPEN hPen; 然后调用函数GetStockObject获取Windows系统定义的四种画笔例如 获取画笔BLACK_PEN的形式如下: hPen=(HPEN)GetStockObject(BLACK_PEN); WHITE_PEN BLACK_PEN DC_PEN NULL_PEN
2. 从当前位置向指定坐标点画直线的函数LineToEx, BOOL LineToEx(HDC hdc,int X,int Y) // X和Y为线段的终点坐标 3. 从当前位置开始,依次用线段连接lpPoints中指定的各点 BOOL Polyline ( HDC hdc, LPPOINT lpPoints, //指向包含各点坐标的POINT结构数组的指针 int nCount // nCount为POINT数组中点的个数 )
使用环境 操作区域 释放设备环 境所用函数
4. 映像模式 映像模式定义了将逻辑单位转化为设备的度量单位以及设备 的x方向和y方向,程序员可在一个统一的逻辑坐标系中操作而不必 考虑输出设备的坐标系情况
窗口:对应逻辑坐标系上程序员设定的区域
视口:对应实际输出设备上程序员设定的区域
窗口和视口
如何映射?
逻辑坐标系统 坐标 系统 设备坐标系统
MM_ANISOTROPIC
将窗口中的对称 图形映射到视口 时仍为对称图形 缺省的映射模式
MM_HIENGLISH MM_HIMETRIC MM_ISOTROPIC MM_LOENGLISH MM_LOMETRIC MM_TEXT MM_TWIPS
应用程序可获取设备环境的当前映像模式,并根据需要设置映 像模式。
的属性执行
2.图形刷新
图形刷新是绘图过程中必须考虑的重要问题
包括
(1) 刷新请求
刷新请求 对刷新请求的响应 刷新方法
窗口大小的调整 窗口移动 被覆盖后的恢复
应用程序在窗口中 绘制了一个椭圆, 颜色列表框覆盖了 椭圆的一部分
关闭颜色选框后, 应用程序需要恢 复被覆盖部分的 颜色和形状
(2) 系统对刷新请求的响应
相关 函数
设置设备环境的映像模式 SetMapMode(hdc,nMapMode); nMapMode为映像模式的整型标识符 获取当前设备环境的映像模式 nMapMode=GetMapMode(hdc);
窗口区域的定义由SetWindowExtEx函数完成,其函数原型形为: BOOL SetWindowExtEx ( HDC hdc, int nHeight,nWidth, //以逻辑单位表示的窗口区域高宽度 LPSIZE lpSize, //函数调用前窗口区域尺寸的SIZE结构地址 ); 视口区域的定义由SetViewportExtEx函数完成,函数原型为: BOOL SetViewportExtEx ( HDC hdc, int nHeight,nWidth,//以物理设备单位表示的新视口区域高宽度 LPSIZE lpSize 只有在映射模式为 );
(2) 创建新画笔,形式如下:
hPen=CreatePen ( int nPenStyle, //确定画笔样式 int nWidth, //画笔宽度 COLORREF rgbColor //画笔颜划线 PS_DASHDOTDOT:双点划线 PS_DOT: 点线 PS_INSIDEFRAME:实线 PS_NULL: 无 PS_SOLID: 实线
作用是标识无效矩形,它包含了无效 矩形的左上角和右下角的坐标
(3) 有效的刷新方法
记录事件。刷新时 重新执行这个曾经 发生的事件
常用的windows 应用程序刷新窗 口的方法 重新绘制。将图形绘 制处理程序放在消息 WM_PAINT响应模 块中,刷新时重绘图 形
保存副本。刷 新时将副本拷 贝到相应的窗 口中
由BeginPaint函数获取的设备环境要用EndPaint函数释放 BOOL EndPaint(HWND hwnd, PAINTSTRUCT &ps)
(2) 调用GetDC函数 如果绘图工作并非由WM_PAINT消息驱动,则调用GetDC函数 获取设备环境。 hdc=GetDC(hwnd);
由GetDC函数获取的设备环境必须用ReleaseDC函数释放 void ReleaseDC(HWND hwnd);
4. 绘制椭圆弧线的函数Arc, BOOL Arc ( HDC hdc, int X1,intY1, //边框矩形左上角的逻辑坐标 int X2,int Y2, //边框矩形右下角的逻辑坐标 int X3,int Y3, //椭圆弧起始点坐标 int X4,int Y4 //椭圆弧终止点坐标 )
所画曲线
指定颜色画 刷如何获得?
可调用函数CreateSolidBrush和CreateHatchBrush创建画刷,
创建具有 指定颜色 的单色画刷 创建指定阴 影图案和颜 色的画刷
hBr=CreateSolidBrush(rgbColor); hBr=CreateHatchBrush (int nHctchStyle, COLORREF rgbColor );
MM_ANISOTROPIC 和MM_ISOTROPIC 时才有意义
视口的缺省原点和窗口的缺省原点均为(0,0)。可通过调用函数 SetViewportOrgEx和SetWindowOrgEx设定窗口与视口的原点。 只有在映射模式为 MM_ANISOTROPIC 和MM_ISOTROPIC 时才有意义
BeginPaint 与 GetDC 的区别
项目
函数
BeginPaint 函数 只 用于 图形刷 新时 获 取设备环境 使用 BeginPaint 函数 获取设备环境后, 操作 区域为无效区域 由 EndPaint 函数释放
GetDc 函数 使用较为广泛 使用 GetDC 函数获 取设备环境后,操作 区域为整个用户区 由 ReleaseDC 函数释 放