在VC中用GDI+绘制角度可变的颜色渐变效果-.NET教程,VB.Net语言

作者:网友供稿 点击:4

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

http://www.west263.com/www/info/40780-1.htm

在VC中用GDI+绘制角度可变的颜色渐变效果-.NET教程,VB.Net语言[转]相关推荐

  1. GDI绘制时钟效果,与系统时间保持同步,基于Winform

    2019独角兽企业重金招聘Python工程师标准>>> 这是直接在Winform的基础上进行绘制的.接下来,我对时钟进行了封装,封装成一个名为CSharpQuartz的类,效果如下: ...

  2. 基于VC++的GDI常用坐标系统及应用

    (转载自天极网的)很详细的坐标系的变换. 基于VC++的GDI常用坐标系统及应用 2005-06-20 08:59作者:刘涛出处:天极网责任编辑:方舟 在Windows应用程序中,只要进行绘图,就要使 ...

  3. MFC+GDI+绘制出雷达余晖效果

    MFC+GDI+绘制出雷达余晖效果 1.首先要画出静态的坐标轴,用双缓冲方法在onpain消息中绘制.绘制方法都比较简单.声明一个内存DC,绘制一个圆形,再把坐标轴画上去. void CDlg_Rad ...

  4. 椭圆形印章核心算法浅析及使用GDI+绘制椭圆印章的方法

    1. 引言 几年前,笔者在做某项目时,需要根据开票方的实际信息(含企业名称,社会信用代码,印章编号)绘制某椭圆形的专用章,加盖到PDF版式文件上,并使用开票方的证书信息进行签名,以防范版式文件伪造.抵 ...

  5. 视频教程-VC#.NET+GDI+开发交互式CAD系统-C#

    VC#.NET+GDI+开发交互式CAD系统 图书作者,代码从业者,N多年 苏金明 ¥799.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠, ...

  6. matlab常见用法汇总,包括绘制二维、三维曲线、圆、读取、保存图片/数据、数值精度、绘制圆、绘制角度等

    文章目录 写在前面 一 绘制二维曲线 二 绘制三维曲线 plot3. 三 绘制三维离散点 scatter3() 四 保存图片到本地 五 数值精度 六 字符串拼接 七 将数据保存到txt 八 matla ...

  7. C# 数据库系统中使用GDI+绘制柱状图

    在C#+SQL Server数据库做系统中,通常需要对数据库中的数据进行绘制图形报表方便经理查看,虽然有很多实用的水晶报表控件和图表控件实现该功能,但我还是想讲讲如何使用GDI绘制简单的柱状图.(推荐 ...

  8. Windows平台RTMP|RTSP播放器为什么要兼容GDI绘制

    为什么要支持GDI 先说结论,Windows平台播放渲染这块,一般来说99%以上的机器都是支持D3D的,实现GDI模式绘制,除了为了好的兼容性外,在远程连接的场景下,D3D创建不成功,需要使用GDI模 ...

  9. 使用GDI+绘制高质量图和字体(2)

    还记得前段时间的一篇文章写了"使用GDI+绘制高质量图和字体",里面用到了SmoothingMode.HighQuality,CompositingQuality.HighQual ...

最新文章

  1. JSON 基础解释.
  2. Python爬虫(十二)_BeautifulSoup4 解析器
  3. ubuntu服务器在虚拟机中的配置
  4. 力压 MongoDB、Redis,PostgreSQL 蝉联“年度数据库”!
  5. 解决vim中鼠标右键无法复制的问题
  6. 新鲜出炉的头条面试算法
  7. 基于IFC标准的4DBIM可视化平台
  8. nes模拟器java版_fc模拟器java版
  9. 【算法竞赛学习笔记】弦图和区间图
  10. 富士急乐园免税店将开业,打造游园购物访日体验
  11. threejs中引入draco压缩后的模型
  12. 如何定义线程数线程数
  13. odoo 使用打印功能
  14. eclipse写入mysql乱码问题_怎么办eclipse向mysql插入数据出现乱码
  15. vue 实现tab切换动态加载不同的组件
  16. 细思极恐!使用 AI 控制你的浏览器
  17. Oracle 12c 的 hr_main.sql
  18. Error creating bean with name 'transactionManager' defined i
  19. 毕业月薪3万起!算法工程师九成硕博学历,腾讯成AI人才收割机
  20. 小小滑块可笑可笑-安卓滑块验证码通杀方案研究(5)

热门文章

  1. cuda9.2环境下pip安装tensorflow非官方轮子
  2. 阿里云服务器没有公网IP
  3. 阅读 | 《娱乐至死》笔记 | Part1
  4. Caffe中BN层与CONV层的融合(merge_bn)
  5. HTML+CSS画圣诞树
  6. 程序员生涯之我见 找到自己的兴趣所在
  7. 程序员,你得选准买房的时间!
  8. VUE div click无效
  9. 关注我的微信公众帐号小q机器人(xiaoqrobot)
  10. 通过c语言来实现斐波那契数列。斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13...这个数列从第3项开始,每一项都等于前两项之和。