Windows学习笔记9——图形基础<一>
2014-01-06 22:44
190 查看
1、GDI原理
*GDI(Graphics Device Interface)是Windows的子系统,它负责在显示器或者打印机上显示图形。
*Windows98和WindowsNT中的图形主要由GDI32.dll输出的函数来处理。
*这些动态链接库程序调用用户安装的显卡驱动和打印机驱动程序中的函数。
*不同的设备需要不同的驱动程序。
*GDI的主要目的之一是支援与设备无关的图形,GDI通过将应用程序和不同输出设备的特性隔离开来的方法来达到这一目的。
*图形输出设备分为两大类:位元映射设备和向量设备,大多数PC的输出设备是位元映射设备,它们以像素构成的阵列来表示图像,如显示器,点阵打印机,雷射打印机等;向量设备使用线来绘制图像,通常局限于绘图机。
*Windows GDI的局限性,虽然使用GDI可以在显示器上到处移动图形物件,但是GDI通常是一个静态的系统,只有有限的动画支持,如果需要为游戏编写复杂的动画,应该研究一下Microsoft DirectX。
2、GDI函数的分类:
<1>、取得(或建立)和释放(或清除)设备描述表的函数。
如GetDC和ReleaseDC, BeginPaint和EndPaint(尽管在技术上属于USER模块)。
<2>、取得有关设备描述表信息的函数。
如GetTextMetrics函数等。
<3>、绘图函数
如TextOut函数等。
<4>、设定或取得设备描述表参数的函数。
如SetTextColor函数、SetTextAlign函数等
<5>、使用GDI物件的函数。
如CreatePen函数、CreatePenIndirect函数、ExtCreatePen函数等画笔(逻辑画笔),
注意:虽然这些函数是GDI 的一部分,但是和大多数GDI调用不一样,它们不要求设备描述表句柄;
要使用它们就要将它们选进设备描述表中,使用完要释放掉;
除了画笔,GDI还用于建立填充封闭区域的画刷、字体、点阵图以及GDI的其他一些方面。
3、GDI基本图形
<1>、线条
线条是所有向量图形绘制的基础,GDI支持直线、矩形、椭圆(包括圆)、弧线(椭圆圆周一部分)以及贝塞尔曲线。
<2>、填入区域
当一系列直线或者曲线封闭了一个区域时,该区域可以使用目前GDI画刷物件进行填图,这个画刷可以是纯色、图案(可以是一系列的水平、垂直或对角标记)或点阵图像(在区域内垂直或水平重复);
<3>、点阵图
点阵图是位元的矩形阵列,这些位元对应显示设备上的像素,它们是位元映射图形的基础工具,点阵图通常用于显示器或打印机上显示复杂(一般为真实的)图像,还用于显示必须快速绘制的小图像(如图标、鼠标光标、工具条上的按钮等)。GDI支持两种点阵图:旧式的(设备相关)点阵图和新的(设备无关点阵图)。
<4>、文字
4、GDI的其他部分
<1>、映射模式和变换
GDI映射模式允许用户以英寸、毫米或者任何想使用的单位来绘图,WindowsNT还支持坐标变换。
<2>、Metafile
Metafile是以二进制形式存储的GDI命令集合。Metafile主要用于通过剪切板传输向量图形。
<3>、绘图区域
绘图区域是形状任意的复杂区域,通常定义为较简单的绘图区域组合,在GDI内部,绘图区域除了以定义绘图区域的线条组合存储外,还以一系列的扫描线的形式存储。绘图区域可用于绘制轮廓、填入图形和剪切。
<4>、路径
路径是GDI内部存储的直线或曲线的集合。路径可用于绘图、填入图形、剪切,还可以转换为绘图区域。
<5>、剪切
绘图可以限制在显示区域的某一部分中,这就是所谓的剪切。剪切通常是通过区域或路径来定义的。
<6>、调色板
调色板通常由于显示器的限制,只能有256色,Windows保留这些色中的20中供系统使用,用户可以改变其他236种色彩,来准确显示按点阵图形式存储的真实图像。
<7>列印
5、取得设备描述表句柄
常用的取得设备描述表的方法:
BeginPaint 、EndPaint
GetDC 、ReleaseDC
GetWindowDC、ReleaseDC
CreateDC 、 DeleteDC
注:BeginPaint、GetDC、GetWindowDC获得的设备描述表句柄都与显示器上特定的窗口相关。
CreateDC可以为指定名称的设备创建设备描述表句柄
hdc = CreateDC(pszDriver, pszDevice, pszOutput, pData);
可以通过下面的调用获得整个屏幕的设备描述表句柄:
hdc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
此外:获得内存设备描述表可以使用:
hdcMem = CreateCompatiblDC(hdc); / DeleteDC(hdcMem);
获得metafile设备描述表可以使用:
hdcMeta = CreateMetaFile(pszFilename) / hmf = CloseMetaFile(hdcMeta);
6、取得设备描述表信息
一个设备描述表通常是指一个实际显示设备,如显示器或打印机。通常,需要获得有关设备的信息,包括显示器的大小(单位为像素,或实际长度单位) 和色彩显示能力。可以调用GetDeviceCaps函数来获得这些信息。
如: iValue = GetDeviceCaps(hdc, iIndex);
7、设备大小
打印机是以“每英寸的点数(dpi)”表示解析度的;例如大多数雷射打印机有300dpi或600dpi的解析度;
显示器的解析度是以水平和垂直的总像素数来表示的;如1024*768,。
*解析度:每度量单位(一般为英寸)内的像素数;
*像素大小或像素尺寸:表示设备垂直或水平显示的总像素数;
*度量大小或度量尺寸:表示以英寸或毫米为单位的设备显示区域的大小;
*解析度 = 像素大小/度量大小。
*如果设备的水平解析度与垂直解析度相等,就称设备具有“正方形像素”;(大部分Windows使用的显示器都具有正方形像素)
8、关于字母大小
<1>、在传统的排版中,字体的大小由“点”来表示。1点大约1/72英寸;
在电脑排版中,1点正好等于1/72英寸。
在真正的排版中,字体的点值与字体字母的实际大小并不正好相等,毕竟,字体设计是一门艺术而不是科学。
注意:点的概念与像素不同,1点 = 1/72英寸 = 0.35mm;像素的大小则与分辨率的设置有关。
<2>、理论上,字体的点值是从字体中最高的字元顶部到字元底部的距离,其中不包括重音符号。根据TEXTMETRIC结构,字体的点数等于tmHeight-tmInternalLeading。
<3>、TEXTMETRIC结构中tmHeight参数指定的是文字的连续行在屏幕或打印机上的间隔方式,是用点值测量的,表示行距。10点字体使用12点行距(避免连续行贴在一起);
<4>、Windows系统字体的大小,固定假设为10点字体,12点行距。
注意:WIndows的大字体和小字体都是10点字体,那么他们有什么区别?
用户选择大字体或小字体时,实际上是选择了一个假定的显示解析度,单位是每英寸内的点数,当选择小字体时,即要WIndows假定显示器的显示解析度为每英寸96个点,当选择大字体时,为每英寸120个点。因此,当选择小字体时,字体的大小大约为:(10/72)*96,每英寸13图素,使用大字体,(10/72)*120,每英寸16图素。(这里的图素是逻辑像素)。
<5>、在Windows程序中,用索引LOGPIXELSX和LOGPIXELSY,可以从GetDeviceCaps函数获得系统当前的假定解析度(以每英寸的点数为单位,如96dpi,120dpi,而非真实解析度)。
用索引HORZSIZE和VERTSIZE,可以从GetDeviceCaps函数得到实际屏幕宽度和实际屏幕高度(单位为mm),也称“逻辑宽度”和“逻辑高度”,公式如下:
水平大小(mm) = 25.4*(水平解析度<像素>/逻辑像素X<每英寸的点数>)
垂直大小(mm) = 25.4*(垂直解析度<像素>/逻辑像素Y<每英寸的点数>)
注:1英寸 = 25.4mm;
9、关于色彩
<1>、“Full-Color”显示器的解析度是每个像素24位——红、绿、蓝各8位。
“High-Color”显示器的解析度是每个像素16位——红5位,绿6位,蓝5位。绿色多一位是因为人眼对绿色更敏感一些。
“显示256色”的显示器每个像素是8位,这8位元的值一般由定义实际颜色的调色板组织。
<2>、COLORREF,是一个32位元的无符号整数,用来表示一种色彩,通常叫做RGB色彩。
RGB宏定义:
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r) | ((WORD)((BYTE)(g))<<8)) | (((DWORD)(BYTE)(b))<<16)))
10、保存设备描述表的当前属性
通常,在调用GetDC或BeginPaint时,Windows用预设值建立一个新的设备描述表,程序员对设备描述表属性的任何改变,在调用ReleaseDC或EndPaint之后就会丢失。
如果,要在ReleaseDC或者EndPaint之后,保存程序中对设备描述表的属性更改,有两种方法:
<1>、在创建窗口类别时,在“style”成员中加入“CS_OWNDC”标记,这样依据这个窗口类别建立的每个窗口都将拥有自己的设备描述表,它一直存在,直到窗口被删除,然后可以在响应WM_CREATE消息时,初始化设备描述表属性。
<2>、在改变设备描述表属性后,调用SaveDC(hdc)保存设置,使用RestoreDC(hdc, -1)恢复最近保存的状态。
11、WindowsNT支持的画线函数:
LineTo 直线。
Polyline 和 PolylineTo 画一系列相连的直线。
PolyPolyline 画多组相连的线。
Arc 画椭圆线。
PolyBezier 和 PolyBezierTo 贝塞尔曲线。
ArcTo 和 AngleArc 画椭圆线。
PolyDraw 画一系列相连的线以及贝塞尔曲线。
Rectangle 画矩形。
Ellipse 画椭圆。
RoundRect 画带圆角的矩形。
Pie 画椭圆的一部分,使其看起来像一个扇形。
Chord 画椭圆的一部分,以呈弓形
装置内容的五个属性影响著用这些函式所画线的外观: 目前画笔的位置 (仅用於 LineTo、PolylineTo、PolyBezierTo 和 ArcTo )、画笔、背景方式、背景色和绘图模式
*GDI(Graphics Device Interface)是Windows的子系统,它负责在显示器或者打印机上显示图形。
*Windows98和WindowsNT中的图形主要由GDI32.dll输出的函数来处理。
*这些动态链接库程序调用用户安装的显卡驱动和打印机驱动程序中的函数。
*不同的设备需要不同的驱动程序。
*GDI的主要目的之一是支援与设备无关的图形,GDI通过将应用程序和不同输出设备的特性隔离开来的方法来达到这一目的。
*图形输出设备分为两大类:位元映射设备和向量设备,大多数PC的输出设备是位元映射设备,它们以像素构成的阵列来表示图像,如显示器,点阵打印机,雷射打印机等;向量设备使用线来绘制图像,通常局限于绘图机。
*Windows GDI的局限性,虽然使用GDI可以在显示器上到处移动图形物件,但是GDI通常是一个静态的系统,只有有限的动画支持,如果需要为游戏编写复杂的动画,应该研究一下Microsoft DirectX。
2、GDI函数的分类:
<1>、取得(或建立)和释放(或清除)设备描述表的函数。
如GetDC和ReleaseDC, BeginPaint和EndPaint(尽管在技术上属于USER模块)。
<2>、取得有关设备描述表信息的函数。
如GetTextMetrics函数等。
<3>、绘图函数
如TextOut函数等。
<4>、设定或取得设备描述表参数的函数。
如SetTextColor函数、SetTextAlign函数等
<5>、使用GDI物件的函数。
如CreatePen函数、CreatePenIndirect函数、ExtCreatePen函数等画笔(逻辑画笔),
注意:虽然这些函数是GDI 的一部分,但是和大多数GDI调用不一样,它们不要求设备描述表句柄;
要使用它们就要将它们选进设备描述表中,使用完要释放掉;
除了画笔,GDI还用于建立填充封闭区域的画刷、字体、点阵图以及GDI的其他一些方面。
3、GDI基本图形
<1>、线条
线条是所有向量图形绘制的基础,GDI支持直线、矩形、椭圆(包括圆)、弧线(椭圆圆周一部分)以及贝塞尔曲线。
<2>、填入区域
当一系列直线或者曲线封闭了一个区域时,该区域可以使用目前GDI画刷物件进行填图,这个画刷可以是纯色、图案(可以是一系列的水平、垂直或对角标记)或点阵图像(在区域内垂直或水平重复);
<3>、点阵图
点阵图是位元的矩形阵列,这些位元对应显示设备上的像素,它们是位元映射图形的基础工具,点阵图通常用于显示器或打印机上显示复杂(一般为真实的)图像,还用于显示必须快速绘制的小图像(如图标、鼠标光标、工具条上的按钮等)。GDI支持两种点阵图:旧式的(设备相关)点阵图和新的(设备无关点阵图)。
<4>、文字
4、GDI的其他部分
<1>、映射模式和变换
GDI映射模式允许用户以英寸、毫米或者任何想使用的单位来绘图,WindowsNT还支持坐标变换。
<2>、Metafile
Metafile是以二进制形式存储的GDI命令集合。Metafile主要用于通过剪切板传输向量图形。
<3>、绘图区域
绘图区域是形状任意的复杂区域,通常定义为较简单的绘图区域组合,在GDI内部,绘图区域除了以定义绘图区域的线条组合存储外,还以一系列的扫描线的形式存储。绘图区域可用于绘制轮廓、填入图形和剪切。
<4>、路径
路径是GDI内部存储的直线或曲线的集合。路径可用于绘图、填入图形、剪切,还可以转换为绘图区域。
<5>、剪切
绘图可以限制在显示区域的某一部分中,这就是所谓的剪切。剪切通常是通过区域或路径来定义的。
<6>、调色板
调色板通常由于显示器的限制,只能有256色,Windows保留这些色中的20中供系统使用,用户可以改变其他236种色彩,来准确显示按点阵图形式存储的真实图像。
<7>列印
5、取得设备描述表句柄
常用的取得设备描述表的方法:
BeginPaint 、EndPaint
GetDC 、ReleaseDC
GetWindowDC、ReleaseDC
CreateDC 、 DeleteDC
注:BeginPaint、GetDC、GetWindowDC获得的设备描述表句柄都与显示器上特定的窗口相关。
CreateDC可以为指定名称的设备创建设备描述表句柄
hdc = CreateDC(pszDriver, pszDevice, pszOutput, pData);
可以通过下面的调用获得整个屏幕的设备描述表句柄:
hdc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
此外:获得内存设备描述表可以使用:
hdcMem = CreateCompatiblDC(hdc); / DeleteDC(hdcMem);
获得metafile设备描述表可以使用:
hdcMeta = CreateMetaFile(pszFilename) / hmf = CloseMetaFile(hdcMeta);
6、取得设备描述表信息
一个设备描述表通常是指一个实际显示设备,如显示器或打印机。通常,需要获得有关设备的信息,包括显示器的大小(单位为像素,或实际长度单位) 和色彩显示能力。可以调用GetDeviceCaps函数来获得这些信息。
如: iValue = GetDeviceCaps(hdc, iIndex);
7、设备大小
打印机是以“每英寸的点数(dpi)”表示解析度的;例如大多数雷射打印机有300dpi或600dpi的解析度;
显示器的解析度是以水平和垂直的总像素数来表示的;如1024*768,。
*解析度:每度量单位(一般为英寸)内的像素数;
*像素大小或像素尺寸:表示设备垂直或水平显示的总像素数;
*度量大小或度量尺寸:表示以英寸或毫米为单位的设备显示区域的大小;
*解析度 = 像素大小/度量大小。
*如果设备的水平解析度与垂直解析度相等,就称设备具有“正方形像素”;(大部分Windows使用的显示器都具有正方形像素)
8、关于字母大小
<1>、在传统的排版中,字体的大小由“点”来表示。1点大约1/72英寸;
在电脑排版中,1点正好等于1/72英寸。
在真正的排版中,字体的点值与字体字母的实际大小并不正好相等,毕竟,字体设计是一门艺术而不是科学。
注意:点的概念与像素不同,1点 = 1/72英寸 = 0.35mm;像素的大小则与分辨率的设置有关。
<2>、理论上,字体的点值是从字体中最高的字元顶部到字元底部的距离,其中不包括重音符号。根据TEXTMETRIC结构,字体的点数等于tmHeight-tmInternalLeading。
<3>、TEXTMETRIC结构中tmHeight参数指定的是文字的连续行在屏幕或打印机上的间隔方式,是用点值测量的,表示行距。10点字体使用12点行距(避免连续行贴在一起);
<4>、Windows系统字体的大小,固定假设为10点字体,12点行距。
注意:WIndows的大字体和小字体都是10点字体,那么他们有什么区别?
用户选择大字体或小字体时,实际上是选择了一个假定的显示解析度,单位是每英寸内的点数,当选择小字体时,即要WIndows假定显示器的显示解析度为每英寸96个点,当选择大字体时,为每英寸120个点。因此,当选择小字体时,字体的大小大约为:(10/72)*96,每英寸13图素,使用大字体,(10/72)*120,每英寸16图素。(这里的图素是逻辑像素)。
<5>、在Windows程序中,用索引LOGPIXELSX和LOGPIXELSY,可以从GetDeviceCaps函数获得系统当前的假定解析度(以每英寸的点数为单位,如96dpi,120dpi,而非真实解析度)。
用索引HORZSIZE和VERTSIZE,可以从GetDeviceCaps函数得到实际屏幕宽度和实际屏幕高度(单位为mm),也称“逻辑宽度”和“逻辑高度”,公式如下:
水平大小(mm) = 25.4*(水平解析度<像素>/逻辑像素X<每英寸的点数>)
垂直大小(mm) = 25.4*(垂直解析度<像素>/逻辑像素Y<每英寸的点数>)
注:1英寸 = 25.4mm;
9、关于色彩
<1>、“Full-Color”显示器的解析度是每个像素24位——红、绿、蓝各8位。
“High-Color”显示器的解析度是每个像素16位——红5位,绿6位,蓝5位。绿色多一位是因为人眼对绿色更敏感一些。
“显示256色”的显示器每个像素是8位,这8位元的值一般由定义实际颜色的调色板组织。
<2>、COLORREF,是一个32位元的无符号整数,用来表示一种色彩,通常叫做RGB色彩。
RGB宏定义:
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r) | ((WORD)((BYTE)(g))<<8)) | (((DWORD)(BYTE)(b))<<16)))
10、保存设备描述表的当前属性
通常,在调用GetDC或BeginPaint时,Windows用预设值建立一个新的设备描述表,程序员对设备描述表属性的任何改变,在调用ReleaseDC或EndPaint之后就会丢失。
如果,要在ReleaseDC或者EndPaint之后,保存程序中对设备描述表的属性更改,有两种方法:
<1>、在创建窗口类别时,在“style”成员中加入“CS_OWNDC”标记,这样依据这个窗口类别建立的每个窗口都将拥有自己的设备描述表,它一直存在,直到窗口被删除,然后可以在响应WM_CREATE消息时,初始化设备描述表属性。
<2>、在改变设备描述表属性后,调用SaveDC(hdc)保存设置,使用RestoreDC(hdc, -1)恢复最近保存的状态。
11、WindowsNT支持的画线函数:
LineTo 直线。
Polyline 和 PolylineTo 画一系列相连的直线。
PolyPolyline 画多组相连的线。
Arc 画椭圆线。
PolyBezier 和 PolyBezierTo 贝塞尔曲线。
ArcTo 和 AngleArc 画椭圆线。
PolyDraw 画一系列相连的线以及贝塞尔曲线。
Rectangle 画矩形。
Ellipse 画椭圆。
RoundRect 画带圆角的矩形。
Pie 画椭圆的一部分,使其看起来像一个扇形。
Chord 画椭圆的一部分,以呈弓形
装置内容的五个属性影响著用这些函式所画线的外观: 目前画笔的位置 (仅用於 LineTo、PolylineTo、PolyBezierTo 和 ArcTo )、画笔、背景方式、背景色和绘图模式
相关文章推荐
- Windows学习笔记11——图形基础<三>
- 程序员_Java基础<一>-面向对象上
- 【Linux基础笔记】Linux开机自动启动网卡eth0<一>
- cocos2d-x基础<一> Android环境配置和HelloWorld的运行
- 黑马程序员 Java基础<一>---> java运行环境搭建
- 黑马程序员:基础学习<一>
- Git基础操作<一>
- HTML5学习<一>----HTNL5的基础语法
- <<3D数学基础:图形与游戏开发>>读后感
- Java基础语法<一> 数据类型&运算符
- 计算机网络安全基础之<一>
- java基础<一>
- 【LaTeX排版】LaTeX使用--入门基础<一>
- Windows学习笔记10——图形基础<二>
- Android 编程基础<一>
- 【CSS基础】琐碎记录<一>
- 黑马程序员 Java基础<一>---> 面向对象与类之概述(匿名对象、封装、构造函数、this、静态等)
- 黑马程序员 java基础<一>--其它对象System、Runtime(1)
- 黑马程序员 Java基础<一> 数组及排序
- swift基础知识<一>