MFC中实现的画箭头算法 (Arrow in MFC)

在codeproject中寻找到一个这样的算法,在这里介绍一下

可以改变三角形大小,顶点角度,是否填充和填充颜色等

但是画出的箭头还是不够美观....呵呵,还好吧

其中填充是代表箭头内是否填充颜色 

先来看声明和实现

 

 

  1. //使用一个结构体来存储相关的信息
  2. //Defines the attributes of an arrow.
  3. typedef struct tARROWSTRUCT {
  4. int nWidth;     // width (in pixels) of the full base of the arrowhead
  5. float fTheta;   // angle (in radians) at the arrow tip between the two
  6. //  sides of the arrowhead
  7. bool bFill;     // flag indicating whether or not the arrowhead should be
  8. //  filled
  9. } ARROWSTRUCT;
  10. ///
  11. //函数声明
  12. // Draws an arrow, using the current pen and brush, from the current position
  13. //  to the passed point using the attributes defined in the ARROWSTRUCT.
  14. void ArrowTo(HDC hDC, int x, int y, ARROWSTRUCT *pArrow);
  15. void ArrowTo(HDC hDC, const POINT *lpTo, ARROWSTRUCT *pArrow);
  16. ///
  17. //画箭头函数实现
  18. void CMyDialog::ArrowTo(HDC hDC, int x, int y, ARROWSTRUCT *pA) {
  19. POINT ptTo = {x, y};
  20. ArrowTo(hDC, &ptTo, pA);
  21. }
  22. void CMyDialog::ArrowTo(HDC hDC, const POINT *lpTo, ARROWSTRUCT *pA) {
  23. POINT pFrom;
  24. POINT pBase;
  25. POINT aptPoly[3];
  26. float vecLine[2];
  27. float vecLeft[2];
  28. float fLength;
  29. float th;
  30. float ta;
  31. // get from point
  32. MoveToEx(hDC, 0, 0, &pFrom);
  33. // set to point
  34. aptPoly[0].x = lpTo->x;
  35. aptPoly[0].y = lpTo->y;
  36. // build the line vector
  37. vecLine[0] = (float) aptPoly[0].x - pFrom.x;
  38. vecLine[1] = (float) aptPoly[0].y - pFrom.y;
  39. // build the arrow base vector - normal to the line
  40. vecLeft[0] = -vecLine[1];
  41. vecLeft[1] = vecLine[0];
  42. // setup length parameters
  43. fLength = (float) sqrt(vecLine[0] * vecLine[0] + vecLine[1] * vecLine[1]);
  44. th = pA->nWidth / (2.0f * fLength);
  45. ta = pA->nWidth / (2.0f * (tanf(pA->fTheta) / 2.0f) * fLength);
  46. // find the base of the arrow
  47. pBase.x = (int) (aptPoly[0].x + -ta * vecLine[0]);
  48. pBase.y = (int) (aptPoly[0].y + -ta * vecLine[1]);
  49. // build the points on the sides of the arrow
  50. aptPoly[1].x = (int) (pBase.x + th * vecLeft[0]);
  51. aptPoly[1].y = (int) (pBase.y + th * vecLeft[1]);
  52. aptPoly[2].x = (int) (pBase.x + -th * vecLeft[0]);
  53. aptPoly[2].y = (int) (pBase.y + -th * vecLeft[1]);
  54. MoveToEx(hDC, pFrom.x, pFrom.y, NULL);
  55. // draw we're fillin'...
  56. if(pA->bFill) {
  57. LineTo(hDC, aptPoly[0].x, aptPoly[0].y);
  58. Polygon(hDC, aptPoly, 3);
  59. }
  60. // ... or even jes chillin'...
  61. else {
  62. LineTo(hDC, pBase.x, pBase.y);
  63. LineTo(hDC, aptPoly[1].x, aptPoly[1].y);
  64. LineTo(hDC, aptPoly[0].x, aptPoly[0].y);
  65. LineTo(hDC, aptPoly[2].x, aptPoly[2].y);
  66. LineTo(hDC, pBase.x, pBase.y);
  67. MoveToEx(hDC, aptPoly[0].x, aptPoly[0].y, NULL);
  68. }
  69. }

再来看调用实现(加一层封装更加适用)

 

  1. /
  2. //封装调用函数实现(其实还是有很大的扩展空间的)
  3. void CMyDialog::ArrowTo(
  4. CDC *pDC,              //画刷
  5. CPoint point,          //终点坐标
  6. int nPenStyle,         //线样式
  7. int nPenWidth,         //线宽度
  8. COLORREF color, //颜色
  9. int nWidth,            //三角形底边宽度
  10. float fTheta,          //三角形顶角角度
  11. bool bFill             //是否填充颜色
  12. )
  13. {
  14. ARROWSTRUCT a;
  15. a.nWidth = nWidth;     //三角形底边宽度
  16. a.fTheta = fTheta;     //三角形顶角角度
  17. a.bFill = bFill;       //是否填充颜色
  18. CPen* pOldPen;
  19. CPen pen(nPenStyle,nPenWidth,color);
  20. pOldPen = pDC->SelectObject(&pen);
  21. CBrush br,*pbrOld;
  22. br.CreateSolidBrush(color);
  23. pbrOld = pDC->SelectObject(&br);
  24. ArrowTo(*pDC,point.x,point.y,&a);       //调用画箭头函数
  25. pDC->SelectObject(pOldPen);
  26. pDC->SelectObject(pbrOld);
  27. }

 

 

转载于:https://www.cnblogs.com/wupingzsf/archive/2010/05/16/1736958.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java8 Stream详解~排序:sorted

sorted,中间操作。有两种排序: sorted():自然排序,流中元素需实现Comparable接口 sorted(Comparator com):Comparator排序器自定义排序 「案例:将员工按工资由高到低(工资一样则按年龄由大到小…

英国上议院AI报告:没中美有钱,但我可以主导道德游戏规则设定

来源:网络大数据随着全球各国政府纷纷计划推出 AI 驱动下的未来,英国正准备承担一些学术和道德上的责任。最近,英国上议院 (House of Lords) 发布了一份183页的 报告《AI in the UK: ready, willing and able?》(《人工智能在英国&#xff1…

Java8 Stream详解~ 提取/组合

流也可以进行合并、去重、限制、跳过等操作。 public class StreamTest {public static void main(String[] args) {String[] arr1 { "a", "b", "c", "d" };String[] arr2 { "d", "e", "f", "g&…

Scrapy 下载器 中间件(Downloader Middleware)

Scrapy 下载器中间件官方文档:https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/downloader-middleware.html 官方 英文 文档:http://doc.scrapy.org/en/latest/topics/downloader-middleware.html#topics-downloader-middleware Scrapy 扩展中间件…

15 个 JavaScript Web UI 库

转载http://news.csdn.net/a/20100519/218442.html 几乎所有的富 Web 应用都基于一个或多个 Web UI 库或框架,这些 UI 库与框架极大地简化了开发进程,并带来一致,可靠,以及高度交互性的用户界面。本文介绍了 15 个非常强大的 Java…

2018年技术展望--中文版

来源:199IT互联网数据中心每年,《埃森哲技术展望》报告融合顶尖技术研究团队、行业领袖以及全球数据调研结果,发布未来三年内或将对各行各业产生重大影响的技术趋势判断,作为企业布局新战略的指导。2018年的《埃森哲技术展望》报告…

CompletableFuture详解~创建实例

创建 CompletableFuture 对象实例我们可以使用如下几个方法&#xff1a; static CompletableFuture<U> completedFuture(U value)//使用forkjoin公共线程池 static CompletableFuture<Void> runAsync(Runnable runnable) static CompletableFuture<U> suppl…

彻底搞懂 Scrapy 的中间件

彻底搞懂Scrapy的中间件&#xff08;一&#xff09;&#xff1a;https://www.cnblogs.com/xieqiankun/p/know_middleware_of_scrapy_1.html 彻底搞懂Scrapy的中间件&#xff08;二&#xff09;&#xff1a;https://www.cnblogs.com/xieqiankun/p/know_middleware_of_scrapy_2.h…

华为:5G技术前景堪忧,运营商将很难从5G赚钱

来源&#xff1a;FT中文网、5G作者&#xff1a;卢卡斯、法尔兹丨英国《金融时报》。未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0…

PostgreSQL最常见问题

PostgreSQL最常见问题 常见问题1.1)PostgreSQL 是什么&#xff1f;该怎么发音&#xff1f;1.2)PostgreSQL 的版权是什么&#xff1f;1.3)PostgreSQL 可以运行在哪些操作系统平台上&#xff1f;1.4)我从哪里能得到 PostgreSQL&#xff1f;1.5)我从哪里能得到对 PostgreSQL 的支…

解决log4j多个日志都写到一个文件

之前客户端程序由于Websockt包依赖的log4j&#xff0c;就用log4j写日志了&#xff0c;Web用的log4j2没毛病。用log4j的多个logger的日志都写到一个文件里了&#xff0c;查了很多资料都没解决。今天闲了解决一下。 最后好使的配置 # 设置日志根 log4j.rootLogger INFO,Except…

CompletableFuture详解~设置任务结果

CompletableFuture 提供以下方法&#xff0c;可以主动设置任务结果。 boolean complete(T value) boolean completeExceptionally(Throwable ex) 第一个方法&#xff0c;主动设置 CompletableFuture 任务执行结果&#xff0c;若返回 true&#xff0c;表示设置成功。如果返回 …

Scrapy 爬虫去重效率优化之 Bloom Filter的算法的对接

From&#xff1a;https://cloud.tencent.com/developer/article/1084962 Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中https://www.cnblogs.com/adc8868/p/7442306.html scrapy redis bloomfilter &#xff1a;https://github.co…

为什么 AI 工程师要懂一点架构?

作者 | 王咏刚&#xff08;公众号ID&#xff1a;ban-qing-ren&#xff09;AI 时代&#xff0c;我们总说做科研的 AI 科学家、研究员、算法工程师离产业应用太远&#xff0c;这其中的一个含义是说&#xff0c;搞机器学习算法的人&#xff0c;有时候会因为缺乏架构&#xff08;In…

深度优先搜索遍历与广度优先搜索遍历

深度优先遍历过程 1、图的遍历 和树的遍历类似&#xff0c;图的遍历也是从某个顶点出发&#xff0c;沿着某条搜索路径对图中每个顶点各做一次且仅做一次访问。它是许多图的算法的基础。 深度优先遍历和广度优先遍历是最为重要的两种遍历图的方法。它们对无向图和有…

CompletableFuture详解~CompletionStage

CompletableFuture 分别实现两个接口 Future与 CompletionStage。 Future 接口大家都比较熟悉&#xff0c;这里主要讲讲 CompletionStage。 CompletableFuture 大部分方法来自CompletionStage 接口&#xff0c;正是因为这个接口&#xff0c;CompletableFuture才有如此强大功能…

Python 异步 IO 、协程、asyncio、async/await、aiohttp

From &#xff1a;廖雪峰 异步IO &#xff1a;https://www.liaoxuefeng.com/wiki/1016959663602400/1017959540289152 Python Async/Await入门指南 &#xff1a;https://zhuanlan.zhihu.com/p/27258289 Python 生成器 和 yield 关键字&#xff1a;https://blog.csdn.net/free…

智能语音简史:这场技术革命从哪开始?

来源&#xff1a;与非网1952年&#xff0c;贝尔实验室&#xff08;Bell Labs&#xff09;制造一台6英尺高自动数字识别机“Audrey”&#xff0c;它可以识别数字0&#xff5e;9的发音&#xff0c;且准确度高达90&#xff05;以上。并且它对熟人的精准度高&#xff0c;而对陌生人…

四角号码检字法及查字方法的简介

四角号码检字法 由王云五&#xff08;1888—1979&#xff09;发明&#xff0c;汉语词典常用检字方法之一&#xff0c;用最多5个阿拉伯数字来对汉字进行归类。四角号码检字法用数字0到 9表示一个汉 字 四角的十种笔形&#xff0c;有时在最后增加一位补码。   四角号码检字法歌…

精益创业~如何驾驭愿景

开发-测量-认知 反馈循环 循环中把总时间缩至最短 要把科学的方法运用到新创企业中&#xff0c;我们必须找到哪些假设是需要测试的。这是新创企业计划中风险最大的部分&#xff0c;这部分内容依赖 信念飞跃 Leap-of-Faith 式的大胆假设。其中最重要的两个假设是 价值假设 和 增…