当前位置:首页 > 编程开发

C语言版GDI+应用例子 -- 画刷

webgou17年前 (2009-11-14)编程开发322

    GDI+提供了SolidBrush(实色刷)、HatchBrush(阴影刷)、TextureBrush(纹理刷)、LinearGradientBrush(渐变刷)和PathGradientBrush(路径刷)等五种画刷,在GDI+的C语言版本中,这些画刷的方法都以在原C++类类名为前缀,其中的LinearGradientBrush和PathGradientBrush分别简化为LineBrush和PathBrush。

    GDI+的画刷是GDI+绘制图形的基础,GDI+画笔也是依靠GDI+画刷形成的,熟练地运用GDI+画刷,可以使各种图像更加多姿多彩,也可以用它们来绘制Windows应用程序的各种控件的界面,MS的Office2003及以后的版本的Office程序界面都是使用GDI+绘制界面的典型例子。

    下面是一个用C语言改写的GDI+画刷的经典例子代码:

// main.c #include "..\..\SampleCode\comcode\Application.h" #pragma hdrstop PGpBrush backgroundBrush; void OnCreate(void) { // 建立一个全局图像画刷,用来填充窗口背景 PGpImage backgroundImage = ImageCreate(L"..\\..\\Media\\colorbars.jpg"); backgroundBrush = TextureBrushCreate(backgroundImage); ImageDelete(backgroundImage); } void OnDestroy(void) { BrushDelete(backgroundBrush); } void OnPaint(HDC DC) { Point points[] = {{40, 140}, {275, 200}, {105, 225}, {190, 300}, {50, 350}, {20, 180}}; BYTE types[] = {PathPointTypeStart, PathPointTypeBezier, PathPointTypeBezier, PathPointTypeBezier, PathPointTypeLine, PathPointTypeLine}; Rect r = {300, 250, 100, 100}; ARGB ac[] = {Green, Yellow, Red, Blue, Orange, White}; RECT clientRect; PGpHatchBrush hb; PGpLineBrush lb; PGpPathBrush pgb; PGpPath path; PGpSolidBrush sb = SolidBrushCreate(SetAlpha(White, 180)); PGpGraphics g = GraphicsCreate(DC); // GDI+ 画布 GraphicsSetSmoothingMode(g, SmoothingModeAntiAlias); // 用图像画刷填充背景,同时用白色半透明实色画刷遮照背景图案 GetClientRect(Handle, &clientRect); GraphicsFillRectangle(g, backgroundBrush, 0, 0, clientRect.right, clientRect.bottom); GraphicsFillRectangle(g, sb, 0, 0, clientRect.right, clientRect.bottom); // 用红色实色画刷画矩形,同时用半透明黄色实色刷错开画同样大小矩形在其上 SolidBrushSetColor(sb, Red); GraphicsFillRectangle(g, sb, 20, 20, 50, 50); SolidBrushSetColor(sb, SetAlpha(Yellow, 180)); GraphicsFillRectangle(g, sb, 40, 40, 50, 50); // 用图案画刷画一个圆,图案前景色为绿色,背景色则为大半透明黄色 hb = HatchBrushCreate(HatchStyleForwardDiagonal, Green, SetAlpha(Yellow, 100)); GraphicsFillEllipse(g, hb, 250, 10, 100, 100); BrushDelete(hb); // 用渐变色画刷从右上至左下画一红、黄色渐变矩形 lb = LineBrushFromRect(&r, Red, Yellow, LinearGradientModeBackwardDiagonal); GraphicsFillRectangle(g, lb, r.X, r.Y, r.Width, r.Height); BrushDelete(lb); // 用6种颜色路径画刷匹配6坐标点路径画一图形(注意这不是多色填充, // 而是匹配路径坐标点渐变填充,颜色可以少于但不能大于路径坐标点; // 多色路径刷填充是沿路径中心点向边缘按规定的比例填充)。应该很漂亮! // 但遗憾的是,我还没见过有谁画成功过这个图形,只能画单色,也很漂亮的。 path = PathFromData(points, types, 6, FillModeAlternate); pgb = PathBrushCreate(path); PathBrushSetSurroundColors(pgb, &ac, 1); GraphicsFillPath(g, pgb, path); BrushDelete(pgb); PathDelete(path); // 用紫色实色画刷画一个逆时针旋转30度的矩形 SolidBrushSetColor(sb, SlateBlue); GraphicsRotate(g, -30, 0); GraphicsFillRectangle(g, sb, 100, 250, 75, 100); GraphicsResetTransform(g); BrushDelete(sb); GraphicsDelete(g); } WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 这里使用了双缓冲画窗口,可将第3个参数改为FALSE比较一下效果 */ InitApplication(hInstance, nCmdShow, TRUE); CreateProc = OnCreate; DestroyProc = OnDestroy; PaintProc = OnPaint; return RunApplication(TEXT("C语言Gdiplus演示例子 -- 画刷"), 450, 400); } //---------------------------------------------------------------------------

    例子代码使用的窗口框架代码和GDI+ C语言版本下载地址见《在C语言Windows应用程序中使用GDI+》。

    由于例子代码中作了详细的注释,而且这也是个GDI+经典例子,所以就不在此啰嗦了。

    顺便说一下,原GDI+ C++版本的Color类型在C版本中取消,需要用到颜色的地方直接使用ARGB类型,原Color类的一些方法还是保留了。

    下面是用VC2005编译运行例子的界面截图:

运行界面

    GDI+初学者要想熟练的掌握GDI+画刷,仅靠这个例子是远远不够的,必须多看看GDI+资料,多参考C++、C#等语言中运用GDI+的代码。关于GDI+画刷,我有几篇文章作了专门介绍,里面有更多使用画刷的例子,虽然是Delphi或者BCB写的,但原理是一样的,可供初学者参考:

《GDI+ for VCL基础 -- 画刷之SolidBrush》,《GDI+ for VCL基础 -- 画刷之HatchBrush》,《GDI+ for VCL基础 -- 画刷之TextureBrush》,《GDI+ for VCL基础 -- 画刷之LinearGradientBrush》,《GDI+ for VCL基础 -- 画刷之PathGradientBrush》。

本文来自CSDN博客:http://blog.csdn.net/maozefa/archive/2009/11/11/4797543.aspx

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=85

标签: gdi
分享给朋友:

“C语言版GDI+应用例子 -- 画刷” 的相关文章

Visual Studio 2005 SP1安装

解压到%temp%\临时目录(对于我的Visual Studio 2005 Team System,这需要C:\Documents and Settings\Administrator\Local Settings\Temp下面1个多GB的空间) 把自己复制到%temp%下(400多MB) 把自己复…

Android查询联系人信息正确操作方法

在Android操作系统中,编程爱好者们可以根据自己不同的需求对其进行一些修改来轻松的完成各种功能。这一开源系统对于各个手机厂商来说无疑是一个发展良机。我们在这里就为大家介绍一个Android查询联系人信息的方法,以帮助大家解决一些问题。下面的Android查询联系人信息的功能主要是实现查询联系人的…

Unity Shader 极简实践1——极简描边

 1. 极简描边1.1 思路使用两个 Pass 来渲染,两个 Pass 的作用分别是 把模型放大一定倍数,渲染成纯色 正常渲染模型 这样,因为第一个纯色 Pass 把模型放大了,所以第二个正常渲染 Pass 之外能看到一圈纯色的描边,问题在于第一个 Pass 的时候如何把…

ServerSocketChannel

http://diary.51.com/diary/diary_add.php?groupid=103706呵呵,我来告诉你吧,至于例子代码在我的回答记录中有。你自己翻来去看,是用nio给一个学生写的BBS聊天室。在用nio通讯的过程我用以下情景给你模拟: 1. 学校(ServerSocketCha…

Android屏幕大小相关技巧应用指南

Android应用程序中屏幕大小的设置大家应该都比较清楚,不过如何才能让屏幕自己适应环境而改变大小呢?在这里我们就可以为大家详细介绍一下有关Android屏幕大小的自适应方式,帮助大家理解。不同的Android target会有不同的大小,应用程序的界面需要针对不同的大小调整界面元素的尺寸。而且An…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。