手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

WindowsGDI和GDI 编程实例剖析

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
  1.基本概念

  GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interface)的一个重要组成部分。它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作。它的桥梁作用体现在:

  (1)用户通过调用GDI函数将逻辑空间的操作转化为具体针对设备驱动程序的调用。

  为实现图形设备无关性,Windows 的绘图操作在一个设备描述表上进行。用户拥有自己的"逻辑坐标"系统,它独立于实际的物理设备,与"设备坐标"相对应。开发Windows应用程序时,程序员关心的是逻辑坐标,我们在逻辑坐标系上绘图,利用GDI将逻辑窗口映射到物理设备上。

  (2)GDI能检测具体设备的能力,并依据具体的设备以最优方式驱动这些设备,完成真实的显示。

  GDI函数大致可分类为:设备上下文函数(如GetDC、CreateDC、DeleteDC)、 画线函数(如LineTo、Polyline、Arc)、填充画图函数(如Ellipse、FillRect、Pie)、画图属性函数(如SetBkColor、SetBkMode、SetTextColor)、文本、字体函数(如TextOut、GetFontData)、位图函数(如SetPixel、BitBlt、StretchBlt)、坐标函数(如DPtoLP、LPtoDP、ScreenToClient、ClientToScreen)、映射函数(如SetMapMode、SetWindowExtEx、SetViewportExtEx)、元文件函数(如PlayMetaFile、SetWinMetaFileBits)、区域函数(如FillRgn、FrameRgn、InvertRgn)、路径函数(如BeginPath、EndPath、StrokeAndFillPath)、裁剪函数(如SelectClipRgn、SelectClipPath)等。

  GDI虽然使程序员得到了一定程度的解脱,但是其编程方式仍很麻烦。譬如,显示一张位图,程序员需要进行"装入位图―读取位图文件头信息―启用设备场景―调色板变换"等一连串操作。而有了GDI ,这些问题便迎刃而解了。

  顾名思义,GDI 是GDI的增强版。它是微软在Windows 2000以后操作系统中提供的新接口,其通过一套部署为托管代码的类来展现,这套类被称为GDI 的"托管类接口"。GDI 主要提供了以下三类服务:

  (1) 二维矢量图形:GDI 提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类;

  (2) 图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。因此,GDI 为我们提供了Bitmap、Image等类,它们可用于显示、操作和保存BMP、JPG、GIF等图像格式。

  (3) 文字显示:GDI 支持使用各种字体、字号和样式来显示文本。

  GDI接口是基于函数的,而GDI 是基于C 类的对象化的应用程序编程接口,因此使用起来比GDI要方便。

  2.例程简述

  单击此处下载本文例程源代码

  本文后续的讲解都基于这样的一个例子工程(例程的开发环境为Visual C 6.0,操作系统为Windows XP),它是一个基于对话框的MFC应用程序,包括2个父菜单:

  (1) GDI

  GDI父菜单下包括一个子菜单:

ID:IDM_GDI_DRAW_LINE caption:画线

  单击事件:在窗口绘制正旋曲线

  (2) GDI

  DIB位图父菜单下包括两个子菜单:

a. ID:IDM_GDIP_DRAW_LINE caption:画线

  单击事件:在窗口绘制正旋曲线

b. caption:新增功能,其下又包括下列子菜单:

  (ⅰ)ID:IDM_Gradient_Brush caption:渐变画刷

  单击事件:在窗口演示GDI 的渐变画刷功能

  (ⅱ)ID:IDM_Cardinal_Spline caption:基数样条

  单击事件:在窗口演示GDI 的基数样条函数功能

  (ⅲ)ID:IDM_Transformation_Matrix caption:变形和矩阵对象

  单击事件:在窗口演示GDI 的变形和矩阵对象功能

  (ⅳ)ID:IDM_Scalable_Region caption:可伸缩区域

  单击事件:在窗口演示GDI 的可伸缩区域功能

  (ⅴ)ID:IDM_IMAGE caption:图像

  单击事件:在窗口演示GDI 的多种图像格式支持功能

  (ⅵ)ID:IDM_Alpha_Blend caption:Alpha混合

  单击事件:在窗口演示GDI 的Alpha混合功能

  (ⅶ)ID:IDM_TEXT caption:文本

  单击事件:在窗口演示GDI 的强大文本输出能力

  后续篇章将集中在对上述菜单单击事件消息处理函数的讲解,下面的代码是整个对话框类CGdiexampleDlg的消息映射:

BEGIN_MESSAGE_MAP(CGdiexampleDlg, CDialog)
//{{AFX_MSG_MAP(CGdiexampleDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_COMMAND(IDM_GDI_DRAW_LINE, OnGdiDrawLine)
ON_COMMAND(IDM_GDIP_DRAW_LINE, OnGdipDrawLine)
ON_COMMAND(IDM_Gradient_Brush, OnGradientBrush)
ON_COMMAND(IDM_Cardinal_Spline, OnCardinalSpline)
ON_COMMAND(IDM_Transformation_Matrix, OnTransformationMatrix)
ON_COMMAND(IDM_Scalable_Region, OnScalableRegion)
ON_COMMAND(IDM_IMAGE, OnImage)
ON_COMMAND(IDM_Alpha_Blend, OnAlphaBlend)
ON_COMMAND(IDM_TEXT, OnText)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
  3.GDI编程

  "GDI"菜单下的"画线"子菜单单击事件消息处理函数的代码如下:

void CGdiexampleDlg::OnGdiDrawLine()
{
 // TODO: Add your command handler code here
 CClientDC dc(this);
 //逻辑坐标与设备坐标变换
 CRect rect;
 GetClientRect(&rect);
 dc.SetMapMode(MM_ANISOTROPIC);

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS