zoukankan      html  css  js  c++  java
  • 29、Windows API GDI(1)

        GDIGraphics Device Interface(图形设备接口)的简称,当Windows应用程序需要显示点、线、图像、文字等内容,在显示器或打印输入这些内容时,就需要使用到GDI。图形设备接口是Windows图形界面的基础。应用程序当然不能直接操作系统的硬件,比如显卡,GDI就为应用程序提供了相关的接口。

        GDI不是可以实现这种功能的唯一程序设计接口,GDI只是其中最基本的。除了GDI外,还有GDI+OpenGLDirectXWindows Image Acquisition等可以实现类似或更高级的功能。

    1Windows GDI的功能

        简单列举,GDI包括如下一些功能。

    ◇获取输出设备的输出,可以截获当前显示器显示的内容,包括整个屏幕、指定窗口或其他任意部分。

    ◇控制显示器的输出内容,在显示器的指定位置输出指定的内容。应用程序可以指定输出的位置、颜色、大小、区域。

    ◇可以以点、线条(直线、曲线)、图形、位图、文字等方式输出。

    ◇可指定输出内容的颜色、大小、位置。

    ◇可将输出内容进行变形、变色、字体的处理等。

    2、一些基本概念

    1DC(设备上下文,Device Contexts)GDI程序设计中最基本的概念。DC是一种对象,设定了图形输出的特性与属性。系统中可以具有多个DC,每一个DC都有一个与之对应的关联设备,有一系列的图形对象,还包括图形模式。

    2)设备上下文类型与关联设备

        一个DC所关联的设备驱动决定了通过此DC进行的图形输出操作(文字输出、绘制、填充等)会被哪个设备(包括显示器、打印机、绘图仪)或设备的子区域(窗口客户端等)所接收。

        每一个DC都必须关联到一个特定的图像输出设备,这些设备可以是真实存在的物理设备,包括显示器、打印机、绘图仪等,也可以是虚拟的设备。比如一个DC关联到了VGA屏幕(显示器),那么所有通过这个DC进行的图形输出操作,都会在上显示器上显示出来。

        DC也可以只是设备全部输出范围的一部分。比如界面上某个窗口的客户区也可以有DC与之对应,对这样的DC进行操作只会影响到窗口客户区。

        设备上下文还具有4种类型,分别是“显示”、“打印机”、“内存”、“信息”。

        显示类型DC关联到了显示设备,所有的图像输出操作将直接反映在显示器上。“打印机”DC类型的绘制操作将反映在打印机上;对“内存”类型的DC的绘制操作将所有操作结果反映到内存数据中,不会有输出显示。而“信息”类型的DC可以用于获取DC的相关信息和属性等数据。

        应用程序在进行图像输出时,只需要关心DC的类型,如果需要将图像输出到特定的设备只需创建相应类型的DC即可。而对不同类型的DC的操作方式都是统一的,应用程序不需要关注设备硬件的异同,无论哪种设备数据接口、哪种通信数据的格式等都是同样的处理,GDI的接口都是相同的。

    3)图形对象的作用及与DC的关系

        一个DC中还包括了一系列的图形对象,所谓图形对象会影响到对DC的输出操作的结果。

        比如TextOut函数就是一种输出操作,这种操作会将文字显示在DC所关联的设备上,那么“字体”这种图形对象就决定了输出的文字的形式,包括具体字的形状、大小、颜色等。

        再比如LineTo函数也是一种输出操作,这种操作会在指定的DC所关联的设备上绘制出直线,而“画笔”这种图形对象就决定了所输出线条的颜色、粗细、虚实、线头形状等。

    wps_clip_image-1811

    应用程序可以创建新的图形对象,比如使用CreatePen创建画笔对象。

    当一个应用程序创建一个DC时,系统会为DC创建默认的图形对象(路径和位图除外)。

        为DC设置当前对象最重要的API函数是SelectObjectSelectObject函数的功能是将对象“选择入”DC,使对象成为DC当前的对象,并替换原有对象。

    Device Contexts[2]

    4)相关的API

    SelectObject[3]

    5)常备(Stock)图形对象

    GDI已经将一些常用的图形对象作为常备图形对象。通过调用API函数GetStockObject来获得常备图形对象的句柄。

    6)各类图形对象的具体属性与作用

    1)位图( bitmap)

        位图是一种图形对象(Graphical Object),是用于表示图像(images)的数据和结构。程序使用位图来操作和管理图像。

        位图数据包括3个部分。

        第一个部分是一个位图信息头,用于说明分辨率、长度与宽度(像素)、表示一个像素点所使用的数据大小(8位、16位、24位等),一般是BITMAPINFOHEADER类型的结构。

        第二个部分是可选的调色信息,一般是RGBQUAD类型的结构或一组RGBTRIPLE类型的数据。

        第三部分是各个像素点的颜色表示,表示一个像素点的颜色有多种长度的数据。比如如果使用4位表示一个像素,那么可以有16种颜色,如果使用16位数据表示一个像素点,那么可以有65 536种颜色。

        位图数据的这3个部分依次保存在内存中。如果将内存中的位图数据保存为文件,那么还需要在第一个部分之前增加位图文件头。

    2)画笔刷( Brush)

        应用程序可以使用画笔刷绘制各种形状的图形、线条、阴影等。

    画笔刷又分为逻辑画笔刷和物理画笔刷,逻辑画笔刷可以绘制各种形状,而物理画笔刷是基于逻辑画笔刷的位图。

    3)字体( Font)

        字体包括3个方面,一是字体图样(Typeface),即表示一个字所使用的像素点阵;二是样式(Style),包括粗、细、加黑等;三是尺寸,以像素点为单位。

    4)路径( Path)

        PathGDI中用于表示任意的形状。

        Path可以是“填充的”(filled)、“边沿勾勒的”(outlined)。分别可以使用不同的颜色来填充其内部,勾勒其边沿。Path在被创建后可以填充、勾勒、变形、裁减(Clip),还可以转换为“区域”(Regions)

    5)画笔( Pens)

        “画笔”可以在界面上绘制出线条。所绘制的线条可以是直线、手绘线和各种函数曲线。

        GDI程序中的画笔分为两种,一种是装饰画笔(Cosmetic Pens),另一种是几何画笔(Geometric Pens)

        装饰画笔:是设备单元,较快,不受坐标空间变化的影响,所绘制的线条宽度一定,只具有宽度、样式和颜色3种属性。

        几何画笔:是几何单元,较慢,受到坐标空间变化的影响,具有多种属性。

        画笔还具有属性,包括宽度、样式、颜色、模式(Pattein)、影线(Hatch)、线端(End Cap)、结合方式(join)等。

    样式表示了画笔所绘制的线条可以是实线,短横虚线、点虚线、短横一点虚线、短横--点虚线等。

    画笔具有阴影( Hatch)、实心(Solid)(Hollow)、自定义等模式。当使用LineTo等函数在DC上输入线条时,线条的样式由DC当前的画笔对象定义。

    6)区域( Regions)

        区域表示了DC中的特定位置和范围,可以是矩形、多边形、椭圆及其组合。

    7)调色板

    调色板定义了DC可以显示的颜色的数量和颜色值。

    7)输出操作

    wps_clip_image-5714

    8)修剪与坐标变换

    修剪与坐标变换是两种重要的操作。

    1)修剪(Clipping)

        修剪是一种限制输出范围和位置的机制。

        修剪通过路径(Paths)和区域(Regions)对输出操作的范围作出限制,对输出的内容进行处理。“修剪区域”和“修剪路径”是两种图形对象,都可以“选择入”DC。分别可以使用规制和不规则图形来对输出的范围作出限制。

        如果在DC选择入了“修剪”图形对象,那么在进行输出操作时,并不是整个DC的范围都有效。所输出的文字、线条、图形等只有位于修剪区之内的才会被输出。

    2)坐标空间及变化

        坐标空间及变化可以使应用程序能够将图像输出进行坐标变换,包括比例变化(放大、缩小)、旋转、扭曲、反转。

        GDI中的坐标空间是一个二维平面空间,使用二维坐标表示。

        坐标空间有4种:worldpage、设备和物理设备(客户区、桌面、打印纸)。

    可以基于坐标空间进行坐标空间的数学变换,以达到变化图形的目的。

    9)设备上下文的图形模式

    所谓DC的图形模式是指在通过DC进行输出操作时所遵循的原则。例如颜色混合的方式、输出出现的方式、输出的尺度等。

    wps_clip_image-13638

    参考

    [1] 精通Windows API 函数、接口、编程实例

    [2] http://msdn.microsoft.com/en-us/library/dd183553%28VS.85%29.aspx

    [3] http://msdn.microsoft.com/en-us/library/dd162957%28VS.85%29.aspx

  • 相关阅读:
    PAT B1045 快速排序 (25 分)
    PAT B1042 字符统计 (20 分)
    PAT B1040 有几个PAT (25 分)
    PAT B1035 插入与归并 (25 分)
    PAT B1034 有理数四则运算 (20 分)
    PAT B1033 旧键盘打字 (20 分)
    HDU 1231 最大连续子序列
    HDU 1166 敌兵布阵
    HDU 1715 大菲波数
    HDU 1016 Prime Ring Problem
  • 原文地址:https://www.cnblogs.com/mydomain/p/1959362.html
Copyright © 2011-2022 走看看