在VC中用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(00, 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(00, 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(00, (INT)dwDiagonal, (INT)dwDiagonal);
    Rect rectDraw1(
00, (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;
}

 

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/starlee/article/details/557947
个人分类: VC++/MFC
所属专栏: Windows下C++编程
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭