Windows中有关GDI层
1. 画点相关的。
SetPixel函数在指定的x,y坐标以特定的颜色设置象素
SetPixel(hdc, x, y, color)
GetPixel函数返回指定坐标处的象素颜色
Color = GetPixel(hdc, x, y)
2. 画线
Windows 可以画直线椭圆线和贝塞尔样条
LineTo 画直线
PolyLine和PolyLineTo 画多组相连的线
Arc 画椭圆线
函数原型是Arc(const CRect &rect, int xStart,int yStart, int xEnd, int yEnd)
PolyBezier和PolyBezierTo画贝塞尔样条
ArcTo 和AngleArc画椭圆线
设备描述表(DC)的5个属性影响着这些函数画线的外观:
当前画笔的位置
画笔
背景方式
背景色
绘图模式
3. 填充区域
Windows 中有7个用来画带边缘的填充图形的函数
Rectangle 直角矩形
Ellipse 椭圆
RoundRect 圆角矩形
Chord 椭圆周上的扇形
Pie椭圆周上的扇形
以上两个函数的区别是函数Pie画扇形的时候要经过椭圆的中心,而Chord画椭圆的时候直接链接弧的开始坐标和结束坐标所形成的扇形,函数的原型如下:
Pie(const CRect &rect, int xStart, int yStart, int xEnd, int yEnd)
Chord(const CRect &rect, int xStart, int yStart, int xEnd, int yEnd)
Polygon 多边形
PolyPolygon 多个多边形
绘制方式:Windows 中使用DC中的当前画笔来画图形的边界框,边界框还使用背景色,当前背景方式和绘制方式。图形以DC中选择的画刷来填充。
多边形填充的方式一般有两种ALTERNATE和WINDING,其中ALTERNATE的方式使用就在多边形填充的时候使用标准的扫描转换可以得到,至于另外一个属性据说也是同一个算法可以得到,但是我还不清楚。
画刷是一个8x8的位图
常用情况下区域的背景使用画刷就足够了,但是有些情况下除了画刷还要使用另外一种画刷,叫做影线画刷。Windows中使用函数CreateHatchBrush()来创建。
它提供了6中不同的影线画刷。
l 水平影线
l 垂直影线
l 交叉影线(同时具有水平影线和垂直影线功能。
l 左倾斜影线
l 右倾斜影线
l 交叉斜影线(有左斜影线和右斜影线合成)
4. 设备坐标和逻辑坐标
Windows对所有的消息都是使用设备坐标,而不像DC 中一样使用逻辑坐标
Windows将GDI函数中指定的逻辑坐标映射成设备坐标,因此在GDI函数中一些参数往往都是逻辑坐标。
整窗口坐标:以程序整个窗口为基准,如标题栏,菜单,滚动条和窗口边框都包括在内。
客户区坐标:点(0,0)就是客户区的左上角,当使用GetDC获取设备描述表的时候GDI函数中的逻辑坐标就会转换成客户去坐标。
用函数ClientToScreen或ScreenToClient可以将客户区坐标转换为屏幕坐标,或者反过来将屏幕坐标转换为客户去坐标。
5. 窗口和视口的区别
视口:是基于设备坐标的,通常和客户区相同
窗口:机遇逻辑坐标的
6. 矩形和区域裁剪,区域就是屏幕上的一块地方,他是矩形,多边形和椭圆的组合。
FillRect(hdc, &rect, hBrush);
FrameRect(hdc, &rect, hBrush);
invertRect(hdc, &rect)
FillRect用指定的画刷来填充矩形,该函数不需要先将画刷选进DC。
FrameRect使用画刷来画矩形框,但不填充。
InverRect将巨型中的象素翻转。
7. 创建和绘制区域
通过将区域选进设备描述表,就可以用区域来进行裁剪。
CreateRectRgn(&rect)
CrecteEllipticRgn(&rect);
CreatePolygonRgn(&point, &iCount, iPolyFillMode);
区域的操作
CombineRgn(hDestRgn, hSrcRgn1, hSrcRgn2, iCombine);
iCombine参数说明了hSrcRgn1和hSrcRgn2如何组合
RGN_AND 两个区域的公共部分
RGN_OR 两个区域的全部
RGN_XOR 两个区域的全部去掉公共部分
RGN_DIFF hSrcRgn1不在hSrcRgn2中的部分
RGN_COPY hSrcRgn1的全部。