好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Windows GDI和GDI+编程实例剖析.docx

32页
  • 卖家[上传人]:m****
  • 文档编号:549397591
  • 上传时间:2023-05-06
  • 文档格式:DOCX
  • 文档大小:517.12KB
  • / 32 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • Windows GDI和GDI+编程实例剖析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个父菜单:⑴GDIGDI父菜单下包括一个子菜单:ID: IDM_GDI_DRAW_LINE caption :画线单击事件:在窗口绘制正旋曲线(2) GDI+DIB位图父菜单下包括两个子菜单:a. ID: IDM_GDIP_DRAW_LINE caption :画线单击事件:在窗口绘制正旋曲线b. caption :新增功能,其下又包括下列子菜单:(i )ID: IDM_Gradient_Brush caption :渐变画刷单击事件:在窗口演示GDI+的渐变画刷功能(ii) ID: IDM_Cardinal_Spline caption :基数样条单击事件:在窗口演示GDI+的基数样条函数功能(iii) ID: IDM_Transformation_Matrix caption :变形和矩阵对象单击事件:在窗口演示GDI+的变形和矩阵对象功能(iv) ID: IDM_Scalable_Region caption :可伸缩区域单击事件:在窗口演示GDI+的可伸缩区域功能(v) ID: IDM_IMAGE caption :图像单击事件:在窗口演示GDI+的多种图像格式支持功能(vi) ID: IDM_Alpha_Blend caption : Alpha 混合单击事件:在窗口演示GDI+的Alpha混合功能(vU)ID: IDM_TEXT caption :文本单击事件:在窗口演示GDI+的强大文本输出能力后续篇章将集中在对上述菜单单击事件消息处理函数的讲解,下面的代码是整个对话框类CGdiexampleDIg的消息映射: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_MAPEND_MESSAGE_MAP()3.GDI 编程"GDI"菜单下的"画线"子菜单单击事件消息处理函数的代码如下:void CGdiexampleDlg::OnGdiDrawLine(){// TODO: Add your command handler code hereCClientDC dc(this);//逻辑坐标与设备坐标变换CRect rect;GetClientRect(&rect); dc.SetMapMode(MM_ANISOTROPIC); dc.SetWindowOrg(0, 0);dc.SetWindowExt(rect.right, rect.bottom); dc.SetViewportOrg(0, rect.bottom / 2); dc.SetViewportExt(rect.right, - rect.bottom);//创建绘制正旋曲线的 pen 并将其选入设备上下文CPen pen(PS_SOLID, 1, RGB(255, 0, 0));HGDIOBJ oldObject = dc.SelectObject(pen.GetSafeHandle());//绘制正旋曲线dc.MoveTo(0, 0);for (int i = 0; i < rect.right; i++){dc.LineTo(i, 100 *sin(2 *(i / (rect.right / 5.0)) *PI));}//创建绘制x轴的pen并将其选入设备上下文CPen penx(PS_SOLID, 1, RGB(0, 0, 255));dc.SelectObject(penx.GetSafeHandle());//绘制X轴dc.MoveTo(0, 0);dc.LineTo(rect.right, 0);//恢复原先的pendc.SelectObject(oldObject);单击这个按钮,会出现如图1所示的效果,我们来对此进行解读。

      图1绘制正旋曲线前文提到,GDI编程需进行设备坐标和逻辑坐标的转化而屏幕上的 设备坐标通常会按客户坐标给出,客户坐标依赖于窗口的客户区域,其起 始位置位于客户区域的左上角为示区别,图2给出了设备坐标和用户逻 辑坐标的示例增加方向0)増 加向増 加75向(% 0)増加方向•hmri I ■ ■ ■ I ■ I — 逻理旦?pus图2设备坐标与逻辑坐标设备坐标与逻辑坐标的转换关系如下:公式中的 是设备空间中视口的原点,而 < Xworg, Yworg >是逻辑空间中窗口的原点 Xwext/Xvext 和 Ywext/Yvext 分别是 窗口与视口水平和垂直范围的比例因此,经过程序中的 dc.SetWindowOrg (0 ,0) 和 dc.SetViewportOrg(0, rect.bottom/2)语句我们设置了视口和窗口的原点;而经过程序中的dc.SetWindowExt (rect.right , rect.bottom) 和 dc.SetViewportExt (rect.right, -rect.bottom) 语句我们设置了视口和窗口的范围由于视口和 窗口的纵坐标方向相反,设置视口的垂直范围为负值。

      这样我们得到了一 个逻辑坐标原点为客户区水平方向最左边和垂直方向居中的坐标系,我们 在这个坐标系上直接绘制正旋曲线,不需要再理睬 Windows 对话框客户 区坐标了void CGdiexampleDlg::OnGdiDrawLine() 函数中未指定逻辑设备和物理设备的映射模式,则为缺省的MM_TEXT在这种模式下,一个逻辑 单位对应于一个像素点映射模式是GDI中的一个重要概念,其它的映射 模式还有 MM_LOENGLlSH、MM_HIENGLISH 、MM_LOMETRIC 和 MM_HIMETRIC 等我们可以通过如下语句指定映射模式为 MM_TEXT: dc.SetMapMode(MM_TEXT);值得一提的是,从上述代码可以看出:在 GDI 编程中,几乎所有的操 作都围绕设备上下文 dc 展开的确,这正是 GDI 编程的特点!设备上下文是 Windows 使用的一种结构,所有 GDI 操作前都需取得特定设备的上下文,函数中的 CClientDC dc (this) 语句完成这一功能 归纳可得,利用 GDI 进行图形、图像处理的一般操作步骤为 1. 取得指定窗口的 DC;2. 确定使用的坐标系及映射方式;3. 进行图形、图像或文字处理;4. 释放所使用的 DC。

      4.GDI+编程"GDI+"菜单下的"画线"子菜单单击事件消息处理函数的代码如下:void CGdiexampleDlg::OnGdipDrawLine(){// TODO: Add your command handler code here。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.