`
hu_jiacheng
  • 浏览: 28221 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
博客专栏
Dfa6e97f-cd26-3ff8-984a-cafab311103b
Windows编程通俗演义...
浏览量:21488
文章分类
社区版块
存档分类
最新评论

Windows编程 第八回 绘图课(下)

阅读更多

书接上回,我们先来看一个例子吧,我们画了一个矩形和一个圆:

caseWM_PAINT:

HDChDC;

PAINTSTRUCTps;

hDC=BeginPaint(hwnd,&ps);

Rectangle(hDC,50,50,200,200);

Ellipse(hDC,100,100,300,300);

Ellipse(hDC,400,100,600,300);

Rectangle(hDC,350,50,500,200);

EndPaint(hwnd,&ps);

break;

你会感到奇怪,这两个函数画出的图形怎么会相互遮盖呢?或许你猜出了原因了,这两个函数不是单纯地画“边框”,其内部还被白色的背景填充着,让它们可以相互遮挡而不是“透明”的。像前面讲过的Rectangle、Ellipse、RoundRect、Chord、Pie和本回要讲的Polygon、PolyPolygon这些画带边界框的填充图形函数都是这样的。

认识画刷

在Windows中图形是以当前设备描述表选中的画刷来填充的。默认情况下,使用现有的白色画刷,这意味着图形内部将画为白色。Windows预定义了六种现有画刷:WHITE_BRUSH、LTGRAY_BRUSH、GRAY_BRUSH、DKGRAY_BRUSH、BLACK_BRUSH和NULL_BRUSH (也叫HOLLOW_BRUSH),大家看名字就应该知道它们代表什么颜色了吧。你可以将任何一种现有画刷选入你的设备描述表中,就和你选择一种画笔一样。

Windows用HBRUSH定义画刷句柄,可以像这样定义一个画刷句柄变量:

HBRUSH hBrush;

你可以通过调用GetStockObject来取得GRAY_BRUSH的句柄:

hBrush = (HBRUSH) GetStockObject (GRAY_BRUSH) ;//这里需要强制类型转换

你可以调用SelectObject将它选进设备描述表:

SelectObject (hdc, hBrush) ;

现在,如果你要用上面的提到的任意一个函数画图,则图形内部将为灰色。

如果您想画一个没有边界框的图形,可以将NULL_PEN选进设备描述表:

SelectObject (hdc,(HBRUSH) GetStockObject (NULL_PEN)) ;
上一回我曾提到过NULL_PEN有啥用?我估计这可能就是它的一个用途吧。

如果您想画出图形的边界框,但不填入内部,则将NULL_BRUSH选进设备内容:

SelectObject (hdc, (HBRUSH) GetStockobject (NULL_BRUSH) ;
大家看到此,应该想出画不互相遮盖的图形了吧:
               case WM_PAINT:
               HDC hDC;
 PAINTSTRUCT ps;
 hDC=BeginPaint(hwnd,&ps);

SelectObject(hDC, (HBRUSH) GetStockObject (NULL_BRUSH) ;

Rectangle(hDC,50,50,200,200);

Ellipse(hDC,100,100,300,300);

Ellipse(hDC,400,100,600,300);

Rectangle(hDC,350,50,500,200);

 EndPaint(hwnd,&ps);
 break;

再认识画刷

我们除了可以使用以上的现有画刷,还可以创建自己的画刷,就如同上回我们创建自己的画笔一样。而且过程也是类似的:

首先创建逻辑画刷,这里Windows为我们提供了几个函数可供使用;

然后使用SelectObject把画刷选进设备描述表

绘图函数绘图;

最后在释放设备描述表(或者在选择了另一种画刷到设备内容中)之后,就可以调用DeleteObject来删除画刷了。

接着我们就来看一下这几个创建画刷的函数吧。

下面是建立逻辑画刷的第一个函数:

hBrush = CreateSolidBrush (crColor) ;

函数中crColor为COLORREF类型,指定画刷颜色。

你还可以使用由水平、垂直或者倾斜的线组成的“影线标记(hatch marks)”来创建画刷,这种风格的画刷对着色条形图的内部和在绘图仪上进行绘图最有用。创建影线画刷的函数为:

hBrush = CreateHatchBrush (iHatchStyle, crColor) ;

iHatchStyle参数描述影线标记的外观。下图显示了六种可用的影线标记风格。


CreateHatchBrush中的crColor参数是影线的色彩。

你还可以使用这个函数创建逻辑画刷:

hBrush = CreateBrushIndirect (&logbrush) ;

变量logbrush是一个类型为LOGBRUSH(“逻辑画刷”)的结构,该结构的三个字段如表5-4所示,lbStyle字段的值确定了Windows如何解释其它两个字段的值:

lbStyle (UINT)

lbColor (COLORREF)

lbHatch (LONG)

BS_SOLID

画刷的色彩

忽略

BS_HOLLOW

忽略

忽略

BS_HATCHED

影线的色彩

影线画刷风格

BS_PATTERN

忽略

位图的句柄

BS_DIBPATTERNPT

忽略

指向DIB的指标

上一回我们用SelectObject将逻辑画笔选进设备描述表,用DeleteObject删除画笔,用GetObject来取得逻辑画笔的信息。对于画刷,同样能使用这三个函数。

一旦你取得到了画刷句柄,就可以使用SelectObject将该画刷选进设备描述表:

SelectObject (hdc, hBrush) ;

然后,你可以使用DeleteObject函数删除所建立的画刷:

DeleteObject (hBrush) ;

但是,不要删除目前选进设备描述表内的画刷。

如果您需要取得画刷的信息,可以调用GetObject:

GetObject (hBrush, sizeof (LOGBRUSH), (LPVOID) &logbrush) ;

其中,logbrush是一个类型为LOGBRUSH的结构。

Polygon函数和多边形填充

我们好像还有两个函数没有讲,趁我还没有忘记,赶紧把它讲完吧。

Polygon函数也是一个画带边界框的填充图形函数,它的调用与Polyline函数相似:

Polygon (hdc, apt, iCount) ;
 

其中,apt参数是POINT结构的一个数组,iCount是点的数目。如果该数组中的最后一个点与第一个点不同,则Windows将会再加一条线,将最后一个点与第一个点连起来(在Polyline函数中,Windows不会这么做)。

PolyPolygon函数如下所示:

PolyPolygon (hdc, apt, aiCounts, iPolyCount) ; 

该函数绘制多个多边形。最后一个参数给出了所画的多边形的个数。对于每个多边形,aiCounts数组给出了多边形的端点数。apt数组具有全部多边形的所有点。除返回值以外,PolyPolygon在功能上与下面的代码相同:

for (i = 0, iAccum = 0 ; i < iPolyCount ; i++)
{
 Polygon (hdc, apt + iAccum, aiCounts[i]) ;
 iAccum += aiCounts[i] ;
}

对于Polygon和PolyPolygon函数,Windows使用定义在设备描述表中的当前画刷来填充这个带边界的区域。至于填充内部的方式,则取决于多边形填充方式,你可以用SetPolyFillMode函数来设定:

SetPolyFillMode (hdc, iMode) ;

默认情况下,多边形填入方式是ALTERNATE,但是您可以将它设定为WINDING。

对于ALTERNATE方式,您可以设想从一个无穷大的封闭区域内部的点画线,只有假想的线穿过了奇数条边界线时,才填充封闭区域,当然若为偶数,则不填充该区域。这就是星的角被填充而中心没被填充的原因。

对于WINDING方式:方法一样,如为奇数,填充该区域;如为偶数则要根据边框线的方向来判断:如果穿过的边框线在不同方向的边框线数目相等,则不填充,如不等,则填充。还是来分析个例子吧,比如要绘制下图,线上的箭头指出了画线的方向。

用这两种方式填充的效果如下图(左侧是ALTERNATE方式,右侧是WINDING方式):

两种方式都会填充三个封闭的L形区域,号码从13。号码为45的两个小内部区域,在ALTERNATE方式下不会被填充。但是,在WINDING方式下,号码为5的区域会被填充,因为从区域内必须穿过两条相同方向的线才能到达图形外部。号码为4的区域不会被填充,因为必须穿过两条方向相反的线。

经过这两节绘图课后,大家应该对Windows中常用的绘图函数有所了解了,发挥你的想象力,去画一些漂亮的图形吧!

分享到:
评论

相关推荐

    Windows编程技术part1(课件)

     第8章 GDI编程1—绘图  第9章 GDI编程2—字体、位图与图标  第10章 GDI编程3—动画  第11章 GDI编程4—图元文件与打印  第12章 文档与视图  第13章 MFC功能包编程简介  第14章 GDI+编程基础  第15...

    Windows编程技术part2(课件)

     第8章 GDI编程1—绘图  第9章 GDI编程2—字体、位图与图标  第10章 GDI编程3—动画  第11章 GDI编程4—图元文件与打印  第12章 文档与视图  第13章 MFC功能包编程简介  第14章 GDI+编程基础  第15...

    Windows编程技术part3(课件)

     第8章 GDI编程1—绘图  第9章 GDI编程2—字体、位图与图标  第10章 GDI编程3—动画  第11章 GDI编程4—图元文件与打印  第12章 文档与视图  第13章 MFC功能包编程简介  第14章 GDI+编程基础  第15...

    windows编程入门教程

    第8章 MFC基础知识 第9章 标准控件在可视化编程中的应用(1) 第9章 标准控件在可视化编程中的应用(2)(3) 第10章 在MFC中创建应用程序的资源(1) 第10章 在MFC中创建应用程序的资源(2) 第11章 单文档与多文档...

    Windows编程循序渐进(清晰完整版)2

    为高清晰完整版PDF电子书,是学习Windows编程很好的 书籍。作者简介:张静盛,目前在盛大网络从事技术研发工作。自2005至今在看雪软件安 全论坛担任“Win32/Win64编程”版版主(网名:北极星2003)。曾获第31届ACM...

    Windows编程循序渐进(清晰完整版)4

    为高清晰完整版PDF电子书,是学习Windows编程很好的 书籍。作者简介:张静盛,目前在盛大网络从事技术研发工作。自2005至今在看雪软件安 全论坛担任“Win32/Win64编程”版版主(网名:北极星2003)。曾获第31届ACM...

    Windows编程循序渐进(清晰完整版)1

    为高清晰完整版PDF电子书,是学习Windows编程很好的 书籍。作者简介:张静盛,目前在盛大网络从事技术研发工作。自2005至今在看雪软件安 全论坛担任“Win32/Win64编程”版版主(网名:北极星2003)。曾获第31届ACM...

    Windows编程循序渐进源码

     第5章,GDI绘图技术:介绍GDI绘图技术的基本的GDI对象。  第6章,键盘与鼠标消息:介绍键盘、鼠标消息的处理与模拟。 (2)软件设计综合应用篇。  第 7章,网络通信基础:介绍网络模型、协议、以及套接字编程...

    Windows编程循序渐进(清晰完整版)7

    为高清晰完整版PDF电子书,是学习Windows编程很好的 书籍。作者简介:张静盛,目前在盛大网络从事技术研发工作。自2005至今在看雪软件安 全论坛担任“Win32/Win64编程”版版主(网名:北极星2003)。曾获第31届ACM...

    Windows编程循序渐进(清晰完整版)5

    为高清晰完整版PDF电子书,是学习Windows编程很好的 书籍。作者简介:张静盛,目前在盛大网络从事技术研发工作。自2005至今在看雪软件安 全论坛担任“Win32/Win64编程”版版主(网名:北极星2003)。曾获第31届ACM...

    VC++ 编程指南_中文chm

    第八课 多文档界面MDI  8.1多文档界面窗口  8.2图形设备接口(GDI)  8.3 绘图程序  8.4访问当前活动视图和活动文档  8.5分隔视图  8.6打印和打印预览  8.7支持多个文档类型的文档视结构程序  8.8防止应用...

    Windows编程循序渐进(清晰完整版)part2

    第8章 密码学算法 第9章 多媒体技术 第10章 数据库技术 第11章 综合实例开发 第三篇 Windows系统程序设计篇 第12章 进程与线程 第13章 内存管理 第14章 进程间通信 第15章 线程同步 第16章 动态链接库 第17章 结构化...

    第2章 MFC基础 本章先介绍Visual C++和MFC的基本情况,然后讨论Windows API和MFC编程的基本方法。

    第8章 GDI编程1—绘图 第9章 GDI编程2—字体、位图与图标 第10章 GDI编程3—动画 第11章 GDI编程4—图元文件与打印 第12章 文档与视图 第13章 MFC功能包编程简介 第14章 GDI+编程基础 第15章 GDI+高级编程 这是文件...

    VC++可视化编程指南

    第八课 多文档界面MDI  8.1多文档界面窗口  8.2图形设备接口(GDI)  8.3 绘图程序  8.4访问当前活动视图和活动文档  8.5分隔视图  8.6打印和打印预览  8.7支持多个文档类型的文档视结构程序  8.8防止应用...

    Windows编程技术

    第8章 使用文件 150 8.1 CFile类 150 8.1.1 文件的建立、打开和关闭 150 8.1.2 文件的读、写 152 8.1.3 文件内容的定位与锁定 153 8.1.4 获取、设置文件状态 154 8.2 序列化 156 8.2.1 序列化的概念 156 8.2.2 ...

    Windows编程循序渐进(清晰完整版)8

    为高清晰完整版PDF电子书,是学习Windows编程很好的 书籍。作者简介:张静盛,目前在盛大网络从事技术研发工作。自2005至今在看雪软件安 全论坛担任“Win32/Win64编程”版版主(网名:北极星2003)。曾获第31届ACM...

    Windows编程循序渐进(清晰完整版)3

    为高清晰完整版PDF电子书,是学习Windows编程很好的 书籍。作者简介:张静盛,目前在盛大网络从事技术研发工作。自2005至今在看雪软件安 全论坛担任“Win32/Win64编程”版版主(网名:北极星2003)。曾获第31届ACM...

    Visual.Basic.2008编程参考手册.pdf

    第8章 选择Windows窗体控件 第9章 使用Windows窗体控件 第10章 Windows窗体 第11章 选择WPF控件 第12章 使用WPF控件 第13章 WPF窗口 第14章 程序和模块结构 第15章 数据类型、变量和常量 第16章 运算符 第17章 ...

Global site tag (gtag.js) - Google Analytics