源程序下载

一些常规形几何形状的绘制和效果填充

                      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实现的填充图形有两种:三角形和矩形。三角形的效果是指定三个点的颜色,然后实现颜色渐变。矩形有两种效果:从左到右实现颜色渐变和从上倒下实现颜色渐变。经过适当的扩展,我增加了三种效果:中心大左右,中心到上下,以及中心到四周的填充效果。具体做法是将矩形分成若干个三角形或矩形,然后分别填充即可实现不同的填充效果。比如中心到左右的填充效果实现如下:先把矩形分成左右两个矩形,对左边矩形实现从左到右的填充,对右边矩形实现从右向左的填充,如此总体效果是从中心到两边的渐变效果。

一些常规形几何形状的绘制和效果填充(一)相关推荐

  1. 一些常规形几何形状的绘制和效果填充(三)

    源程序下载 (续)               visualsan@yahoo.cn 下面以实现钟和旋转文字为例具体讲解CShape的使用方法:     钟由表盘,指针和刻度组成.具体绘图函数在OnP ...

  2. 一些常规形几何形状的绘制和效果填充(二)

     源程序下载 (续)         visualsan@yahoo.cn  我封装了这两个函数,使它的使用更容易: 1.绘制颜色渐变三角形,P1, P2, P3为三角形三个点,cP1, cP2, c ...

  3. JAVA几何图注水,如何使用java绘制几何形状到图片?

    在Java语言编程中,如何使用Java绘制几何形状到图片? 注意:需要访问网址: , 下载一个OpenCV软件包.这里下载最新版本:opencv-3.2.0-vc14.exe并解压此文件到D:soft ...

  4. OpenCV绘制线、矩形、圆等基本几何形状

    OpenCV绘制线.矩形.圆.椭圆等基本几何形状 画线 画矩形 画圆 通过javaOpenCV中的Imgproc函数进行简单几何图形的绘制 画线 代码 public class DemoMat {st ...

  5. Opencv-Python图像像素均值、方差,绘制几何形状

    图像像素均值.方差 计算数组元素的均值和方差函数cv.meanStdDev().传入数组数据,返回数组数据的均值和方差.在图像数组中,可以计算出图像数组的像素均值和方差. 使用np.min和np.ma ...

  6. 【个人笔记】14 图像几何形状绘制

    个人资料,仅供学习使用 学习课程:OpenCV4 C++ 快速入门视频30讲--贾志刚 14 图像几何形状绘制 opencv知识点: 四种几何图形绘制 - 矩形 圆形 线段 椭圆 图片融合 - add ...

  7. OpenCV-Python学习(11)—— OpenCV 图像几何形状绘制(cv.line、cv.circle、cv.rectangle、cv.ellipse)

    1. 学习目标 学会使用 cv.line 绘制一条线: 学会使用 cv.circle 绘制圆: 学会使用 cv.rectangle 绘矩形: 学会使用 cv.ellipse 绘椭圆. 2. 图像公共参 ...

  8. OpenCV中BLOB特征提取与几何形状分类

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.方法 二值图像几何形状提取与分离,是机器视觉中重点之一,在CT ...

  9. iOS10 UI教程视图的几何形状

    iOS10 UI教程视图的几何形状 视图属性中的一部分属性可以让定义的视图绘制在屏幕上.在讲解这些属性前,我们首先将讲解,定义视图的几何形状所涉及到的结构类型.这些结构类型如下: CGPoint:它表 ...

最新文章

  1. 字节2020算法岗校招一面
  2. python 办公自动化-用python进行办公自动化都需要学习什么知识呢?
  3. 白炽灯可控硅调光程序
  4. Windows各种计时器
  5. ylbtech-Model-Account(通用账户模块设计)
  6. vs已停止工作的解决方案
  7. AE脚本-关键帧复制粘贴对齐镜像拉伸调节控制工具 Keystone
  8. linux下双机热备份系统,基于Linux的双机热备份系统的研究与设计
  9. kindle型号查询
  10. 申请苹果个人开发者经历
  11. C++实现费马小定理素数判定法和米勒拉宾素数判定算法生成大素数
  12. JavaSE银行账户管理系统
  13. 联想台式计算机设置u盘启动不了,联想扬天M4000e台式电脑bios设置U盘启动图文方法...
  14. Adb连不上夜神模拟器的原因adb devices显示设备信息为空
  15. 地产行业信息化建设分析
  16. 运算放大器分析----虚短和虚断(转载)
  17. uniapp easycom教程
  18. CAN位时序及相关参数解读
  19. EDA元器件封装导入allegro
  20. WPF自定义控件中报“设置属性“System.Windows.ResourceDictionary.Source”时引发了异常。”,...

热门文章

  1. MacOS系统升级后,IDEA的SVN不好用的问题
  2. 3.5 实例讲解Lucene索引的结构设计
  3. java 中的2个接口 Comparable和Comparator
  4. poj 1061 (扩展欧几里德算法)
  5. Oracle通过OCI批量加载需要注意的问题
  6. PHP session值控制
  7. PHP06 PHP操作MySQL
  8. 2018 hncpc 部分题
  9. html5 canvas 实现一个简单的叮当猫头部
  10. 设置Windbg符号文件路径