博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GDI+学问------ 绘制可变角度的色彩渐变效果
阅读量:5370 次
发布时间:2019-06-15

本文共 3694 字,大约阅读时间需要 12 分钟。

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;
}

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

转载于:https://www.cnblogs.com/mengfanrong/p/4852204.html

你可能感兴趣的文章
CSS3中box-sizing的理解
查看>>
linux下编译安装nginx
查看>>
DLL 导出函数
查看>>
windows超过最大连接数解决命令
查看>>
12个大调都是什么
查看>>
angular、jquery、vue 的区别与联系
查看>>
Intellij idea创建javaWeb以及Servlet简单实现
查看>>
代理网站
查看>>
Open multiple excel files in WebBrowser, only the last one gets activated
查看>>
FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
查看>>
最近邻与K近邻算法思想
查看>>
【VS开发】ATL辅助COM组件开发
查看>>
FlatBuffers In Android
查看>>
《演说之禅》I &amp; II 读书笔记
查看>>
thinkphp3.2接入支付宝支付接口(PC端)
查看>>
【转】在Eclipse中安装和使用TFS插件
查看>>
C#中Monitor和Lock以及区别
查看>>
【NOIP2017】奶酪
查看>>
5.6.3.7 localeCompare() 方法
查看>>
Linux下好用的简单实用命令
查看>>