用MFC如何高效地绘图.net

2024-05-03

用MFC如何高效地绘图.net(精选3篇)

篇1:用MFC如何高效地绘图.net

显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题,而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的 解决方案 。MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高

显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈我的一些观点。

1、显示的图形为什么会闪烁?

我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。如果将背景刷设置成NULL,这样无论怎样重绘图形都不会闪了。当然,这样做会使得窗口的显示乱成一团,因为重绘时没有背景色对原来绘制的图形进行清除,而又叠加上了新的图形。

有的人会说,闪烁是因为绘图的速度太慢或者显示的图形太复杂造成的,其实这样说并不对,绘图的显示速度对闪烁的影响不是根本性的。

例如在OnDraw(CDC *pDC)中这样写:

pDC->MoveTo(0,0);

pDC->LineTo(100,100);

这个绘图过程应该是非常简单、非常快了吧,但是拉动窗口变化时还是会看见闪烁。其实从道理上讲,画图的过程越复杂越慢闪烁应该越少,因为绘图用的时间与用背景清除屏幕所花的时间的比例越大人对闪烁的感觉会越不明显。

比如:清楚屏幕时间为1s绘图时间也是为1s,这样在10s内的连续重画中就要闪烁5次;如果清楚屏幕时间为1s不变,而绘图时间为9s,这样10s内的连续重画只会闪烁一次。这个也可以试验,在OnDraw(CDC *pDC)中这样写:

for(int i=0;i<100000;i++)

{

pDC->MoveTo(0,i);

pDC->LineTo(1000,i);

}

呵呵,程序有点变态,但是能说明问题。

说到这里可能又有人要说了,为什么一个简单图形看起来没有复杂图形那么闪呢?这是因为复杂图形占的面积大,重画时造成的反差比较大,所以感觉上要闪得厉害一些,但是闪烁频率要低。

那为什么动画的重画频率高,而看起来却不闪?这里,我就要再次强调了,闪烁是什么?闪烁就是反差,反差越大,闪烁越厉害。因为动画的连续两个帧之间的差异很小所以看起来不闪。如果不信,可以在动画的每一帧中间加一张纯白的帧,不闪才怪呢。

2、如何避免闪烁

在知道图形显示闪烁的原因之后,对症下药就好办了。首先当然是去掉MFC提供的背景绘制过程了。实现的方法很多,

* 可以在窗口形成时给窗口的注册类的背景刷付NULL

* 也可以在形成以后修改背景

static CBrush brush(RGB(255,0,0));

SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush);

* 要简单也可以重载OnEraseBkgnd(CDC* pDC)直接返回TRUE

这样背景没有了,结果图形显示的确不闪了,但是显示也象前面所说的一样,变得一团乱。怎么办?这就要用到双缓存的方法了。双缓冲就是除了在屏幕上有图形进行显示以外,在内存中也有图形在绘制,

我们可以把要显示的图形先在内存中绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快,因为是非常规整的内存拷贝)。这样在内存中绘图时,随便用什么反差大的背景色进行清除都不会闪,因为看不见。当贴到屏幕上时,因为内存中最终的图形与屏幕显示图形差别很小(如果没有运动,当然就没有差别),这样看起来就不会闪。

3、如何实现双缓冲

首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:

CDC MemDC; //首先定义一个显示设备对象

CBitmap MemBitmap;//定义一个位图对象

//随后建立与屏幕显示兼容的内存显示设备

MemDC.CreateCompatibleDC(NULL);

//这时还不能绘图,因为没有地方画 ^_^

//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小

MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);

//将位图选入到内存显示设备中

//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上

CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

//先用背景色将位图清除干净,这里我用的是白色作为背景

//你也可以用自己应该用的颜色

MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));

//绘图

MemDC.MoveTo(……);

MemDC.LineTo(……);

//将内存中的图拷贝到屏幕上进行显示

pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);

//绘图完成后的清理

MemBitmap.DeleteObject();

MemDC.DeleteDC();

上面的注释应该很详尽了,废话就不多说了。

4、如何提高绘图的效率

我主要做的是电力系统的网络图形的CAD软件,在一个窗口中往往要显示成千上万个电力元件,而每个元件又是由点、线、圆等基本图形构成。如果真要在一次重绘过程重画这么多元件,可想而知这个过程是非常漫长的。如果加上了图形的浏览功能,鼠标拖动图形滚动时需要进行大量的重绘,速度会慢得让用户将无法忍受。怎么办?只有再研究研究MFC的绘图过程了。

实际上,在OnDraw(CDC *pDC)中绘制的图并不是所有都显示了的,例如:你在OnDraw中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很有可能只有一个显示了,这是因为MFC本身为了提高重绘的效率设置了裁剪区。裁剪区的作用就是:只有在这个区内的绘图过程才会真正有效,在区外的是无效的,即使在区外执行了绘图函数也是不会显示的。因为多数情况下窗口重绘的产生大多是因为窗口部分被遮挡或者窗口有滚动发生,改变的区域并不是整个图形而只有一小部分,这一部分需要改变的就是pDC中的裁剪区了。因为显示(往内存或者显存都叫显示)比绘图过程的计算要费时得多,有了裁剪区后显示的就只是应该显示的部分,大大提高了显示效率。但是这个裁剪区是MFC设置的,它已经为我们提高了显示效率,在进行复杂图形的绘制时如何进一步提高效率呢?那就只有去掉在裁剪区外的绘图过程了。可以先用pDC->GetClipBox()得到裁剪区,然后在绘图时判断你的图形是否在这个区内,如果在就画,不在就不画。

如果你的绘图过程不复杂,这样做可能对你的绘图效率不会有提高

原文转自:www.ltesting.net

篇2:如何高效地开展初中化学用语教学

一、初中化学思维方式的特点

我们知道, 化学是研究物质组成、结构、性质与变化规律的一门自然科学, 它要求学者从多种角度认识物质的性质, 在宏观方面要会观察, 在微观方面要有想象力, 否则就无法理解其本质特性, 而化学用语, 是用符号来表示事物。化学用语所使用的符号, 是进行化学思维活动的工具。因此, 欲让学生掌握化学用语的符号, 就要从物质的宏观、微观的角度来认识化学。在具体的教学中, 我们要重视学生掌握物质的宏观与微观的表征, 使其与相应的符号融合一体。

宏观表征是学生对物质外观在头脑中的反映, 也就是指物质的物理性质、化学性质的具体体现。比如, 铁丝在纯净的氧气中燃烧, 学生通过观察, 就能知道铁丝是什么样的, 氧气是无色的气体, 通过实验操作, 就能知道铁丝燃烧需要氧气, 在化学反应时, 产生火星, 放出大量的热。学生通过一些的感知, 就能形成对铁丝这种物质的宏观认识。可见, 学生对物质的宏观表征的掌握, 难度不是很大。

物质的微观表征, 常常是不容易观察的, 比如原子的结构、分子运动的规律等。它需要学生想象才能掌握。因此, 在具体的教学中, 我们要采用各种有效手段, 让学生正确地掌握物质的微观表征, 比如, 在教学中可以利用模型, 借助电脑动画帮助学生形成正确的微观表征。

化学用语符号, 是指用规定的字母或特定的图形来反映事物的本质, 学生对此学习有一定的难度。化学用语的符号, 虽然简洁, 但有一定的规律, 如果我们能让学生掌握其规律, 就能有效地提高教学效率。比如, H2O从宏观上来讲, 它表示水这种物质, 水是由氢、氧两种元素组成;从微观上讲, 它表示一个水分子, 一个水分子又由二个氢原子与一个氧原子构成。因此, 在具体的化学用语的教学中, 我们必须让学生掌握符号所表示的物质宏观、微观的本质, 只有将符号与物质的宏观、微观特征联系起来教学, 才能使学生正确、更好地掌握, 如果用死记硬背, 大搞题海战术的方式进行灌输式教学, 教学效率就无从提高。

二、有效提高初中化学用语教学的策略

1. 培养学生想象的思维能力

我们知道, 化学用语符号是抽象的, 在具体的教学中, 我们要激发学生的思维, 让学生能正确的想象。在初中阶段, 大多学生的思维倾向于直观、形象, 这也是很多初中学生觉得化学用语不好学的原因所在。因此, 在化学用语教学中, 我们要利用学生的生活经验, 激发学生去想象, 帮助学生理解化学符号所表示的物质本质。比如, 一滴水是由无数个看不见的水分子“聚集”出来的, 就像一堆水稻, 是由无数个稻子堆积起来一样。在实际的教学中, 我们要善于组织好教学用语, 利用精心设计的语言, 引导学生去思维, 帮助学生理解物质的微观表征。比如, 分子是保持物质化学性质的最小微粒, 它是由原子构成的。很多学生很难理解, 分子既然是由原子构成的, 那么保持物质化学性质的最小微粒应该就是原子了!这时候就要引导学生去想象:比如, 一杯水里有很多水分子, 就像地球上有很多人一样, 而水分子由氢原子和氧原子构成, 就像人由四肢、躯干等构成一样。学生经过思维的想象, 就能初步理解分子与原子的不同点, 从而使学生掌握分子是保持物质化学性质最小微粒的含义。

2. 培养学生发散的思维能力

我们知道, 初中学生在学习化学方程式时, 感到特别的难, 如果让学生死记应背, 对于学生来说, 负担太重, 势必会挫伤学生学习化学的积极性, 而且教学效果也比较差。那么在具体的教学中, 如何克服这一教学难点, 提高教学效率呢?教学实践证明, 首先让学生对学习的化学符号进行思维发散, 丰富他们的认识。比如, 碳的符号是C, 然后就让学生想象它像耳朵、像半个月亮、又像钻石戒指……然后再引导学生对化学方程式的含义进行分析, 最后在描述物质反应时, 结合文字表达形成化学方程式。在教学中, 如果能结合相应的化学实验, 就能更好地提高教学效率。

摘要:我们知道, 对于初中学生来说, 他们在化学学习时, 首先会遇到化学用语的学习困难, 如果不能有效地化解, 势必会影响到以后的进一步深入的学习。本文就此问题进行阐述, 供大家参考。

篇3:基于MFC的绘图软件设计与实现

关键词:MFC,绘图,GDI,软件设计,解决方案

1 概述

绘图软件可以说是一个用来作图的软件,通常是指计算机中的一组用于绘图和显示图片的程序,它的开发语言和技术已经应用很广泛。绘图软件的开发一般是高级算法语言,以子程序的方式进行实现,其中,它的每个子程序是独立有绘图功能。简而言之,绘图软件就是将我们通常所见的所需要的图像抽象成线条,运用高级算法编程技术对这些点和线条进行组合,加色,保存,编辑等的软件。

MFC(Microsoft Foundation Classes),是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。运用MFC所包含的控件和类结合Windows GDI+技术实现一个绘图软件,既可以达到绘图的功能又能减少软件开发人员的工作量,该文接下来就介绍了这样一款绘图软件的设计及实现过程。

2 软件原理

2.1 GDI+技术原理

GDI+从Windows系统中开始引入一系列的技术来实现常用的功能,这些是基于之前比较老的GDI版本。GDI+加强了可视化的属性,最主要的就是操作界面和图像的边界透明技术,同时改进旧版本的GDi之后,能够提供多维的矢量图形和直接实现了各种格式图片之间的相互转换,主要的格式包括JPEG,GIF,BMP,JPG等。它还有一大改进就是能够生成多种格式的图片,当然也不仅仅局限于图片,比如我们常说的动画Flash也可以生成。GDI+最大的特点应属它的高效率和高稳定性进行图片的组合和显示,通过使用ARGB的值来表示颜色,利用双缓冲技术和从硬件底层实现访问硬件来提高硬件加速来提高绘图效率和图像的信息交换的稳定性。

2.2 计算机图形学原理

MFC画笔:当要进行颜色选择时,必须涉及到更改画笔的初始状态。画笔是一种用来画线以及绘制有形边框的工具。在MFC中,用Cpen类来封装GD I的画笔对象。Cpen类的重要构造函数为:

2.3 MFC技术原理

介绍MFC技术原理之前要先了解几个基本概念,Windows编程,API,SDK。Windows编程技术:Windwos编程机制是Windows应用程序是按照“事件→消息→处理”非顺序的机制运行,当有某个事件(如单击鼠标、键盘输入和执行菜单命令等)发生时,Windows会根据具体的事件产生对应的消息,并发送到指定应用程序的消息队列;应用程序从消息队列中取出消息,并根据不同的消息进行不同的处理。其中的消息是API的重点,消息的结构一般为:

Windows API(Application Programming Interface):Windows操作系统与应用程序之间的标准接口,它提供了上千个标准函数、宏和数据结构的定义。SDK编程:程序员通过调用API函数,自己动手、按部就班地实现程序各部分的功能。SDK应用程序的结构比较清晰,但程序员必须编写所有的功能代码。

MFC作为一个Windows编程类库,它包含了200多个类,封装了Windows的大部分编程对象以及与它们有关的操作。虽然程序在功能上千差万别,但从本质上看,都可以分为用户界面设计、文件操作、数据库访问及多媒体使用等几部分,这些都可以通过一些类来实现。MFC提供了一个标准化的程序结构,使开发人员不必从头设计一个Windows应用程序。MFC实际上是一个庞大的文件库,它由几百个执行文件和源代码文件(如H文件)组成。它具有完全支持Windows所有的函数、控件、消息、菜单及对话框;具有良好的稳定性和可移植性,更符合微软的风格等等其他框架或者说是技术的不具备的优势。MFC程序在运行是通过调用以上说说的类库中的类进行生成对象,通过运行对象来调用类进行功能的实现。该文总结了类库中类的对象和MFC框架下应用程序之间的关系。

上面简单的介绍了GDI+编程技术原理,计算机图形学原理,MFC技术原理,这三项技术是基于MFC框架绘图软件的技术支撑。下面将主要介绍绘图软件的设计与实现的过程,包括软件的主要功能和关键代码已经实现的步骤。

3 软件的设计

基于MFC的绘图软件采用了MFC和Windows下的GDI+编程技术,通过计算机图形学思想实现图片的绘制,主要是以点构线,以线构图,同时加以色彩的渲染,将这些元素最终组合成一个图。可以存储成规定的格式,关闭软件之后还可以进行打开编辑,可以设置图形中元素的属性以及图片的相关特性。

3.1 功能设计

基于MFC的本绘图软件功能分为基本功能和高级功能。基本功能是针对的对象是一般的软件使用者,而高级功能则针对的对象是有特性需求的软件使用者。

1)图形绘制。运用C++编程语言,实现绘制简单的图形,包括直线、曲线、椭圆、矩形、标准圆等基本图形。

2)文字。可以输入文字,并且对文字的属性进行编辑,文字属性主要包括字体、字号、方向等。

3)多重不规则图形。通过线段和图形绘制技术,获取客户区鼠标的点击位置作为不规则图形的点,然后描绘点间的线,最后形成封闭的多重的不规则的多边形。

4)图形变换。通过编程实现对绘图区中基本图元的移动、缩放,修改等操作。

5)文件编辑。文件可以保存成任意类型,比如JPG、XML、GIF、FLASH等格式,但是会对其中一种或多种可以实现保存打开后继续编辑属性。

6)模块编辑。软件使用者可以根据自己的需求编写相应的模块,通过软件接口进行加载,实现特定功能。

7)图形色彩处理。根据客户需求,增加颜色的种类和色彩深度,可对图形进行颜色填充,滤镜处理等高级功能。

3.2 结构设计

本绘图软件是基于MFC,系统结构设计如图2:

3.3 模块设计

1)图形绘制模块。实现包括直线、圆等基本图形的绘制以及文本的输入编辑等功能。

2)工具箱模块。实现获取鼠标位置,清空绘图区,设置绘图区,颜色控制等功能。

3)图形编辑模块。实现图形的缩放、移动、变换等功能。

4)图形保存模块。实现图形的各种格式的保存,主要提供矢量和位图的格式保存已经本软件可以编辑的ED格式。

5)图元属性模块。控制图元的颜色属性,画笔属性,设计风格模式,背景模式等功能。

4 软件的实现

本绘图软件通过Skin Sharp技术,使得软件有良好的用户界面。主界面主要包括工具栏、菜单栏、绘图区、图元属性页。

4.1 图形存储

图形存储一般会采用数据文件的形式来存储数据,其中用的基本是链表或者是容器进行数据动态存储,这样的实现具有存储容量小、方便动态修改、容错率高、效率高等特点。

4.2 菜单栏

菜单栏是位于绘图软件主界面的上方。菜单栏主要包括文件、编辑、查看、窗口、帮助等。“文件”菜单:该菜单主要是对文件整体进行操作。主要实现的功能是文件保存、文件另存为位图、图片打印及预览、文件打开等功能。“编辑”菜单:该菜单主要是对绘图以及图元进行操作。主要实现的功能是设置绘图区域、清洁绘图区、清除操作、锁定图元属性、恢复操作、鼠标捕捉等功能。“查看”菜单:该菜单主要是对各种工具栏和属性框是否显示进行操作。“窗口”菜单:该菜单是针对窗口的显示模式进行操作。“帮助”菜单:提供软件帮助和关于信息的基本信息。

4.3 图元属性页

图元属性页主要是对图元的属性进行操作的页面。图元属性页包括风格设定和颜色设定。风格设定又分为:画笔设定、画刷设定、背景模式设定。同样的,颜色设定也分为画笔颜色设定、画刷颜色设定、背景颜色设定。

4.4 工具栏

工具栏分为基本功能工具栏、文字工具栏、绘图工具栏。

4.5 绘图区

绘图区中可以实现图形绘制已经文字编辑,是绘图软件的主体部分。

5 结论

本文基于MFC框架下运用GDI+编程技术,介绍了主要的Windows系统下C++编程中对于绘图的技术,通过这些技术和STL(模板类库)实现对图形的绘制和保存及编辑等功能。

利用Skin Sharp和Windows自带的自绘实现对界面的优化,利用编程技术实现了基本的绘图和对图片的各种操作以及高级的模块动态加载功能。

综合以上可以看出,该文力在介绍基于MFC的绘图软件的设计及实现的主要过程。目前,该绘图软件已经拥有良好的用户界面,实现了对基本图形的绘制已经各项基本操作,但对复杂图形的绘制及操作需要用户自行加载模块,处理复杂图形能力相对薄弱。后期研究将主要针对复杂图形的绘制已经操作进行。

参考文献

[1]唐勇,彭刚,皮开文.Autodrawer绘图软件的设计与实现[J].实验科学与技术,2008(3).

[2]何宜军.基于VB与Mathematica的数学绘图软件设计与实现[J].科学技术与工程,2007(4).

[3]曹恒,冯仲科,张茜.CASS软件林业制图功能模块的设计与实现[J].农业工程学报,2012(6).

[4]Zhang Q,Benveniste A.Wavelet network[J].IEEE Trans.On Neural Networks,1992,8(3):889-898.

[5]Zhang J,Walter G G,Lee W N.Wavelet neural network for function learning[J].IEEE Trans.On Signal Processing,1995,43:1485-1497.

上一篇:铁血铸英魂--参观郑州市烈士陵园有感下一篇:描写观察的三年级作文参考