GDI+学问------ 绘制可变角度的色彩渐变效果
GDI+ 它是GDI(Windows 图形设备接口提供的早期版本)也许是版本号,它是Microsoft Windows XP作系统即兴许版本号的图形显示技术。
它已经集成到了.Net开发环境中。所以无论你的OS是什么版本号。仅仅要安装了.Net框架,就有了GDI+(注意:是.Net框架。而不是.Net开发环境。所以Win98中也能够使用GDI+)。
如今。言归正传。
在头文件里增加以下的代码:
using namespace Gdiplus;
#pragma comment(lib,"gdiplus.lib")
注意:在使用GDI+函数时必须进行GDI+的初始化,使用完成要销毁GDI+!
初始化:
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
销毁:
GdiplusShutdown(gdiplusToken);
以下以给一个CTestDlg的对话框绘制背景为样例,用GDI+实现角度可变的颜色渐变效果。用到的变量:
iRotation:整型。渐变色的角度
Color1、Color2、Color3:RGB颜色值
两种颜色的比較简单,直接用GDI+提供的LinearGradientBrush刷子即可了:
{
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刷子,只是须要计算绘制区域的对角线长度。并依照对角线平分为三等分。
详细的看下面代码:
{
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+学问------ 绘制可变角度的色彩渐变效果的更多相关文章
- C#中的GDI+图形绘制方法
GDI+图形绘制方法 1.首先对于绘制图形,必须的先将命名空间导入:using System.Drawing.Drawing2D; 2.然后在一个事件中写入程序 首先先将Graphics这个对象实例化 ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- gdi+ 高速绘制透明窗体
gdi+ 高速绘制透明窗体: 方法一: 1.用Iamge对象载入png资源, 2.调用drawimage函数讲图片绘制出了 3.UpdateLayeredWindow对窗体进行布局 方法二: 1.用B ...
- WPF GDI+字符串绘制成图片(二)
原文:WPF GDI+字符串绘制成图片(二) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83 ...
- WPF GDI+字符串绘制成图片(一)
原文:WPF GDI+字符串绘制成图片(一) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83 ...
- CAD绘制一个角度标注(com接口VB语言)
主要用到函数说明: _DMxDrawX::DrawDimAngular 绘制一个角度标注.详细说明如下: 参数 说明 DOUBLE dAngleVertexX 角度标注的顶点的X值 DOUBLE dA ...
- WPF使用Canvas绘制可变矩形
1.问题以及解决办法 最近因为项目需要,需要实现一个位置校对的功能,大致的需求如下:有一个图片,有一些位置信息,但是位置信息可能和实际有些偏差,需要做简单调整,后面会对这张图片进行切割等,做些处理.( ...
- GDI+在绘制验证码中的使用
GDI+最简单的理解就是用来绘图的.其中包括点.直线.矩形.字符串等等. 先简单来个例子,说明如何在winform窗体中绘制一条直线,并且这条直线不随着窗体的移动而消失. using System; ...
- 大厂前端工程师教你如何使用css3绘制任意角度扇形+动画
这里只是做下原理解释,原理:使用两个半圆做角度拼接.比如想绘制一个缺口朝右,缺口弧度30度角的扇形 资源网站搜索大全https://55wd.com 那么将由一个旋转65度角的半圆A+一个旋转-65度 ...
随机推荐
- Discuz 楼主帖子采集
try { ; i < ; i++) { var html = GetHtmls("http://bbs.fobshanghai.com/viewthread.php?tid=3885 ...
- ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件
原文:ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件 第二章 继承于WebControl的自定义控件 到现在为止,我已经写了三篇关于自定义控件开发的文章,很感谢大家的支 ...
- sizeof运营商
sizeof它是C语言的关键字,它计算对象所占用的字节数.采用sizeof通过计算对象的大小,占用的对象是一个良好的编程习惯二手. ★你得到的内置型尺寸 一些内置类型的大小会随着体系结构的不同而不同, ...
- 【原创】构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施
原文:[原创]构建高性能ASP.NET站点 第六章-性能瓶颈诊断与初步调优(下前篇)-简单的优化措施 构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施 前言:本篇 ...
- oracle查看经常使用的系统信息
总结了查看oracle数据库的经常使用sql ,有助于分析优化出一个健壮的系统程序来. 1.当前的数据库连接数: select count(*) from v$process 2.数据库同意的最大连接 ...
- 关于查看文件size
public static long getTotalSize(String device) { StatFs sf = new StatFs (device); //long totalblocks ...
- jqm的多列布局demo,html5的多列布局demo,多列布局的具体解说,html5开发实例具体解释
因为移动设备屏幕宽度较小,所以一般不建议使用多列布局.但有时你可能须要并排放置一些元素(如button之类的). jQuery Mobile通过约定的类名ui-grid来提供了一种基于css的多列布局 ...
- nginx+tomcat实现动静分离(转)
本文设计的动静分离结构 在本文中,我们将静态资源放在 A 主机的一个目录上,将动态程序放在 B 主机上,同时在 A 上安装 Nginx 并且在 B 上安装 Tomcat.配置 Nginx,当请求的是 ...
- Java开发中的23种设计模式具体解释
public static void main(String[] args) { SendFactory factory = new SendFactory(); Sender sender = fa ...
- 什么是简单的分析SQL注入漏洞
如今非常多人在入侵的过程中基本都是通过SQL注入来完毕的,可是有多少人知道为什么会有这种注入漏洞呢?有的会随口说着对于字符的过滤不严造成的. 可是事实是这样吗?我们学这些.不仅要知其然.更要知其所以然 ...