在VC中用GDI+绘制角度可变的颜色渐变效果-.NET教程,VB.Net语言[转]
在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语言[转]相关推荐
- GDI绘制时钟效果,与系统时间保持同步,基于Winform
2019独角兽企业重金招聘Python工程师标准>>> 这是直接在Winform的基础上进行绘制的.接下来,我对时钟进行了封装,封装成一个名为CSharpQuartz的类,效果如下: ...
- 基于VC++的GDI常用坐标系统及应用
(转载自天极网的)很详细的坐标系的变换. 基于VC++的GDI常用坐标系统及应用 2005-06-20 08:59作者:刘涛出处:天极网责任编辑:方舟 在Windows应用程序中,只要进行绘图,就要使 ...
- MFC+GDI+绘制出雷达余晖效果
MFC+GDI+绘制出雷达余晖效果 1.首先要画出静态的坐标轴,用双缓冲方法在onpain消息中绘制.绘制方法都比较简单.声明一个内存DC,绘制一个圆形,再把坐标轴画上去. void CDlg_Rad ...
- 椭圆形印章核心算法浅析及使用GDI+绘制椭圆印章的方法
1. 引言 几年前,笔者在做某项目时,需要根据开票方的实际信息(含企业名称,社会信用代码,印章编号)绘制某椭圆形的专用章,加盖到PDF版式文件上,并使用开票方的证书信息进行签名,以防范版式文件伪造.抵 ...
- 视频教程-VC#.NET+GDI+开发交互式CAD系统-C#
VC#.NET+GDI+开发交互式CAD系统 图书作者,代码从业者,N多年 苏金明 ¥799.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠, ...
- matlab常见用法汇总,包括绘制二维、三维曲线、圆、读取、保存图片/数据、数值精度、绘制圆、绘制角度等
文章目录 写在前面 一 绘制二维曲线 二 绘制三维曲线 plot3. 三 绘制三维离散点 scatter3() 四 保存图片到本地 五 数值精度 六 字符串拼接 七 将数据保存到txt 八 matla ...
- C# 数据库系统中使用GDI+绘制柱状图
在C#+SQL Server数据库做系统中,通常需要对数据库中的数据进行绘制图形报表方便经理查看,虽然有很多实用的水晶报表控件和图表控件实现该功能,但我还是想讲讲如何使用GDI绘制简单的柱状图.(推荐 ...
- Windows平台RTMP|RTSP播放器为什么要兼容GDI绘制
为什么要支持GDI 先说结论,Windows平台播放渲染这块,一般来说99%以上的机器都是支持D3D的,实现GDI模式绘制,除了为了好的兼容性外,在远程连接的场景下,D3D创建不成功,需要使用GDI模 ...
- 使用GDI+绘制高质量图和字体(2)
还记得前段时间的一篇文章写了"使用GDI+绘制高质量图和字体",里面用到了SmoothingMode.HighQuality,CompositingQuality.HighQual ...
最新文章
- JSON 基础解释.
- Python爬虫(十二)_BeautifulSoup4 解析器
- ubuntu服务器在虚拟机中的配置
- 力压 MongoDB、Redis,PostgreSQL 蝉联“年度数据库”!
- 解决vim中鼠标右键无法复制的问题
- 新鲜出炉的头条面试算法
- 基于IFC标准的4DBIM可视化平台
- nes模拟器java版_fc模拟器java版
- 【算法竞赛学习笔记】弦图和区间图
- 富士急乐园免税店将开业,打造游园购物访日体验
- threejs中引入draco压缩后的模型
- 如何定义线程数线程数
- odoo 使用打印功能
- eclipse写入mysql乱码问题_怎么办eclipse向mysql插入数据出现乱码
- vue 实现tab切换动态加载不同的组件
- 细思极恐!使用 AI 控制你的浏览器
- Oracle 12c 的 hr_main.sql
- Error creating bean with name 'transactionManager' defined i
- 毕业月薪3万起!算法工程师九成硕博学历,腾讯成AI人才收割机
- 小小滑块可笑可笑-安卓滑块验证码通杀方案研究(5)
热门文章
- cuda9.2环境下pip安装tensorflow非官方轮子
- 阿里云服务器没有公网IP
- 阅读 | 《娱乐至死》笔记 | Part1
- Caffe中BN层与CONV层的融合(merge_bn)
- HTML+CSS画圣诞树
- 程序员生涯之我见 找到自己的兴趣所在
- 程序员,你得选准买房的时间!
- VUE div click无效
- 关注我的微信公众帐号小q机器人(xiaoqrobot)
- 通过c语言来实现斐波那契数列。斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13...这个数列从第3项开始,每一项都等于前两项之和。