GDI+ 它是GDI(Windows 图形设备接口提供的早期版本)也许是版本号,它是Microsoft Windows XP作系统即兴许版本号的图形显示技术。

它已经集成到了.Net开发环境中。所以无论你的OS是什么版本号。仅仅要安装了.Net框架,就有了GDI+(注意:是.Net框架。而不是.Net开发环境。所以Win98中也能够使用GDI+)。

    如今。言归正传。 

    在头文件里增加以下的代码:

#include <GdiPlus.h>

using namespace Gdiplus;

#pragma comment(lib,"gdiplus.lib")

注意:在使用GDI+函数时必须进行GDI+的初始化,使用完成要销毁GDI+!

    初始化:

GdiplusStartupInput gdiplusStartupInput; 

ULONG_PTR gdiplusToken; 

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 

销毁:

ULONG_PTR gdiplusToken = NULL; 

GdiplusShutdown(gdiplusToken);

以下以给一个CTestDlg的对话框绘制背景为样例,用GDI+实现角度可变的颜色渐变效果。用到的变量:

     iRotation:整型。渐变色的角度

     Color1、Color2、Color3:RGB颜色值 

    两种颜色的比較简单,直接用GDI+提供的LinearGradientBrush刷子即可了:

BOOL CTestDlg::OnEraseBkgnd(CDC* pDC)

{

    CDialog::OnEraseBkgnd(pDC); 



    //  取得第一种颜色的R,G,B值

    int r1 = GetRValue(Color1);

    int g1 = GetGValue(Color1);

    int b1 = GetBValue(Color1);



    //  取得另外一种颜色的R,G,B值

    int r2 = GetRValue(Color2);

    int g2 = GetGValue(Color2);

    int b2 = GetBValue(Color2);



    //  得到绘制区域

    CRect rect;

    GetClientRect(&rect);



    //  GDI+对象

    Gdiplus::Graphics graphics(pDC->GetSafeHdc()); 

        

    //  刷子

, rect.Width(), rect.Height()),  //  绘制区域

, r1, g1, b1),  //  第一种颜色

, r2, g2, b2),  //  另外一种颜色 

 - iRotation));  //  渐变色的角度



    graphics.FillRectangle(, rect.Width(), rect.Height()));

 

    return TRUE;

}

三种颜色比較复杂。也是用GDI+提供的LinearGradientBrush刷子,只是须要计算绘制区域的对角线长度。并依照对角线平分为三等分。

详细的看下面代码:

BOOL CTestDlg::OnEraseBkgnd(CDC* pDC)

{

    CDialog::OnEraseBkgnd(pDC); 



    //  取得第一种颜色的R,G。B值

    int r1 = GetRValue(Color1);

    int g1 = GetGValue(Color1);

    int b1 = GetBValue(Color1);



    //  取得另外一种颜色的R。G,B值

    int r2 = GetRValue(Color2);

    int g2 = GetGValue(Color2);

    int b2 = GetBValue(Color2);



    //  取得第三种颜色的R。G,B值

    int r3 = GetRValue(Color3);

    int g3 = GetGValue(Color3);

    int b3 = GetBValue(Color3);



    //  得到绘制区域

    CRect rect;

    GetClientRect(&rect);



    //  计算对角线长度

    int iHeight = rect.Height();

    int iWidth = rect.Width();

    double dwDiagonal = sqrt((double)(iWidth * iWidth + iHeight * iHeight));



    //  三块绘制区域

, (INT)dwDiagonal, (INT)dwDiagonal);

    Rect rectDraw1();

    Rect rectDraw2();



   //  GDI+对象

   Graphics graphics(pDC->GetSafeHdc()); 

   Gdiplus::Bitmap bmp(rectDraw.Width, rectDraw.Height);

   Graphics grTmp(&bmp);



    //  用刷子填充区域

);

    grTmp.FillRectangle(&linGrBrush, rectDraw1);

    Gdiplus::LinearGradientBrush linGrBrush1(rectDraw2, Color(r2, g2, b2),Color(r3, g3, b3), );

    grTmp.FillRectangle(&linGrBrush1, rectDraw2);



    //  计算

    dwDiagonal *= 0.5;

    double dwAngle = iRotation * 3.1415926 / 180.0;

    double dwCosAngle = cos(dwAngle);

    double dwSinAngle = sin(dwAngle);

    double dwBeta = atan2((double)iHeight, (double)iWidth);

    double dwDistance = dwDiagonal * sin(fabs(dwAngle) + dwBeta);

    double xc = 0.5 * iWidth - dwDistance * dwSinAngle;

    double yc = 0.5 * iHeight - dwDistance * dwCosAngle;

    double xc1 = 0.5 * iWidth + dwDistance * dwSinAngle;

    double yc1 = 0.5 * iHeight + dwDistance * dwCosAngle;

    double dx = dwDiagonal * dwCosAngle;

    double dy = - dwDiagonal * dwSinAngle;



    //  绘制

];

    ptDestinationPoints[].X = (INT)(xc - dx);

    ptDestinationPoints[].Y = (INT)(yc - dy);

    ptDestinationPoints[].X = (INT)(xc + dx);

    ptDestinationPoints[].Y = (INT)(yc + dy);

    ptDestinationPoints[].X = (INT)(xc1 - dx);

    ptDestinationPoints[].Y = (INT)(yc1 - dy);

    graphics.DrawImage(); 



    return TRUE;

}

版权声明:本文博主原创文章。博客,未经同意不得转载。

GDI+学问------ 绘制可变角度的色彩渐变效果的更多相关文章

  1. C#中的GDI+图形绘制方法

    GDI+图形绘制方法 1.首先对于绘制图形,必须的先将命名空间导入:using System.Drawing.Drawing2D; 2.然后在一个事件中写入程序 首先先将Graphics这个对象实例化 ...

  2. 【Windows编程】系列第五篇:GDI图形绘制

    上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...

  3. gdi+ 高速绘制透明窗体

    gdi+ 高速绘制透明窗体: 方法一: 1.用Iamge对象载入png资源, 2.调用drawimage函数讲图片绘制出了 3.UpdateLayeredWindow对窗体进行布局 方法二: 1.用B ...

  4. WPF GDI+字符串绘制成图片(二)

    原文:WPF GDI+字符串绘制成图片(二) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83 ...

  5. WPF GDI+字符串绘制成图片(一)

    原文:WPF GDI+字符串绘制成图片(一) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83 ...

  6. CAD绘制一个角度标注(com接口VB语言)

    主要用到函数说明: _DMxDrawX::DrawDimAngular 绘制一个角度标注.详细说明如下: 参数 说明 DOUBLE dAngleVertexX 角度标注的顶点的X值 DOUBLE dA ...

  7. WPF使用Canvas绘制可变矩形

    1.问题以及解决办法 最近因为项目需要,需要实现一个位置校对的功能,大致的需求如下:有一个图片,有一些位置信息,但是位置信息可能和实际有些偏差,需要做简单调整,后面会对这张图片进行切割等,做些处理.( ...

  8. GDI+在绘制验证码中的使用

    GDI+最简单的理解就是用来绘图的.其中包括点.直线.矩形.字符串等等. 先简单来个例子,说明如何在winform窗体中绘制一条直线,并且这条直线不随着窗体的移动而消失. using System; ...

  9. 大厂前端工程师教你如何使用css3绘制任意角度扇形+动画

    这里只是做下原理解释,原理:使用两个半圆做角度拼接.比如想绘制一个缺口朝右,缺口弧度30度角的扇形 资源网站搜索大全https://55wd.com 那么将由一个旋转65度角的半圆A+一个旋转-65度 ...

随机推荐

  1. Directx11学习笔记【十一】 画一个简单的三角形--effect框架的使用

    这里不再介绍effect框架的具体使用,有关effect框架使用可参考http://www.cnblogs.com/zhangbaochong/p/5475961.html 实现的功能依然是画一个简单 ...

  2. Android - 用Fragments实现动态UI - 创建Fragment

    你可以把fragment当作activity中的一个活动模块,它有自己的生命周期,自己接收输入消息,可以在activity运行的时候添加和删除(就像可以在其他activity中重用的"子ac ...

  3. Robotium调用getActivity()导致程序挂起的方法

    1. 问题背景的叙述性说明 需要直接用在工作中没有项目的源代码robotium测试目标android平台launcher,该平台的基础上,当前日期的版本号android 4.4.2.之前我用来验证的可 ...

  4. 允许Ubuntu14.04&quot;保存&quot;屏幕亮度值

    Ubuntu / Debian 该系统有一个共同的问题,也就是说,每个引导.系统会打开你的屏幕亮度调至最高值. 我很奇怪,为什么14.04这一问题的版本号依然不动. 但是,我们可以做一个脚本Ubunt ...

  5. 简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)

    本文将简单介绍如何使用PowerMock和Mockito来mock1. 构造函数2. 静态函数3. 枚举实现的单例4. 选择参数值做为函数的返回值5. 在调用mock出来的方法中,改变方法参数的值 一 ...

  6. Sass 基础和入门

    css本身很有趣,但是随着样式表变大,会越来越复杂,更加难以管理.css预处理器在这里就能帮上忙了.SASS 让你使用在css中不存在的特性,譬如变量.嵌套.mixins(混入),继承和一些其他好的特 ...

  7. 使用cocoapods install友盟时报错Error installing UMengAnalytics

    报错: [!] /usr/bin/unzip /Users/soindy/Documents/SmartThermo/ios/SmartThermo/Pods/UMengAnalytics/file. ...

  8. 【JAVA】【NIO】5、Java NIO Scatter / Gather

    标题手段Java NIO该分散体浓缩 Java NIO内置支持分散与收集.的概念主要用于信道分散聚集的读写. 读出的分散体的一个通道被读多个数据buffer在.因此.数据分散到多个buffer中. 对 ...

  9. hdu4758 Walk Through Squares (AC自己主动机+DP)

    Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...

  10. java中System类简介(转)

    上次面试中遇到的一个问题,问到System.out.println()中的out是不是内部类[不是内部类],当时就给问蒙了,直观感觉out应该是System类的一个属性,跟内部类有什么关系?而且之前整 ...