稀土测试课程设计--稀土焙烧炉自动控制系统模拟软件
稀土串级萃取的计算机动态模拟

稀土串级萃取的计算机动态模拟
陈利新;李忠虎
【期刊名称】《内蒙古石油化工》
【年(卷),期】2015(000)018
【摘要】稀土串级萃取的计算机模拟主要应用在科研领域,在生产与学习中还是难得一遇,本文从生产工艺及生产培训需求的目的出发,以稀土串级萃取为基础,通过计算机来实现萃取从充槽到萃取平衡这一动态过程的模拟,使抽象的过程图像化、直观化.
【总页数】3页(P40-42)
【作者】陈利新;李忠虎
【作者单位】内蒙古科技大学信息工程学院;中国北方稀土(集团)冶炼分公司,内蒙古包头014030;内蒙古科技大学信息工程学院
【正文语种】中文
【中图分类】TE845
【相关文献】
1.串级萃取计算机动态模拟数学模型及实例验证 [J], 童长仁;邓佐国
2.串级萃取状态方程及多元稀土萃取分离工艺设计 [J], 胡启阳
3.稀土萃取串级理论多组份串级萃取体系质量分布的计算方法 [J], 金天柱;徐光宪
4.稀土串级萃取分离过程的数学模型和计算机仿真 [J], 王振华
5.多组份稀土体系串级萃取分离理论(Ⅰ) 多组份稀土体系串级萃取分离的静态平衡出口级组成的计算 [J], 丁永权;刘正平;陈立红
因版权原因,仅展示原文概要,查看原文内容请购买。
稀土焙烧回转窑炉运行参数监控系统

因此 , 有 效改造 焙烧 回转 炉窑 , 准确 控制 炉窑 各温
L u F a n x i n g, Da i Ru i
( J i a n g x i Un i v e r s i t y o f S c i e n c e&T e c h n o l o g y , J i a n g x i G a n z h o u 3 4 1 0 0 0, Ch i n a )
重要课题. 本文结合炉温控制 系统 的非线性时变 性 和滞后 性特 点 , 在 充 分 考虑 燃 烧 重 油 与 精 矿及
硫 酸的进 给量 、 窑体 高 中低 温区温 度 、 尾 气废 渣排 放 的可 测控性 基础 上 , 利用 C A N总线 技术 设 计 出 基 于模糊 P I D的硫 酸焙 烧混 合型稀 土精 矿 回转 窑
a u t h or s ’s ys t e m . The s y s t e m a n i —i t n t e r f e r e nc e a b i l i t y a nd t h e mi ne r  ̄ de c ompos i t i on r a t e a r e i nc r e a s e d.
炉温控制系统.工业现场测试表 明,回转窑各 温区温度 控制 区间和稳 定性较 未使用本 系统前 改善 1 0 % ,矿 物分解反应速度和系统抗干扰能力得到提高. 关键词 : 稀 土焙烧 回转 窑 ;炉 温控 制 ;模糊 P I D;C A N总线
加热炉温度自动控制系统MATLOB

加热炉温度自动控制系统MATLOB加热炉温度自动控制系统MATLOB是一种用于控制加热炉温度的系统。
在工业生产过程中,控制加热炉温度的准确性和稳定性对于保证产品质量和生产效率至关重要。
MATLOB系统采用先进的温度感应器和控制器,通过实时监测和调节加热炉的温度,使其保持在设定的温度范围内。
该系统具有高精度、快速响应的特点,能够有效地控制加热炉温度的波动,确保生产过程的稳定性和可靠性。
背景信息包括MATLOB系统的发展历程、应用范围和优势等方面。
通过了解MATLOB系统的背景信息,可以更好地理解该系统的重要性和作用,为后续的具体操作和维护提供基础。
系统概述加热炉温度自动控制系统MATLOB由以下主要组成部分和功能组成:温度传感器:用于测量加热炉的温度。
控制器:通过接收温度传感器的信号,对加热炉的加热器进行控制,以维持设定的目标温度。
加热器:通过加热炉的加热元件来提供加热能量。
控制算法:控制器使用特定的算法根据当前温度和目标温度之间的差异来调整加热器的输出功率,以达到温度稳定控制。
用户界面:提供给操作员对加热炉温度自动控制系统进行设置和监控的界面,如设定目标温度、显示当前温度和报警信息等。
该系统的主要功能是通过自动控制加热炉的温度,使其能够稳定地达到用户设定的目标温度。
通过温度传感器实时监测加热炉的温度,并将数据传输给控制器。
控制器根据设定的目标温度和当前温度之间的差异,通过调整加热器的输出功率来控制加热炉的温度。
用户可以通过操作界面进行设定和监控,以确保加热炉的温度处于所需的范围内。
MATLOB加热炉温度自动控制系统是一个简单而有效的解决方案,旨在提供稳定和可靠的温度控制,以满足用户对加热炉温度精确控制的需求。
加热炉温度自动控制系统MATLOB相比其他系统具有许多优势和特点,下面是一些主要的优势:高精度:MATLOB系统采用先进的传感器和控制算法,能够实现对加热炉温度的高精度控制。
这种高精度控制可以确保加热炉内的温度保持在预定的范围内,从而提高生产效率和产品质量。
稀土精矿低温焙烧工艺条件及参数

包头稀土精矿低温焙烧系统设计工艺技术要求根据北方稀土稀土精矿分解工艺技术革新目标和要求,面向市场寻求低温分段焙烧系统设备设计及定制合作单位,具体工艺条件及参数如下:一、湿稀土精矿的化学组成及其含量与物理特性表1 稀土精矿化学组成及物理特性表表2 稀土精矿中稀土组分含量组分La2O3CeO2Pr2O3Nd2O3Sm2O3Eu2O3Gd2O3Y2O3含量26.59 51.36 5.01 15.06 1.14 0.20 0.35 0.29二、稀土精矿的年处理量、小时投料量年处理量:2万吨(年操作时间以7200h计)每小时投料量:2.78吨三、稀土精矿低温焙烧工艺条件及参数1、工艺流程图:焙烧矿98%回收硫酸2、稀土精矿与98%硫酸反应3、焙烧反应方程式:(1)氟碳铈镧矿的分解2REFCO3+3H2SO42(SO4 ) 3 +2HF↑+ 2H2O↑+ 2CO2↑(2)独居石矿的分解2REPO4 + 3H2SO RE2(SO4)3 + 2H3PO4Th3(PO4)4 + 6H2SO4)2 + 4H3PO4(3)杂质矿物与浓硫酸反应Fe2O3 + 3H2SO Fe2(SO4) 3 + 3H2OCaF2 + H2SO CaSO4+ 2HF↑SiO2 + 2HF SiF4↑+ H2O(4)焦磷酸钍、钙的生成在200℃~300℃,磷酸脱水转变成焦磷酸,焦磷酸与硫酸钍作用生成难溶的焦磷酸钍。
2H 3PO 4H4P 2O 7 + H 2OTh(SO 4)2 + H 4P 2O 72O 7↓+ 2H 2SO 4 2CaSO 4 + H 4P 2O 7Ca 2P 2O 7↓+ 2H 2SO 4 (5)在338℃,硫酸开始分解 H 2SO 4 SO 3↑+ H 2O↑4、焙烧反应时间:从物料进入炉体到反应完全出炉体的时间 一段焙烧90~120min ,二段焙烧60~90min5、反应温度:一段焙烧250~300℃,二段焙烧500-600℃。
竖炉焙烧过程综合自动化系统

竖炉焙烧过程综合自动化系统.txt32因为爱心,流浪的人们才能重返家园;因为爱心,疲惫的灵魂才能活力如初。
渴望爱心,如同星光渴望彼此辉映;渴望爱心,如同世纪之歌渴望永远被唱下去。
本文由duwolala贡献pdf文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
2 00 6年3 月第13卷第2期文章编号: 1671 7848( 2006) 02 0120 04控制工程 Control Engineering of ChinaMar . 2 0 0 6 Vol. 13, No. 2竖炉焙烧过程综合自动化系统严爱军 , 丁进良 , 柴天佑( 1 东北大学教育部暨辽宁省流程工业综合自动化重点实验室, 辽宁沈阳1 1 2110004; 2 东北大学自动化研究中心, 辽宁沈阳 110004)摘要: 针对竖炉焙烧过程的工艺特点及技术要求, 基于智能技术提出了实现综合生产指标优化的竖炉焙烧过程综合自动化系统, 讨论了由智能优化、过程控制和过程管理三层结构组成的综合自动化系统的结构、功能和控制策略。
用智能优化设定模型、炉况诊断模型、智能预报模型及回路控制, 实现了优化综合生产指标的目标。
所提出的系统成功应用于某选矿厂竖炉焙烧生产过程, 实现了竖炉焙烧生产过程的优化控制、优化运行和优化管理, 取得了明显的应用成效。
关键词: 竖炉焙烧; 生产指标; 综合自动化系统; 智能优化中图分类号: TP 273 文献标识码 : AIntegrated Automation System for Shaft Furnace Roasting ProcessYAN A i jun , DING Jin liang , CHAI Tian you1 1 2( 1 Key Laboratory of Process Indust ry Automation, M inistry of Educat ion, China, Northeastern University, Shenyang 110004, China; 2 R esearch Center of Automat ion, Northeast ern University, Shenyang 110004, China)Abstract: The integrated automation system based on intelligent technologies consisting of three layers, intelligent optimization control, process control and process management is developed to fit the characteristic and requirement of the shaft furnace roasting process The structure, func tions and control strategy of this system are discussed Overall production index is achieved using intelligent optimal setting model, fault diagno sis model, intelligent prediction model and loop control The system proposed is successfully applied to the roasting process of a Minerals Pro cessing Factory to realize process optimal control, process optimal operation and process optimal management It is proven to provide benefits to this minerals processing factory Key words: shaft furnace roasting; production index ; integrated automation system; intelligent optimization1引言竖炉焙烧是我国目前处理弱磁性矿物的有效途径之一。
基于MATLAB的炉温控制系统的仿真

控制系统仿真课程大作业题目: 基于MATLAB的炉温控制系统的仿真院系名称:电气工程学院专业班级:自动F0904学生姓名:学号:指导教师:教师职称:讲师评语:成绩:任课教师:时间:在数字PID算法中,为了避免传统PID控制器算法中积分累积所造成的系统较大超调和不稳定,甚至是积分饱和,人们常常会使用积分分离PID算法加以改进。
本文又提出了变速积分PID算法,并以电锅炉温度控制系统为例,基于MATLAB 并运用仿真分析手段,对两种不同算法的控制效果进行了比较,得出了积分分离算法的上升时间tr较短,而变速积分算法的调节时间ts较短,最大超调量较小,振荡次数较少,在温度控制系统中变速积分优于积分分离的结论。
本文以加热炉控制系统为例提出了一种模糊控制方案, 介绍了模糊控制器的设计过程并很方便地利用SIMULINK 进行了仿真研究, 结果证明, 这种模糊控制系统具有良好的动态性能。
关键词:PID控制;积分分离;变速积分;MATLAB1 绪论 (4)2 系统描述 (4)2.1 系统过程 (4)2.2 系统的组成和基本工作原理 (5)2.3 对象模型的归纳 (6)3 PID控制及仿真 (6)3.1分分离PID控制算法 (7)3.2 变速积分PID控制算法 (7)4 基于两种控制算法的炉温控制系统仿真 (8)结论 (10)致谢 (10)参考文献 (11)1 绪论控制系统计算机仿真是应用现代科学手段对控制系统进行科学研究的十分重要的手段之一。
进入80年代以来, 几乎所有控制系统的高品质控制均离不开系统仿真研究。
通过仿真研究可以对照比较各种控制策略与方案, 优化并确定相关参数, 特别是对于新控制决策与算法的研究, 进行系统仿真更是必不可少的。
一般而言, 对控制系统进行计算机仿真首先应建立系统模型, 然后依据模型编制仿真程序, 充分利用计算机作为工具对其进行数值求解并将结果加以显示。
显然, 通常在仿真过程中, 十分耗费时间与精力的是编制和修改仿真程序。
稀土萃取中模糊自调整PID的给料流量智能控制系统研究
稀土萃取中模糊自调整PID的给料流量智能控制系统研究给流量作为稀土萃取的重要流程,对于稀土萃取的效果有着最为直接的影响。
为了进一步提升稀土萃取过程汇总给料流量控制的科学性与准确性,本文旨在从PID模糊自动调节的角度出发,对传统的PID系统进行优化,进一步增强稀土萃取给料流量智能控制系统的控制效果,促进稀土生产活动的有序开展,满足实际社会经济发展对稀土生产的客观要求。
标签:稀土萃取;PID;模糊自调整;给料流量智能控制0 引言我国作为最大的稀土生产国,不仅稀土资源的储量十分巨大,并且稀土资源种类丰富,重、中、轻品类齐全,在世界稀土市场占有重要的地位。
现阶段我国稀土在生产过程中仍旧存在产品质量较低、成本较高等问题。
为了有效改善这一情况,技术人员着手进行稀土串级萃取理论的优化,对给料流量进行有效控制,改变过去稀土萃取过程中破碎化,实现了稀土萃取的可控性[1]。
实现给料流量的科学高效控制,需要先关技术的支持,由于大部分的技术被一些国家或者企业所垄断,难以在短时间内获取并投入到生产之中,因此我们将模糊自调整控制体系与给料流量控制工作之中。
以模糊自调整体系为基础,对PID给料流量工作进行优化与升级,在很大程度上增强了给料流量控制的智能性与高效性,保证了我国稀土萃取的质量与水平,促进了稀土资源的有效开发与合理利用。
1 PID给料流量系统与数学模式构建分析对PID给料流量系统以及数学模式构建的分析,能够帮助我们理清稀土萃取过程中给料流量控制的重点要求与核心环节,实现模糊自调整PID给料流量系统的构建。
为了保证稀土萃取工作的质量与水平,通常情况下PID给料流量系统的控制精度应控制在29-31L/min的范围之内。
PID给料流量系统与闭环控制系统相似,由控制器、执行装置、反馈设备等几部分组成,在运行的过程中,根据稀土萃取过程中对原料的使用需求,对控制器的运算速度进行调整,执行装置根据相关指令对传送设备以及电机驱动阀门进行调节,反馈设备则不断进行数据信息的采集与分析,实现给料流量的实时监控,其结构原理如图1所示[2]。
稀土萃取过程自动控制系统的开题报告
稀土萃取过程自动控制系统的开题报告一、研究背景稀土是一种重要的战略资源,在军事、航天、新能源、环保等领域有着广泛的应用。
而稀土的综合利用和开发也成为了当前的研究热点和难点。
稀土资源的开采和加工过程需要采用稀土萃取技术,通过稀土萃取过程可以将稀土从其他元素中分离出来。
然而,传统的稀土萃取方法存在着工艺条件不易控制、稀土回收率低、对环境污染等问题。
因此,开发一种稀土萃取过程自动控制系统,可以有效解决上述问题,提高稀土萃取过程的效率和稀土回收率,同时也能保证对环境的安全和保护。
二、研究目的和意义本研究旨在开发一种稀土萃取过程自动控制系统,通过自动化控制,实现稀土萃取过程参数的精确控制和稀土的高效回收。
具体目的和意义如下:1. 提高稀土萃取过程的效率和稀土回收率,降低生产成本。
2. 保证对环境的安全和保护,减少环境污染。
3. 为稀土资源的开发和利用提供技术支持,为国家的战略资源保障做出贡献。
三、研究内容1. 稀土萃取过程的原理和工艺流程研究。
2. 稀土萃取过程自动控制系统的设计与开发,包括硬件和软件。
3. 系统功能测试与性能评价。
4. 稀土萃取过程自动控制系统的应用研究。
四、研究方法1. 稀土萃取过程的原理和工艺流程研究:收集和整理国内外稀土萃取技术发展动态和研究成果,分析和比较稀土萃取过程中不同工艺条件对稀土回收率和产品质量的影响。
2. 稀土萃取过程自动控制系统的设计与开发:采用现代集成化技术,包括单片机控制、模拟信号处理、数字信号处理等,进行系统设计和开发。
同时结合自动化控制的理论和应用技术,对稀土萃取过程进行参数控制。
3. 系统功能测试与性能评价:对系统进行功能测试和性能评价,通过实验验证系统的稳定性、可靠性和准确度。
4. 稀土萃取过程自动控制系统的应用研究:将开发的稀土萃取过程自动控制系统应用于实际稀土萃取过程中,评估稀土回收率和产品质量,并与传统稀土萃取方式进行比较和分析,进一步验证系统的应用效果。
焙烧炉自动控制系统
焙烧炉自动控制系统
李文光;宋朝君
【期刊名称】《云南冶金》
【年(卷),期】2006(035)002
【摘要】简要介绍流态化焙烧炉自动控制系统的测控点、以PLC为下位主机的控制结构、控制原理和人机界面.
【总页数】3页(P90-92)
【作者】李文光;宋朝君
【作者单位】昆明冶研新材料股份有限公司,云南,昆明,650031;云南国防工业职业技术学院,云南,昆明,650222
【正文语种】中文
【中图分类】TF
【相关文献】
1.32室环式碳素焙烧炉自动控制系统研究 [J], 唐涛;
2.焙烧炉天然气燃烧自动控制系统的研究与应用 [J], 黄亚军
3.包头铝业炭素阳极焙烧炉燃烧自动控制系统研制开发应用 [J], 白洁;文海子
4.铜冶炼焙烧炉底部温度自动控制系统的改造 [J], 黄学武;徐蕾;李小鹏
5.冷轧酸再生焙烧炉自动控制系统的设计及应用 [J], 马兵香
因版权原因,仅展示原文概要,查看原文内容请购买。
稀土灼烧过程自动化设计
稀土灼烧过程自动化设计甘家毅;刘昌豹;林依萍;梁红梅【摘要】稀土灼烧是稀土生产流程中重要的一个环节,灼烧过程的好坏直接影响稀土产品的质量优劣,影响企业的效益.目前我国稀土产业用的灼烧窑多为电窑和煤窑,但都存在自动化程度低、工人劳动量大、工作环境恶劣等诸多不利因素.针对这些问题研究设计一套稀土灼烧过程自动化生产线,实现了稀土灼烧过程在下料段、包装段、匣钵回收段的自动化生产,减少生产能耗,提高灼烧效率和质量.【期刊名称】《大众科技》【年(卷),期】2018(020)012【总页数】4页(P13-16)【关键词】稀土;灼烧;自动化【作者】甘家毅;刘昌豹;林依萍;梁红梅【作者单位】中铝广西有色金源稀土有限公司,广西贺州 542603;桂林电子科技大学机电工程学院,广西桂林 541004;中铝广西有色金源稀土有限公司,广西贺州542603;中铝广西有色金源稀土有限公司,广西贺州 542603【正文语种】中文【中图分类】TP273我国稀土资源非常丰富,占世界已探明储量的80%左右。
稀土因其独特优异的性质,被誉为“工业维生素”[1],成为各国对传统产业改造、高新科技的发展、研发国防尖端技术的重要国家战略资源,因此稀土的生产以及利用受到了国家的重视,稀土相关生产技术的优化、设计也就受到了行业人员的重视。
自20世纪70年代以来,在稀土串级萃取理论的指导下[2],我国稀土分离和生产工艺取得了比较高的成就,已达到世界先进水平,但我国的稀土工业生产过程自动化装备和工艺仍存在着发展不平衡、自动化程度低、分析手段落后、控制方法不稳定的问题,制约了我国稀土工业的发展[3]。
在参观相关稀土企业时,相关企业的稀土灼烧过程中存在着自动化程度极低、能源消耗较大、工作环境恶劣、产品质量不稳定、企业效益不理想、生产效率较低、工人劳动量大等诸多问题,不符合“中国制造2025”和“绿色制造”理念,不利于我国稀土产业生产和应用的快速发展,因此新的灼烧工艺、自动化设备是今后稀土灼烧过程的一个重要研究课题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
稀土测试课程设计--稀土焙烧炉自动控制系统模拟软件成绩课程名称:程序设计实训设计题目:稀土焙烧炉自动控制系统模拟软件题目稀土焙烧炉自动控制系统模拟软件设计姓名学号1108020204 班级网工1102指导老师完成日期2013.7.10 1.设计任务:1.1设计目的(1) 了解稀土以及稀土焙烧炉自动控制系统的基本工作原理;(2) 进一步学习 C 语言或者C++语言程序工程设计的方法以及程序调试技巧;(3) 学习撰写专业技术文档。
1.2设计内容稀土焙烧炉自动控制系统模拟软件设计稀土焙烧炉的控制要求是:1)要保证进入焙烧炉的稀土矿石粉料和浓硫酸量控制在设定的比例。
一般设定稀土矿石粉料和浓硫酸的比例为1:1(重量比),并根据工艺要求可以适当改变这一比例。
2)规定进入焙烧炉的稀土矿石粉料流量调节范围为每分钟0—10kg,一般设定稀土矿石粉料进入焙烧炉的流量为5kg/min。
3)1 号操作工要密切观察炉内情况,一旦发现焙烧炉的尾部有原料堆积的情况,就要及时通知 2 号操作工减少稀土矿石粉料,从而消除焙烧炉尾部原料堆积的情况。
用 C 语言或者C++语言编写一个程序,用形象化方式模拟上述稀土焙烧炉的控制系统的工作过程。
软件要能用适当的方式显示出稀土矿石粉料和浓硫酸的流量以及它们的比例,当发生稀土矿石粉料和浓硫酸的流量比例超出设定的阈值是,能够用声音和图形的方式报警。
1.3设计指标或者要求(1) 要求用 C 语言或者C++语言编写满足设计内容的程序,并调试正确;(2) 撰写设计报告。
2.设计过程2.1程序功能软件要能用适当的方式模拟焙烧炉的尾部有原料堆积的情况以及相应的处理过程,当发生焙烧炉尾部原料堆积时,能够用声音和图形的方式报警;软件要能允许用户在规定范围内设定稀土矿石粉料的流量、稀土矿石粉料和浓硫酸的流量比例以及稀土矿石粉料和浓硫酸的流量比例阈值等三个参数。
2.2算法原理2.3程序流程图2.4程序主要模块或者函数void CMeter::SetScaleDecimals(int nDecimals){m_nScaleDecimals = nDecimals ;ReconstructControl() ;}void CMeter::SetUnits(CString &strUnits){m_strUnits = strUnits ;ReconstructControl() ;}void CMeter::SetValueDecimals(int nDecimals){ 开设置设置判断硫酸流量否是结m_nValueDecimals = nDecimals ;ReconstructControl() ;}void CMeter::DrawNode(CDC *pDC){CPen penDraw, *pPenOld;COLORREF cEdge, cMiddle, cNode;cMiddle = RGB(255, 255, 255);cEdge = RGB(0, 0, 0);for(int i=m_nCenterRadius*3/4; i>=0; i--){cNode = RGB((GetRValue(cEdge)-GetRValue(cMiddle))*((float)i)*4/(3*m_nCenterR adius)+GetRValue(cMiddle),(GetGValue(cEdge)-GetGValue(cMiddle))*((float)i)*4/(3*m_nCenterRa dius)+GetGValue(cMiddle),(GetBValue(cEdge)-GetBValue(cMiddle))*((float)i)*4/(3*m_nCenterRa dius)+GetBValue(cMiddle));penDraw.DeleteObject();penDraw.CreatePen(PS_SOLID, 1, cNode);pPenOld = pDC->SelectObject(&penDraw);pDC->Arc(m_ptMeterCenter.x-i,m_ptMeterCenter.y-i,m_ptMeterCenter.x+i,m_ptMeterCenter.y+i,m_ptMeterCenter.x-i,m_ptMeterCenter.y,m_ptMeterCenter.x-i,m_ptMet erCenter.y);pDC->SelectObject(pPenOld);}}void CMeter::DrawValue(CDC *pDC){int nHeight;CPoint pttemp;CString strtemp;CFont *pFontOld;// 数值显示nHeight = m_nRadiusFrame/5;pttemp = m_rectValue.CenterPoint();strtemp.Format("%.*lf", m_nValueDecimals, m_dCurrentValue);m_font.DeleteObject() ;m_font.CreateFont (nHeight, 0, 0, 0, 400,FALSE, FALSE, 0, ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS, "Arial") ;pFontOld = pDC->SelectObject(&m_font);pDC->SetBkColor(m_colorButton);pDC->SetTextAlign(TA_TOP|TA_CENTER);pDC->TextOut(pttemp.x, pttemp.y, m_strUnits);pDC->TextOut(pttemp.x, pttemp.y+nHeight, strtemp);// 恢复字体和背景色pDC->SelectObject(pFontOld);pDC->SetBkColor(m_colorWindow);}void CMeter::SetSubTicks(int nSubTicks){m_nSubTicks = nSubTicks;ReconstructControl();}void CMeter::SetAngleRange(int nStartAngleDeg, int nEndAngleDeg) {m_nStartAngleDeg = nStartAngleDeg;m_nEndAngleDeg = nEndAngleDeg;ReconstructControl();}3.软件运行或者测试结果在运行时先添加稀土矿石粉料流量和浓硫酸流量,然后点击计算按钮,会自动计算出稀土矿石粉料和浓硫酸流量的比例,然后设定稀土矿石粉料流量与浓硫酸流量比例的阈值,按全部设置成功按钮,若超出阈值,会弹出对话框提想你重新输入,如果正确,则弹出流量设置成功对话框。
4.设计过程中遇到的问题及解决办法在刚开始拿到题的时候,没有一点头绪,但是,经过这几天在图书馆找资料,上网百度,慢慢地才对MFC有了一些了解,但是仅凭这些是远远不能完成这次的程序设计,所以在刚开始的时候,我就慢慢的看课件,从最基本的画矩形,画圆开始,慢慢地练习,最后终于能画出成型了,但是动不了,然我我又找资料,发现是用OnTimer()函数来实现的,经过多次调试,终于完成了这次的课程设计。
5.总结这次的课程设计对我个人来说其实还是比较难的,因为在以前的学习中从来没有接触过MFC,所以在这次课程设计中感觉压力还挺大的。
但是,通过我的努力,我觉得我学到了不少知识,学会了怎么用OnDraw()函数,怎样用MFC作图。
通过这次的课程设计,我觉得在平时对知识的总结和积累非常重要。
不管学习哪门语言,都得学的精通,而且同时要掌握其他计算机语言,不能老师教什么就只学什么,这样远远不够。
就像李老师给我们讲的那样,等工作了好多知识都得自学,我们要时刻保持着不断学习的心态,这样才能学的更好。
而且,必须在平时的学习中养成独立思考的习惯,不能一遇到问题就问别的同学,这样只能使自己的惰性越来越严重,无法真正领悟编程的重要性以及在编程中应该注意的问题。
6.附录(源代码)// Meter.cpp : implementation file#include "stdafx.h"#include "MyMeter.h"#include "Meter.h"#include "math.h"#include "MemDC.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif#define PT_NUM 50//////////////////////////////////////////////////////////////////// /// CMeterCMeter::CMeter(){m_nStartAngleDeg = 225;m_nEndAngleDeg = 315;m_nTicks = 10;m_nSubTicks = 5;m_dMaxValue = 100.0;m_dMinValue = 0.0;m_dCurrentValue = 50.0;m_nScaleDecimals = 0;m_nValueDecimals = 1;m_colorNeedle = RGB(255, 0, 0);m_strUnits = _T("粉料总流量计");m_bColorTick = FALSE;// 颜色表格m_colorTable[0] = RGB(255, 255, 0);m_colorTable[1] = RGB( 0, 255, 0);m_colorTable[2] = RGB(255, 0, 0);m_colorTable[3] = RGB(255,183, 34);m_colorTable[4] = RGB(255, 92, 93);}CMeter::~CMeter(){}BEGIN_MESSAGE_MAP(CMeter, CStatic)//{{AFX_MSG_MAP(CMeter)ON_WM_PAINT()ON_WM_SIZE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()//////////////////////////////////////////////////////////////////// /// CMeter message handlersvoid CMeter::OnPaint(){CPaintDC dc(this); // device context for painting// 获得控件区域GetClientRect (&m_rectCtrl);CMemDC memDC(&dc, &m_rectCtrl);// 选取圆盘边框半径m_nRadiusFrame = max(m_rectCtrl.Height(), m_rectCtrl.Width())*9/21;// 获得仪表盘中心点m_ptMeterCenter = m_rectCtrl.CenterPoint();m_ptMeterCenter.y += m_nRadiusFrame/10;//绘制仪表盘if(m_dcBackground.GetSafeHdc()== NULL|| (m_bitmapBackground.m_hObject == NULL)){m_dcBackground.CreateCompatibleDC(&dc);m_bitmapBackground.CreateCompatibleBitmap(&dc,m_rectCtrl.Width(),m_rectCtrl.Height()) ;m_pBitmapOldBackground = m_dcBackground.SelectObject(&m_bitmapBackground) ;DrawMeterBackground(&m_dcBackground, m_rectCtrl);}memDC.BitBlt(0, 0, m_rectCtrl.Width(), m_rectCtrl.Height(), &m_dcBackground, 0, 0, SRCCOPY) ;// 绘制指针DrawNeedle(&memDC);DrawNode(&memDC);DrawValue(&memDC);// Do not call CStatic::OnPaint() for painting messages}void CMeter::DrawMeterBackground(CDC *pDC, CRect &rect){int nInnerRadius = m_nRadiusFrame*8/10; // 内圆弧半径m_nCenterRadius = m_nRadiusFrame/20; // 中心园半径大小int nFrame = m_nRadiusFrame/18; // 边框厚度double dstepTickDeg = (360.0+m_nStartAngleDeg-m_nEndAngleDeg)/(m_nTicks*m_nSubTicks); // 刻度步进角度int nSubTickR = nInnerRadius+(m_nRadiusFrame-2*nFrame-nInnerRadius)/2;double dDeg = (m_nStartAngleDeg+360.0-m_nEndAngleDeg)/(TABNUM*PT_NUM);CRect rectPanel,rectInnerPanel;CPen penDraw, *pPenOld;CFont *pFontOld;CBrush brushFill, *pBrushOld;POINT ptStart, ptEnd, ptInnerStart, ptInnerEnd;CPoint pointInner[BOUNDARY_POINTS], ptGroup1[PT_NUM*TABNUM+1], ptGroup2[PT_NUM*TABNUM+1];CPoint ptRgn[PT_NUM*2+2];CPoint pttemp;CString strtemp;double dRadPerDeg;double dTickAngleRad;double dTemp;int nRef = 0;int nTickAngle;int nHeight; // 字体大小double dtempangle;// 计算起始角终止角弧度dRadPerDeg = 4.0*atan(1.0)/180.0;m_dLeftAngleRad = (m_nStartAngleDeg-180.0)*dRadPerDeg;m_dRightAngleRad = (m_nEndAngleDeg-360.0)*dRadPerDeg;// 计算圆弧起始终止点及区域ptStart.x = m_ptMeterCenter.x-(int)(m_nRadiusFrame*cos(m_dLeftAngleRad));ptStart.y = m_ptMeterCenter.y+(int)(m_nRadiusFrame*sin(m_dLeftAngleRad));ptEnd.x = m_ptMeterCenter.x+(int)(m_nRadiusFrame*cos(-m_dRightAngleRad));ptEnd.y = m_ptMeterCenter.y+(int)(m_nRadiusFrame*sin(-m_dRightAngleRad));rectPanel.SetRect(m_ptMeterCenter.x-m_nRadiusFrame,m_ptMeterCenter.y-m_nRadiusFrame,m_ptMeterCenter.x+m_nRadiusFrame,m_ptMeterCenter.y+m_nRadiusFrame);// 获取点的位置for(int i=0; i<=PT_NUM*TABNUM; i++){ptGroup1[i].x = m_ptMeterCenter.x + (int)((m_nRadiusFrame-nFrame)*cos((m_nStartAngleDeg-i*dDeg)*dRadPerD eg));ptGroup1[i].y = m_ptMeterCenter.y - (int)((m_nRadiusFrame-nFrame)*sin((m_nStartAngleDeg-i*dDeg)*dRadPerD eg));ptGroup2[i].x = m_ptMeterCenter.x + (int)(m_nRadiusFrame*8*cos((m_nStartAngleDeg-i*dDeg)*dRadPerDeg)/10) ;ptGroup2[i].y = m_ptMeterCenter.y - (int)(m_nRadiusFrame*8*sin((m_nStartAngleDeg-i*dDeg)*dRadPerDeg)/10) ;}// 获取系统颜色;m_colorWindow = GetSysColor(COLOR_WINDOW);m_colorButton = GetSysColor(COLOR_BTNFACE);m_colorShadow = GetSysColor(COLOR_BTNSHADOW);m_colorHighlight = GetSysColor(COLOR_BTNHIGHLIGHT);m_colorText = GetSysColor(COLOR_BTNTEXT);// 临时使用的颜色COLORREF colorCaption, cEdge, cMiddle;cMiddle = RGB(255, 255, 255);cEdge = RGB(96, 96, 255);// 用按钮色绘制背景brushFill.DeleteObject();brushFill.CreateSolidBrush(m_colorButton);pBrushOld = pDC->SelectObject(&brushFill);pDC->Rectangle(rect);pDC->SelectObject(pBrushOld);// 绘制圆盘边框for(int iOnBand=nFrame; iOnBand>0; iOnBand--){penDraw.DeleteObject();colorCaption = RGB((GetRValue(cEdge)-GetRValue(cMiddle))*((float)iOnBand)/nFrame+Ge tRValue(cMiddle),(GetGValue(cEdge)-GetGValue(cMiddle))*((float)iOnBand)/nFrame+Get GValue(cMiddle),(GetBValue(cEdge)-GetBValue(cMiddle))*((float)iOnBand)/nFrame+Get BValue(cMiddle));penDraw.CreatePen(PS_SOLID, iOnBand*2, colorCaption);pPenOld = pDC->SelectObject(&penDraw);pDC->Arc(&rectPanel, ptEnd, ptStart);pDC->SelectObject(pPenOld);}// 绘制内圈ptInnerStart.x = m_ptMeterCenter.x-(int)(nInnerRadius*cos(m_dLeftAngleRad));ptInnerStart.y = m_ptMeterCenter.y+(int)(nInnerRadius*sin(m_dLeftAngleRad));ptInnerEnd.x = m_ptMeterCenter.x+(int)(nInnerRadius*cos(-m_dRightAngleRad));ptInnerEnd.y = m_ptMeterCenter.y+(int)(nInnerRadius*sin(-m_dRightAngleRad));rectInnerPanel.SetRect(m_ptMeterCenter.x-nInnerRadius,m_ptMeterCenter.y-nInnerRadius,m_ptMeterCenter.x+nInnerRadius ,m_ptMeterCenter.y+nInnerRadius);penDraw.DeleteObject();penDraw.CreatePen(PS_SOLID, 1, RGB(255,255,0));pPenOld = pDC->SelectObject(&penDraw);pDC->Arc(&rectInnerPanel, ptInnerEnd, ptInnerStart);pDC->SelectObject(pPenOld);if(m_bColorTick){// 绘制色彩刻度for(i=0; i<TABNUM; i++){//确定区域for(int j=0; j<=PT_NUM; j++){ptRgn[j] = ptGroup1[i*PT_NUM+j];ptRgn[2*PT_NUM+1-j] = ptGroup2[i*PT_NUM+j];}brushFill.DeleteObject();brushFill.CreateSolidBrush(m_colorTable[i]);pBrushOld = pDC->SelectObject(&brushFill);penDraw.DeleteObject();penDraw.CreatePen(PS_SOLID, 1, m_colorTable[i]);pPenOld = pDC->SelectObject(&penDraw);pDC->Polygon(ptRgn, 2*PT_NUM+2);pDC->SelectObject(pBrushOld);pDC->SelectObject(pPenOld);}}// 计算刻度点,避免不能整除引起较大误差*100for(nTickAngle=m_nStartAngleDeg*100;nTickAngle>=(m_nEndAngleDeg-360)*100;nTickAngle-=(int)(dstepTickDeg*100)){// 转换成弧度dTickAngleRad = (double)nTickAngle/100*dRadPerDeg;// 确定外圈坐标// 确定x坐标dTemp = m_ptMeterCenter.x + (m_nRadiusFrame-2*nFrame)*cos(dTickAngleRad);m_pointBoundary[nRef].x = ROUND(dTemp);// 确定y坐标dTemp = m_ptMeterCenter.y - (m_nRadiusFrame-2*nFrame)*sin(dTickAngleRad);m_pointBoundary[nRef].y = ROUND(dTemp);// 确定刻度点(主刻度和子刻度)//主刻度及文本标注点if(nRef%m_nSubTicks == 0){dTemp = m_ptMeterCenter.x + nInnerRadius*cos(dTickAngleRad);pointInner[nRef].x = ROUND(dTemp);dTemp = m_ptMeterCenter.y - nInnerRadius*sin(dTickAngleRad);pointInner[nRef].y = ROUND(dTemp);}// 子刻度else{dTemp = m_ptMeterCenter.x + nSubTickR*cos(dTickAngleRad);pointInner[nRef].x = ROUND(dTemp);dTemp = m_ptMeterCenter.y - nSubTickR*sin(dTickAngleRad);pointInner[nRef].y = ROUND(dTemp);}nRef++ ;}// 多边形区域m_rgnBoundary.DeleteObject() ;m_rgnBoundary.CreatePolygonRgn(m_pointBoundary, nRef, ALTERNATE);m_rectValue.top = m_ptMeterCenter.y + m_nRadiusFrame/5;m_rectValue.bottom = m_ptMeterCenter.y + m_nRadiusFrame/2;m_rectValue.left = m_ptMeterCenter.x - m_nRadiusFrame/2;m_rectValue.right = m_ptMeterCenter.x + m_nRadiusFrame/2;// 绘制刻度penDraw.DeleteObject();penDraw.CreatePen(PS_SOLID, 1, RGB(0,0,0));pPenOld = pDC->SelectObject(&penDraw);for(i=0; i<nRef; i++){pDC->MoveTo(m_pointBoundary[i]);pDC->LineTo(pointInner[i]);}pDC->SelectObject(pPenOld);// 刻度标号// 确定字体大小nHeight = m_nRadiusFrame/6;m_font.CreateFont(nHeight, 0, 0, 0, 400,FALSE, FALSE, 0, ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS, "Arial");pFontOld = pDC->SelectObject(&m_font);pDC->SetBkMode(TRANSPARENT);for(i=0; i<=m_nTicks; i++){dtempangle = m_nStartAngleDeg-i*m_nSubTicks*dstepTickDeg;strtemp.Format("%.*lf", m_nScaleDecimals, (m_dMinValue+(m_dMaxValue-m_dMinValue)*i/m_nTicks));if(dtempangle>190){pDC->SetTextAlign(TA_BOTTOM|TA_LEFT);pDC->TextOut(pointInner[m_nSubTicks*i].x,pointInner[m_nSubTicks*i].y+nHeight/2, strtemp);}else if(dtempangle>170){pDC->SetTextAlign(TA_BASELINE|TA_LEFT);pDC->TextOut(pointInner[m_nSubTicks*i].x,pointInner[m_nSubTicks*i].y+nHeight/3, strtemp);}else if(dtempangle>135){pDC->SetTextAlign(TA_BASELINE|TA_LEFT);pDC->TextOut(pointInner[m_nSubTicks*i].x,pointInner[m_nSubTicks*i].y+nHeight/2, strtemp);}else if(dtempangle>100){pDC->SetTextAlign(TA_TOP|TA_LEFT);pDC->TextOut(pointInner[m_nSubTicks*i].x-nHeight/4,pointInner[m_nSubTicks*i].y-nHeight/8, strtemp);}else if(dtempangle>80){pDC->SetTextAlign(TA_TOP|TA_CENTER);pDC->TextOut(pointInner[m_nSubTicks*i].x,pointInner[m_nSubTicks*i].y, strtemp);}else if(dtempangle>45){pDC->SetTextAlign(TA_BOTTOM|TA_RIGHT);pDC->TextOut(pointInner[m_nSubTicks*i].x+nHeight/3, pointInner[m_nSubTicks*i].y+nHeight, strtemp);}else if(dtempangle>10){pDC->SetTextAlign(TA_RIGHT|TA_BASELINE);pDC->TextOut(pointInner[m_nSubTicks*i].x,pointInner[m_nSubTicks*i].y+nHeight/2, strtemp);}else if(dtempangle>-10){pDC->SetTextAlign(TA_RIGHT|TA_BASELINE);pDC->TextOut(pointInner[m_nSubTicks*i].x,pointInner[m_nSubTicks*i].y+nHeight/3, strtemp);}else{pDC->SetTextAlign(TA_RIGHT|TA_BOTTOM);pDC->TextOut(pointInner[m_nSubTicks*i].x,pointInner[m_nSubTicks*i].y+nHeight/2, strtemp);}}pDC->SelectObject(pFontOld);}void CMeter::ReconstructControl(){if ((m_pBitmapOldBackground) &&(m_bitmapBackground.GetSafeHandle()) &&(m_dcBackground.GetSafeHdc())){m_dcBackground.SelectObject(m_pBitmapOldBackground);m_dcBackground.DeleteDC() ;m_bitmapBackground.DeleteObject();}Invalidate ();}void CMeter::OnSize(UINT nType, int cx, int cy){CStatic::OnSize(nType, cx, cy);// TODO: Add your message handler code hereReconstructControl() ;}void CMeter::DrawNeedle(CDC *pDC){int nResult;double dRadPerDeg = 4.0*atan(1.0)/180.0;double dAngleDeg;double dAngleRad ;double dTemp ;CBrush brushFill, *pBrushOld ;CPen penDraw, *pPenOld ;CPoint pointNeedle[4] ; // 指针由四边形组成// 计算角度并限定指针走的角度dAngleDeg = m_nStartAngleDeg-(360.0+m_nStartAngleDeg-m_nEndAngleDeg)*(m_dCurrentValue-m_dMinValue)/(m_dMaxValue-m_dMinValue);dAngleDeg = min(dAngleDeg, m_nStartAngleDeg);dAngleDeg = max(dAngleDeg, m_nEndAngleDeg-360.0);dAngleRad = dAngleDeg*dRadPerDeg;// 计算三角形底边两个点pointNeedle[0].x = m_ptMeterCenter.x - (int)(m_nCenterRadius*10*sin(dAngleRad)/8);pointNeedle[0].y = m_ptMeterCenter.y - (int)(m_nCenterRadius*10*cos(dAngleRad)/8);pointNeedle[2].x = m_ptMeterCenter.x + (int)(m_nCenterRadius*10*sin(dAngleRad)/8);pointNeedle[2].y = m_ptMeterCenter.y + (int)(m_nCenterRadius*10*cos(dAngleRad)/8);// 计算指针顶部坐标dTemp = m_ptMeterCenter.x + m_nRadiusFrame*cos(dAngleRad)*95/100;pointNeedle[1].x = ROUND(dTemp);dTemp = m_ptMeterCenter.y - m_nRadiusFrame*sin(dAngleRad)*95/100;pointNeedle[1].y = ROUND(dTemp);// 计算指针尾部坐标dTemp = m_ptMeterCenter.x - m_nRadiusFrame*cos(dAngleRad)/6;pointNeedle[3].x = ROUND(dTemp);dTemp = m_ptMeterCenter.y + m_nRadiusFrame*sin(dAngleRad)/6;pointNeedle[3].y = ROUND(dTemp);pDC->SelectClipRgn(&m_rgnBoundary);brushFill.CreateSolidBrush(m_colorNeedle); penDraw.CreatePen(PS_SOLID, 1, m_colorNeedle); pPenOld = pDC->SelectObject(&penDraw) ;pBrushOld = pDC->SelectObject(&brushFill) ;// 绘制指针pDC->Polygon(pointNeedle, 4);nResult = pDC->SelectClipRgn(NULL);pDC->SelectObject(pPenOld);pDC->SelectObject(pBrushOld);// 立体感处理if(dAngleDeg>90){penDraw.DeleteObject();penDraw.CreatePen(PS_SOLID, 2, m_colorShadow);pPenOld = pDC->SelectObject(&penDraw);pDC->MoveTo(pointNeedle[1]);pDC->LineTo(pointNeedle[0]);pDC->LineTo(pointNeedle[3]);pDC->SelectObject(pPenOld);penDraw.DeleteObject();penDraw.CreatePen(PS_SOLID, 1, m_colorHighlight);pPenOld = pDC->SelectObject(&penDraw);pDC->MoveTo(pointNeedle[1]);pDC->LineTo(pointNeedle[2]);pDC->LineTo(pointNeedle[3]);pDC->SelectObject(pPenOld);}else{penDraw.DeleteObject();penDraw.CreatePen(PS_SOLID, 2, m_colorShadow);pPenOld = pDC->SelectObject(&penDraw);pDC->MoveTo(pointNeedle[1]);pDC->LineTo(pointNeedle[2]);pDC->LineTo(pointNeedle[3]);pDC->SelectObject(pPenOld);penDraw.DeleteObject();penDraw.CreatePen(PS_SOLID, 1, m_colorHighlight);pPenOld = pDC->SelectObject(&penDraw);pDC->MoveTo(pointNeedle[1]);pDC->LineTo(pointNeedle[0]);pDC->LineTo(pointNeedle[3]);pDC->SelectObject(pPenOld);}}void CMeter::UpdateNeedle(double dValue){m_dCurrentValue = dValue;Invalidate();}void CMeter::SetNeedleColor(COLORREF colorNeedle){m_colorNeedle = colorNeedle ;ReconstructControl() ;}void CMeter::SetRange(double dMin, double dMax){m_dMaxValue = dMax ;m_dMinValue = dMin ;ReconstructControl() ;}void CMeter::SetScaleDecimals(int nDecimals){m_nScaleDecimals = nDecimals ;ReconstructControl() ;}void CMeter::SetUnits(CString &strUnits){m_strUnits = strUnits ;ReconstructControl() ;}void CMeter::SetValueDecimals(int nDecimals){m_nValueDecimals = nDecimals ;ReconstructControl() ;}void CMeter::DrawNode(CDC *pDC){CPen penDraw, *pPenOld;COLORREF cEdge, cMiddle, cNode;cMiddle = RGB(255, 255, 255);cEdge = RGB(0, 0, 0);for(int i=m_nCenterRadius*3/4; i>=0; i--){cNode = RGB((GetRValue(cEdge)-GetRValue(cMiddle))*((float)i)*4/(3*m_nCenterRadius)+GetRValue(cMiddle),(GetGValue(cEdge)-GetGValue(cMiddle))*((float)i)*4/(3*m_nCenterRa dius)+GetGValue(cMiddle),(GetBValue(cEdge)-GetBValue(cMiddle))*((float)i)*4/(3*m_nCenterRa dius)+GetBValue(cMiddle));penDraw.DeleteObject();penDraw.CreatePen(PS_SOLID, 1, cNode);pPenOld = pDC->SelectObject(&penDraw);pDC->Arc(m_ptMeterCenter.x-i,m_ptMeterCenter.y-i,m_ptMeterCenter.x+i,m_ptMeterCenter.y+i,m_ptMeterCenter.x-i,m_ptMeterCenter.y,m_ptMeterCenter.x-i,m_ptMet erCenter.y);pDC->SelectObject(pPenOld);}}void CMeter::SetColorTick(BOOL bColorTick){m_bColorTick = bColorTick;ReconstructControl();}void CMeter::DrawValue(CDC *pDC){int nHeight;CPoint pttemp;CString strtemp;CFont *pFontOld;// 数值显示nHeight = m_nRadiusFrame/5;pttemp = m_rectValue.CenterPoint();strtemp.Format("%.*lf", m_nValueDecimals, m_dCurrentValue);m_font.DeleteObject() ;m_font.CreateFont (nHeight, 0, 0, 0, 400,FALSE, FALSE, 0, ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS, "Arial") ;pFontOld = pDC->SelectObject(&m_font);pDC->SetBkColor(m_colorButton);pDC->SetTextAlign(TA_TOP|TA_CENTER);pDC->TextOut(pttemp.x, pttemp.y, m_strUnits);pDC->TextOut(pttemp.x, pttemp.y+nHeight, strtemp);// 恢复字体和背景色pDC->SelectObject(pFontOld);pDC->SetBkColor(m_colorWindow);}void CMeter::SetTicks(int nTicks){m_nTicks = nTicks;ReconstructControl();}void CMeter::SetSubTicks(int nSubTicks){m_nSubTicks = nSubTicks;ReconstructControl();}void CMeter::SetAngleRange(int nStartAngleDeg, int nEndAngleDeg) {m_nStartAngleDeg = nStartAngleDeg;m_nEndAngleDeg = nEndAngleDeg;ReconstructControl();}。