GDI+学习之 ------- 绘制角度可变的颜色渐变效果

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());

//  刷子

Gdiplus::LinearGradientBrush linGrBrush(Gdiplus::Rect(0, 0, rect.Width(), rect.Height()),  //  绘制区域

Gdiplus::Color(255, r1, g1, b1),  //  第一种颜色

Gdiplus::Color(255, r2, g2, b2),  //  第二种颜色

(Gdiplus::REAL)(90 - iRotation));  //  渐变色的角度

graphics.FillRectangle(&linGrBrush, Gdiplus::Rect(0, 0, 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));

//  三块绘制区域

Rect rectDraw(0, 0, (INT)dwDiagonal, (INT)dwDiagonal);

Rect rectDraw1(0, 0, (INT)dwDiagonal, ((INT)dwDiagonal)/2);

Rect rectDraw2(0, ((INT)dwDiagonal) / 2, (INT)dwDiagonal, ((INT)dwDiagonal) / 2);

//  GDI+对象

Graphics graphics(pDC->GetSafeHdc());

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

Graphics grTmp(&bmp);

//  用刷子填充区域

Gdiplus::LinearGradientBrush linGrBrush(rectDraw1, Color(r1, g1, b1), Color(r2, g2, b2), 90);

grTmp.FillRectangle(&linGrBrush, rectDraw1);

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

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;

//  绘制

Point ptDestinationPoints[3];

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

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

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

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

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

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

graphics.DrawImage(&bmp, ptDestinationPoints, 3);

return TRUE;

}

时间: 2024-10-02 19:28:20

GDI+学习之 ------- 绘制角度可变的颜色渐变效果的相关文章

GDI+学习笔记(五)绘制一个正方体

本文将介绍如何利用GDI+绘制一个正方体. (一)准备阶段 想象一下,高中的时候,我们在学立体几何的时候是怎样画一个正方体的,我们在一张纸上利用投影的思路将其绘制在一张纸上,对吧,这计算投影的部分,我们暂且忽略.下图是我用windows的画图绘制的一个正方体: 我们计算出这些点在平面上的坐标如下: Point A(100,200); Point B(200,200); Point C(100,300); Point D(200,300); Point E(100+50*1.414, 200-50

GDI+学习笔记(六)渐变画刷

画刷,顾名思义,就是像画刷一样,向设备上绘制,还记得小时候常唱的首歌,"我是一个粉刷匠.." 好吧,跑题了. 本系列博客希望尽可能简单的描述每项功能,而不希望把每个参数都介绍的详详细细,如果需要,请查阅msdn,本节讲述的渐变画刷,主要有两种,一种是叫线性画刷(LinearGradientBrush),还有一种叫路径画刷(PathGradientBrush),我希望以一种尽可能简单的方式去描述它,但能力有限,所以有什么意见,希望各位能帮忙提出,谢谢. (一)使用画刷 上一节中,我们实际

GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

带插件的排序算法演示器 本节将通过一个实例来说明GDI+在MFC中的应用.这个算法演示器其实是本人算法系列的一个开端,由于csdn没有树状的目录结构,咱也只好使用链表了不是?好了,废话不多说,开始今天的文章. (一)功能说明 我们初步制定功能如下: (1). 能够通过柱状图,自动展示排序算法的交换比较过程 (2). 能够使用插件的形式进行开发.即,当新完成一个算法后,只需要完成一个插件文件(我们这里使用动态库dll),由主程序加载插件,即可进行执行,而不再需要重新编译主程序. (3). 保证主程

GDI+学习笔记(七)保存简单图像

请尊重本人的工作成果,转载请留言,并说明转载地址,谢谢.地址如下: http://blog.csdn.net/fukainankai/article/details/27710883 前几节中,我们利用GDI+在窗口中绘制了各种各样的图形.图像,这一节,我们将会将这些图像保存成简单图像.所谓简单图像,指的是bmp/jpg/png等图像或者单帧的gif图像.保存成多帧的gif图像稍微复杂一点,本节中暂时不做说明.保存成动态的tiff文件也比较简单,但这里也不做说明,下次有机会和gif一起介绍. 另

常用GDI函数(1):绘制线条和图形

1. CDC::SetPixel()用来绘制一个像素点. 使用Win32 API函数: HDC hdc = ::GetDC(m_hWnd);//获得窗口的设备描述表 ::SetPixel(hdc, 100, 200, RGB(255, 0, 0)); ::ReleaseDC(m_hWnd, hdc);//释放DC资源 CDC::MoveTo(),CDC::LineTo()用来绘制直线. 使用CDC类: CDC* pDC = GetDC();//获得与当前窗口相关联的DC对象 pDC->MoveT

[Guava学习笔记]Collections: 不可变集合, 新集合类型

不可变集合 不接受null值. 创建:ImmutableSet.copyOf(set); ImmutableMap.of(“a”, 1, “b”, 2); public static final ImmutableSet<Color> GOOGLE_COLORS = ImmutableSet.<Color>builder() .addAll(WEBSAFE_COLORS) .add(new Color(0, 191, 255)) .build(); 可以有序(如ImmutableS

GDI+学习---2.编程模式

在使用GDI+的时候,您不必像在GDI中那样关心设备场景句柄,只需简单地创建一个Graphics对象,然后以您熟悉的面向对象的方式(如myGraphicsObject.DrawLine(parameters))调用它的方法即可. Graphics对象是GDI+的核心,与屏幕上的特定窗体有关,他不与Pen.Brush.Image.Path.Font等绑定,只需将这些对象作为参数,传给Graphics类的方法即可. 如画线: Graphics* myGraphics =  new Graphics(

JAVA8学习——从使用角度深入Stream流(学习过程)

Stream 流 初识Stream流 简单认识一下Stream:Stream类中的官方介绍: /** * A sequence of elements supporting sequential and parallel aggregate * operations. The following example illustrates an aggregate operation using * {@link Stream} and {@link IntStream}: * * <pre>{@

Unity3D开发(八):NGUI之UILabel颜色渐变效果

向原创致敬http://blog.csdn.net/onerain88/article/details/19066961 1. UILabel简介 (1)UILabel支持类型 a.图字:是指根据某些工具,将游戏中需要用到的文字渲染到一张纹理上,并附其纹理信息(包括 id值,尺寸,间距等). b.字库字:是指直接载入ttf等字库文件,根据从ttf文件中读取的数据,生成纹理并渲染. (2)UILabel基本属性 Font类型:上述介绍的图字和字库字(Bitmap与Dynamic) Text:文本