热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

新手请教一个画圆的问题(进者有分)

问题描述:我在WindowsCE操作系统中,开发一个小程序,采用mfc基于对话框来编写。简单来说,就是程序中通过串口接收(下位机发过来的)一些命令。这些命令有“画点”“画线”“绘
问题描述:
    我在Windows CE操作系统中,开发一个小程序,采用mfc基于对话框来编写。
简单来说,就是程序中通过串口接收(下位机发过来的)一些命令。这些命令有
“画点”“画线”“绘制位图”“画矩形”“清屏(其实就是将对话框背景,更改
为全红色,或者全绿色,或者全蓝色)”等等。
    现在我在接收下位机通过串口发送过来的“清屏”指令之后,通过Invalidate
函数来刷新背景,在WM_CTLCOLOR消息响应函数中,返回一个相应颜色(红或者绿
或者蓝)的刷子来达到目的。
    不过,现在问题出现了。我通过上述方法,修改了对话框背景色之后。当我再次
接收到“画圆”指令,我通过Ellipse函数来画圆。我简单的贴一些代码上来:
	
         BYTE *pbuf = (BYTE*)wParam;
CClientDC dc(this);
int iColorR = pbuf[9], iColorG = pbuf[10], iColorB = pbuf[11];
int iRadius = pbuf[7]/16*1000 + pbuf[7]%16*100 + pbuf[8]/16*10 + pbuf[8]%16;
POINT ptOri = {0};
ptOri.x = pbuf[3]/16*1000 + pbuf[3]%16*100 + pbuf[4]/16*10 + pbuf[4]%16;
ptOri.y = pbuf[5]/16*1000 + pbuf[5]%16*100 + pbuf[6]/16*10 + pbuf[6]%16;
CPen pen(PS_SOLID, 1, RGB(iColorR, iColorG, iColorB));
CPen *pOldPen = dc.SelectObject(&pen);
RECT rc = {0};
rc.left = ptOri.x - iRadius;
rc.top = ptOri.y - iRadius;
rc.right = ptOri.x + iRadius;
rc.bottom = ptOri.y + iRadius;
dc.Ellipse(&rc);  // 绘制圆形
dc.SelectObject(pOldPen);

    这样总是会画一个内部由白色来填充的圆形。在我没有修改对话框背景色之前,通过Ellipse
函数是可以绘制一个只有边框,内部无填充的圆形。现在都变为了白色。我想应该是跟之前修改
对话框背景色时返回的那个指定颜色的画刷有关。但是更改背景又是必须的功能,画圆我又不想画
内部有白色填充的。请大侠们给小弟支招。我是一个刚刚入行的菜鸟。级别低,只有100分奉上。
但只要回帖的就有分数。分数会根据功劳大小而不同。多谢。

6 个解决方案

#1


CBrush brh(RGB(x,y,z));

CBrush* poldbrh = dc.selectobject(brh);
 dc.Ellipse(&rc);  // 绘制原型
    dc.SelectObject(pOldPen);
    dc.SelectObject(pOldbrh);

#2


dc.SelectStockObject(NULL_BRUSH);
dc.Ellipse(&rc);  // 绘制圆形

#3


SelectObject一个NULL_BRUSH

#4


在 WM_PAINT中做所有的绘图操作。

void OnPaint()
{
CPaintDC dc(this);

// 填充背景
dc.FillSolidRect(&rect, RGB(x,y,z));

// 根据绘图指令绘制图形

if (绘制圆)
{
dc.Ellipse(&rc); 
}
}

#5


一是问题太简单
二是VC/MFC板块坛友很热心
问题很多解决,尤其感谢2,3楼的大侠。
剩下时间,大家可以自由接分。
呵呵。
晚上9点前结贴。

#6


一是问题太简单
二是VC/MFC板块坛友很热心
问题很快解决,尤其感谢2,3楼的大侠。
剩下时间,大家可以自由接分。
呵呵。
晚上9点前结贴。

推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
author-avatar
丶沈丨灬de艳本人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有