一些常规形几何形状的绘制和效果填充(一)
源程序下载
一些常规形几何形状的绘制和效果填充
visualsan@yahoo.cn
常规几何形状是指三角形,多边形,圆,圆弧,直线,点,文字等的绘制。这些基本几何形状经过组合可以形成各种效果图,包括一些仪表和图表。要实现这些效果,使用opengl是最佳选择。但是对于不熟悉opengl编程的人来说,有些困难,而且学习opengl不是几天的事情,而且opengl使用要遵守一定的编程规则,比较繁琐。
本人以CDC类的成员函数为基础,经过几天探索和研究以及综合一些前人代码,完成了一个基本几何图形绘制和效果填充的类CShape.现在介绍给大家。下面图形是示例程序时钟和旋转文字运行截图:
效果图片1:
效果图片2:
CDC类所提供的路径操作和画刷填充是实现这些效果的关键。要实现的具体图形绘制有三种:1.几何轮廓绘制。2.单色几何图形的填充。3.颜色渐变填充。
几何图形轮廓绘制较简单,它的颜色靠传递的pDC的pen决定,靠MoveTO,LineTo绘制直线,靠Arcd等绘制圆弧。关键在于正确计算各个点的位置。在绘图前创建CPen并正确传递给pDC。单色填充使用路径操作来实现。比如要绘制一个单色三角形,具体步骤为:
1. 根据需要生成指定颜色的画刷或者是位图画刷,并正确传递给pDC。
2. 使用路径画三角形并填充:
pDC->BeginPath();//开始定义路径
pDC->MoveTo(p1);//三点定义三角形
pDC->LineTo(p2);
pDC->LineTo(p3);
pDC->LineTo(p1);
pDC->EndPath();//结束,路径一定要封闭
pDC->FillPath();//使用当前画刷填充三角形
对于其他图形比如多边形,一定角度的圆环等几何形状,其绘制关键在于确定形成几何图形的参数个数,然后正确计算各个点的数值,然后BeginPath()和EndPath()创建路径。之后用指定画刷填充FillPath()。对于矩形和圆可以直接用CDC的rectangle和ellipse来绘制填充。但是复杂图形就必须用路径来绘制了。
CDC可以实现单色填充和位图填充,但是不提供颜色渐变。要实现渐变,我目前所知道的方法有两种:
1.用位图填充。
2.使用window API函数GradientFill实现矩形和三角形的渐变填充。
具体介绍如下。
位图填充是指先在内存中绘制一幅覆盖目标区域的位图,然后形成位图画刷进行填充。具体步骤为:
方法1.直接绘制填充位图
CDC* pDC=GetDC();
CBitmap bt,*oldbt;
CDC meDC;
bt.CreateCompatibleBitmap(pDC, R.Width(), R.Height());
//生成空间的//内存位图
meDC.CreateCompatibleDC(pDC);//生成内存DC
oldbt=meDC.SelectObject(&bt);
形成需要的位图,包括颜色渐变等
CBrush *old,b(RGB(0,255,0));
old=meDC.SelectObject(&b);
meDC.FillRect(R,&b);
meDC.SelectObject(old);
b.DeleteObject();
/
b.CreatePatternBrush(&bt);//形成位图画刷
old=pDC->SelectObject(&b);//载入
pDC->FillRect(R,&b);//使用位图画刷填充图形
pDC->SelectObject(old);
方法2.直接载入位图作为画刷:
CBitmap bt,*oldbt;
bt.LoadBitmap(IDB_BITMAP1);//载入位图
CRect R;
GetClientRect(R);
CBrush *old,b;
b.CreatePatternBrush(&bt);//形成位图画刷
old=pDC->SelectObject(&b);
pDC->FillRect(R,&b);
pDC->SelectObject(old);
bt.DeleteObject();
填充位图
填充效果
另外一种方法是用GradientFill实现渐变填充,参考了一些网上的代码和文献,现在就GradientFill的使用总结如下:
1. 生成全局变量
typedef UINT (CALLBACK* LPFNDLLFUNC1)(HDC,CONST PTRIVERTEX,DWORD,CONST PVOID,DWORD,DWORD);
LPFNDLLFUNC1 handle_GradientFill;
HINSTANCE hinst_msimg32;
bool m_bGradientFillInit;
在初始化时载入动态链接库:msimg32.dll
m_bGradientFillInit=false;
hinst_msimg32=NULL;
hinst_msimg32 = LoadLibrary( "msimg32.dll" );
if(hinst_msimg32)
{
m_bGradientFillInit = TRUE;
handle_GradientFill = ((LPFNDLLFUNC1) GetProcAddress(
hinst_msimg32, "GradientFill" ));
}
2.在程序结束时释放动态链接库:
i f (m_bGradientFillInit)
{
FreeLibrary( hinst_msimg32 );
}
2. 可利用GradientFill实现的填充图形有两种:三角形和矩形。三角形的效果是指定三个点的颜色,然后实现颜色渐变。矩形有两种效果:从左到右实现颜色渐变和从上倒下实现颜色渐变。经过适当的扩展,我增加了三种效果:中心大左右,中心到上下,以及中心到四周的填充效果。具体做法是将矩形分成若干个三角形或矩形,然后分别填充即可实现不同的填充效果。比如中心到左右的填充效果实现如下:先把矩形分成左右两个矩形,对左边矩形实现从左到右的填充,对右边矩形实现从右向左的填充,如此总体效果是从中心到两边的渐变效果。
一些常规形几何形状的绘制和效果填充(一)相关推荐
- 一些常规形几何形状的绘制和效果填充(三)
源程序下载 (续) visualsan@yahoo.cn 下面以实现钟和旋转文字为例具体讲解CShape的使用方法: 钟由表盘,指针和刻度组成.具体绘图函数在OnP ...
- 一些常规形几何形状的绘制和效果填充(二)
源程序下载 (续) visualsan@yahoo.cn 我封装了这两个函数,使它的使用更容易: 1.绘制颜色渐变三角形,P1, P2, P3为三角形三个点,cP1, cP2, c ...
- JAVA几何图注水,如何使用java绘制几何形状到图片?
在Java语言编程中,如何使用Java绘制几何形状到图片? 注意:需要访问网址: , 下载一个OpenCV软件包.这里下载最新版本:opencv-3.2.0-vc14.exe并解压此文件到D:soft ...
- OpenCV绘制线、矩形、圆等基本几何形状
OpenCV绘制线.矩形.圆.椭圆等基本几何形状 画线 画矩形 画圆 通过javaOpenCV中的Imgproc函数进行简单几何图形的绘制 画线 代码 public class DemoMat {st ...
- Opencv-Python图像像素均值、方差,绘制几何形状
图像像素均值.方差 计算数组元素的均值和方差函数cv.meanStdDev().传入数组数据,返回数组数据的均值和方差.在图像数组中,可以计算出图像数组的像素均值和方差. 使用np.min和np.ma ...
- 【个人笔记】14 图像几何形状绘制
个人资料,仅供学习使用 学习课程:OpenCV4 C++ 快速入门视频30讲--贾志刚 14 图像几何形状绘制 opencv知识点: 四种几何图形绘制 - 矩形 圆形 线段 椭圆 图片融合 - add ...
- OpenCV-Python学习(11)—— OpenCV 图像几何形状绘制(cv.line、cv.circle、cv.rectangle、cv.ellipse)
1. 学习目标 学会使用 cv.line 绘制一条线: 学会使用 cv.circle 绘制圆: 学会使用 cv.rectangle 绘矩形: 学会使用 cv.ellipse 绘椭圆. 2. 图像公共参 ...
- OpenCV中BLOB特征提取与几何形状分类
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.方法 二值图像几何形状提取与分离,是机器视觉中重点之一,在CT ...
- iOS10 UI教程视图的几何形状
iOS10 UI教程视图的几何形状 视图属性中的一部分属性可以让定义的视图绘制在屏幕上.在讲解这些属性前,我们首先将讲解,定义视图的几何形状所涉及到的结构类型.这些结构类型如下: CGPoint:它表 ...
最新文章
- 字节2020算法岗校招一面
- python 办公自动化-用python进行办公自动化都需要学习什么知识呢?
- 白炽灯可控硅调光程序
- Windows各种计时器
- ylbtech-Model-Account(通用账户模块设计)
- vs已停止工作的解决方案
- AE脚本-关键帧复制粘贴对齐镜像拉伸调节控制工具 Keystone
- linux下双机热备份系统,基于Linux的双机热备份系统的研究与设计
- kindle型号查询
- 申请苹果个人开发者经历
- C++实现费马小定理素数判定法和米勒拉宾素数判定算法生成大素数
- JavaSE银行账户管理系统
- 联想台式计算机设置u盘启动不了,联想扬天M4000e台式电脑bios设置U盘启动图文方法...
- Adb连不上夜神模拟器的原因adb devices显示设备信息为空
- 地产行业信息化建设分析
- 运算放大器分析----虚短和虚断(转载)
- uniapp easycom教程
- CAN位时序及相关参数解读
- EDA元器件封装导入allegro
- WPF自定义控件中报“设置属性“System.Windows.ResourceDictionary.Source”时引发了异常。”,...