画图时屏幕闪烁的原因和解决方法

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

1、显示的图形为什么会闪烁?
   我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示
时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色将
显示区清除,然后才调用OnPaint,而背景色往往与绘图内容反差很大,这样在短
时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。如果将背景刷
设置成NULL,这样无论怎样重绘图形都不会闪了。当然,这样做会使得窗口的显
示乱成一团,因为重绘时没有背景色对原来绘制的图形进行清除,而又叠加上了
新的图形。有的人会说,闪烁是因为绘图的速度太慢或者显示的图形太复杂造成
的,其实这样说并不对,绘图的显示速度对闪烁的影响不是根本性的。例如在On
Draw(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()得到裁剪区,然后
在绘图时判断你的图形是否在这个区内,如果在就画,不在就不画。
如果你的绘图过程不复杂,这样做可能对你的绘图效率不会有提高。





VC入门的一条路 
 
 
首先声明,我可不是什么高手,也就是刚脱贫。因为运气很好,买到了几本好书
,在学习过程中几乎没走什么弯路,没费什么劲就入门了,现在一般的小程序能
搞定了。看到那些因为不知从何下手而苦苦挣扎的朋友,希望我的文章能给他们
一些帮助。

学编程急不得,上来就学VC肯定碰一头灰,说VC难就难在这点上了。如果硬上,
意志坚强的话也许能挺过来,但也是会缺乏后劲,不得不回过头来补习基础知识
。意志不坚强的话,很有可能就此放弃了,并留下一个VC难得不得了的印象。其
实,只要踏踏实实一步一步来,VC也就是很简单点事。在这里我说一下,如果你
还只是一个初中生,那么你就应当仔细考虑一下了。首先,限于你的知识和思维
能力,学学C语言还应该没问题,但要学VC是要下相当大的功夫的。而且,你现在
学到的东西将来一定会过时,所以不如把精力放在算法的研究上,毕竟这些东西
永远都不会过时。

我觉着如果走对路子,入门VC,一个暑假应该够用了。

虽说学VC并不是传说的那么难,可不下些苦功夫是学不成的。在学VC前,你必须
确定,你是因为热爱编程才学VC的,而不是出于炫耀或其他。否则,恐怕你坚持
不到胜利的那一天。 

对于首次接触编程的同学,我建议最好先学一下Quick BASIC(DOS里就有带,就
是那个QBASIC.EXE),不用多学,知道什么是整型什么是浮点,以及DO...LOOP F
OR...NEXT 等最基本的知识,能算个阶乘,求个积分就行了,关键要明白计算机
是怎么执行命令的,对编程有个感性认识。如果你对自己有自信,也可以直接学
C++,应该也不会多费太多事。不过我觉着因为有很多资料是FOR VB的,并且网页
编程常用VB Script,以后你也很有可能要用到VB,所以了解一些BASIC对以后也是
有帮助的。而且如果只是要算个小题用QB比VC、VB之类方便多了。(找个人教一
两天应该就能搞定了吧)

之后我建议找本初高中信息学奥赛的书(有些奇怪吧)。这些书里讲解了基本的
算法,写的却比较通俗,没什么高深的数学知识,容易理解。这些东西在数据结
构课程中有系统严密的讲解,所以也可等以后再学。但我觉着现阶段写一些小程
序,实现些常用算法对自己的思维是很好的锻炼,对以后的学习大有好处。我想
,能排排序,求个八皇后,算个汉诺塔,再知道深、广度优先搜索就可以了。

如果你已经有一些编程的基础知识了,自然就可以跳过以上两步。

等你对编程有一定的认识后,就应该开始进军C++了.注意,是C++而不是VC,这两者
根本不是一码事!别买VC入门,你肯定看不懂!C++是一门语言,而VC教程则是讲解
如何使用MFC类库,学习VC应建立在充分了解C++的基础上。

我觉着比起许多花花绿绿的大全、宝典,不如买本大学的C++教程(注意:别买等
级考试的教程,那是应试用的),那些教程大都经过反复锤炼,比较系统,很有
含金量,有不会太贵。这里我暴力推荐由清华大学出版社出版的一本《C++程序设
计教程》,封面是红色的,封底是黄色的,看起来很朴素,主编是钱能。这本书
简直是好的没法说,还便宜(39.5元)。这本书不但告诉你语法,还告诉你为什
么要这样规定语法,看完之后,你会觉着那许许多多的规定是理所当然的,根本
不用费心记,不但不枯燥,反而会使有一种美感。书中还有许多实际编程时应注意
的问题,很有价值。这本书还配有《实验指导》,和《习题集》,不过对于有一
定编程经验的人应该是用处不大,所以我没买。除了这本书,我建议再买本关于
传统C语言的书,要着重以下几个方面:编译预处理、typedef的使用,位运算,
标准库函数的使用(最好有一个比较详细的列表,用的时候好查)。

C++的标准类模板是个不错的东东,不过对于学习MFC却没有帮助,原因是MFC太落
后了(^_^),可以先放一放,要不要学等搞定MFC时再作决定。虽然我没怎么学过,
不过觉着它挺不错,而且代表了一种发展方向。虽然学着费劲(那东西几乎没一
点C++的样子,简直是在学新语言),但掌握它可使编程轻松不少。

学完了C++,该学VC了吧?别急,先找本WIN32编程的书,这次没什么讲究,看着差
不多的,便宜一些的就行了,如果有对于VC集成环境的介绍就最好了。WIN32编程
是指用WINDOWS API编程,MFC是将众多的API函数进行了封装的类库,用起来方便
了不少,但如果没有一些API编程基础,对相关概念不了解,学起MFC来可能会很
费解。相信我,将来你不会觉着学API编程是浪费时间的。API函数有两千多,要
都学会累死。其实你只要知道如何创建窗口、对话框、控件、消息循环,了解了
句柄的含义就差不多了,最好再了解一点GDI编程。这个阶段的关键是要理解WIN
32程序是如何运作的,把握各种窗口间的关系。因为你以后应该很少直接用WIN3
2 SDK编写程序,所以关键是理解整体结构,记住几个函数并没有什么意义。函数
用的时候可以现查。手头应有一份比较全面的资料。中文的API函数大全好像只有
For VB的,不过看起来应该是没有任何障碍。英文的资料MSDN中就有,相当全面
,也比中文的详细一些。我建议用中文资料快速查找,有问题再看英文。(我忘
了我的html版中文API大全是从哪下载的了,不过书店有售,白皮的,很厚一本,
很贵就是了。谁想要可以与我联系iamsor@sohu.com)

对于想学游戏编程的朋友注意:从现在起,你不必去学什么MFC了,相信我,那东
西除了让你头疼一点用处都没有。游戏都使用Win32 SDK编出来的。现在,你要学
的是DirectX。我推荐老王翻译的DirectDraw文档(www.imagic3d.com),前面有
一些老王自己写的基础知识,很适合入门, 在此特别感谢老王的辛勤劳动。我还
买了一本《DirectX 7 速成教程》,机械工业出版社出版,封面封底都是红色。
除了翻译惨了点还算不错,介绍的挺全面,还有一些游戏编程基础知识。如果你
想图省事,可以考虑用云风编写的风魂游戏库,很方便的(www.codingnow.com 对
云风的辛勤劳动表示感谢).不过我仍然建议至少了解一下DirectX.这里说一下,
很多朋友抱怨找不到有关DirectX的书籍,我告诉你,别去编程书籍里找,去多媒
体制作书籍那找,还要把眼睛瞪得大大的、圆圆的。Director.. Director.. Di
rectX!!!知道了吧,书店工作的人眼神都不大好,我也是有一天没事瞎转才发现
的,吓了我一大跳。发现这个秘密后我发现其实有不少关于DirectX的书,只是一
般人找不到罢了。学会了DirectX,就可以开始奋斗了,剩下的问题就只有积累经
验了。

对于志向是应用软件的朋友,打好了基础,现在进军VC的障碍都已扫清了。不过
还是应做好充分的思想准备,事情不会那么顺利的。刚开始,你就要面对一个瓶
颈,大量的紧密关联的知识,使你必须一下理解一个整体,而很难一点点来。可
以说,学VC最难的就是刚开始。情况有些类似于你第一次创建窗口时面对的那长
长的程序,只不过更糟糕就是了。很多人就是在此被一大团知识噎着,放弃了学习
。事实上,这几乎是Windows编程的一大特点,在WIN32编程时你就应当有所体会
,而DirectX和COM都有类似问题。记住,一定要坚信:突破了这个瓶颈之后便是
一片海阔天空,而有着扎实基础的你是一定能闯过去的。
我的建议是,不要等彻底弄明白一句才看下一句,而是知道好像怎么回事就向下
看,实在看不懂也硬着头皮往下看,等能比猫画虎的作出个菜单、对话框时便回
过头再看一遍,几遍之后应该就可以大概明白MFC程序的运作了。注意:这里有个
关键,一定要用心体会面向对象编程的精神,努力将眼前的程序与你之前所学的
知识联系起来。通过比较成员函数和对应的API函数间的区别,尝试去理解MFC是
怎样封装相关的API的。例如,相当多的类将句柄封装了起来,在传递参数时加以
省略,这就是一个很重要的特性。MFC中有许多的宏,看起来很奇怪,但你不必理
会其实现方法,只要知道如何使用便可,这点也很重要。还有,千万不要过于依
赖ClassWizard,对于其生成的代码要自己进行分析,偷懒就不能真正理解MFC。

这里我介绍一种学法,不过学法这种东西因人而异,所以还要根据个人的情况决
定。开始时,教程让怎么办就怎么办,比猫画虎的作出个菜单、对话框,然后试
着添加控件。等能不看教程便做到这些时,开始逐字逐句的试着理解MFC程序的组
织。若看不懂就跳过看下面的。就这样一遍一遍来。如果觉着头大就先歇上两天
,等清醒了再接着来.最好在这期间多找些介绍MFC框架的文章。注意:先不要碰有
关文档/视结构的东西,否则你会更头大。然后便可试着写个定时器、名片夹之
类的小东西,熟悉一下各种控件的使用。 突破了开始的瓶颈之后再学下去便会越
学越容易,因为你可以一点一点的积累知识,而不用担心被噎着了。再过不久,
你就不得不开始使用API函数完成一些功能,如在系统托盘加图标,自画列表框等
。这时,你也会体会到学习WIN32编程的好处了,没学过的人很可能就此卡壳。

关于VC的教程遍地都是,但鱼龙混杂,市场乌烟瘴气,骗钱的书真不少。有些书
很厚,内容当然也很全,对老鸟很不错,但对于初学者似乎有些浪费钱,因为里
面绝大部分的东西MSDN中都有,并且初学者用不着。老外写的书一般内容不错,
但翻译水平是个问题。如果翻译糟糕可够你受的,加上价格不菲,我也不建议初
学者买。还有些什么傻瓜书、图解之类,好像是面向初学者,时则为骗钱,你看
完后除了那几个例子什么也不会作。如果你看到有一本书花了大量的篇幅图文并
茂,生动形象的介绍如何画图,输出文字,别买!骗钱的!(:-< 我就被坑去42
块现大洋)那些花哨的东西对初学者除了转移注意力没任何好处。如果你真的对
GDI绘图很感兴趣,就去找些专门书籍,比那些书好多了。最好买名字类似于VC应
用,VC编程之类比较正式的,图不要太多的,字不要太大的,最好是有较多的控
件介绍的。当然,文字流畅也是很重要的。书不要买太多,最多两本,因为这些
书内容都差不多,买多了的话东看西看反倒没好处。在这里,我建议初学者先别
急着掏钱,而是去VC王朝( http://vcdynasty.yeah.net/)下载本MFC教程。虽
说是网上教程,却当相当有水准。不但内容比较全面,还一句废话也没有(这里
感谢作者的辛勤劳动)。只是可惜对GDI没有一点介绍,还须其他书籍作补充。等
搞定这本教程时,应该就已经入了门,可以有针对性的选购书籍,不用担心上当
受骗了。还有,VC知识库(www.vckbase.com)的网上杂志也很不错,对刚入门的
人很有帮助,建议下载。入了些门后,各个网站多转转,看见好文章就往下拉,
对提高水平很有好处。 

一套MSDN光盘在这时是必不可少的,什么都找中文资料是不可能的,即使能找到
也会很费时间和金钱,只能看硬着头皮英文。不过以我的经验看,只要有高中水
平的英语,加上金山词霸一路滑过去,看那种专业文章还是很容易的。还有,初
学者一上来可能根本不知道上哪找需要的东西,我在这里把常用的地方列一下:

WIN32 API: 平台SDK->Reference->Win32 Functions in Alpha Order
MFC类库资料: Visual C++ Documentation->Reference->Microsoft Fo...
C/C++语言及标准库资料: Visual C++ Documentation->Reference->C/C++...
标准控件: 标准控件都被MFC封装了,可以参考对应的类,如Edit控件对应CEdit类
.
VC中带的ActiveX控件: Visual Basic文档->参考->控件参考(唯一的中文资料,却
是最糟糕的。不但是For VB,与C++有很大区别,还翻译得乱七八糟,几乎没法用.如
有高手知道哪有英文资料还请告知,不胜感激)

目前市面上的MSDN光盘已经有一段历史了,有些东西可能有些过时。要最新资料
的话,可以到微软的网站(当然是全英文的)。不过对于初学者似乎没有必要。

搞定VC后,要学什么都随你便了,再学C++Builder,VB,Dephi,java什么的都是一
点难度都没有了,感觉就象是把关键字换了换。或者可以去啃啃COM,据说那是块
硬骨头(不过好像也只是入门难,因为有了之前的经验,虽然我没碰过,但花点
时间应该是搞得定的。另外DirectX编程经验在此应该是有些帮助的)。

最后,我建议有时间的话多研究一下各种算法。数据结构是一定要看的。不一定
要记住(话说回来,不经常用的话也记不住),但至少要知道有那么回事,万一
碰到问题了要知道往那边靠。其实,常见的链表等结构以及排序等算法在C++标准
类模板中已经实现了,不用你去费劲,但有些了解的总是有好处的。至于离散数
学、线性代数什么的,对于复杂些的算法是必需的,其中离散数学是数据结构的
基础。不过,我倒觉着只要不是太复杂的问题只用经验也能解决(就象奥赛书中
那样,只是实现而没有证明),而且那些东西不用就会忘。万一碰见个难题解决
不了,找个高手帮忙也不错,省时省力^_^。

下面是我想到的一些杂七杂八的问题,没什么条理,凑或看吧:

英语水平不用很高,但至少要有高中水准,否则有你受的。

看书一遍看不懂没关系,事实上,要一遍就能弄懂你就很有天分了。只要多看几
遍,综合分析,应该是没有什么问题的。

现在的世道,不是书到用时方恨少,而是书到用时方能学。不要试图满把抓,而
要用到什么学什么。这样,学的又快,记的又牢。

一个错误认识-学编程靠的是记忆:这是很要命的思想,会让你累死而无所得。
事实上,你几乎不用特意记任何东西。对于各种函数、语句,只要知道有那么个
东西,用的时候知道上哪找就行了,用多了自然就记住了。学编程关键在理解编
程思想。

一个小技巧:活用编译器可以帮你很多忙。在VC中,当你输入成员符号.或->时,
程序会自动列出此类的成员,你只要选一个就行了。这样便省了很多记忆负担。
例如,你想获得一个CString类对象的长度,对应方法肯定是Get什么,但是GetL
etterNum还是GetStrLength却不知道,你可以输入xxx.Get,这样,你便可从列表
中找到一个GetTextLength(),不是这个还能是什么,单击它的话还可能出现说明
。还可避免打错字。如果想调用本类的成员函数,就输入this->,就可以查看成
员列表了。对于全局函数,则是输入::即可。这样的话看起来还清楚。还有,如
果没有出现那个列表,八成是你弄错了什么东西,例如变量没定义,或打错了字
,但也可能是VC的BUG,很少就是了。对于初学者,这可是很好用的功能。

初学编程应遵循的一条原则:比猫画虎、不求甚解。关键在于很多东西你就甚解
不了,例如MFC中稀奇古怪的宏。而且,甚解了也没太大的好处,暂时还是不要管
它,会用就行了,什么时候有了闲工夫再来慢慢琢磨。多留心别人的程序是如何
实现的,并照着去做。有时,一些小问题也体现着高深的思想。比如,一个变量
要定义在什么地方,如何组织类的结构。如果不太明白,就先找着别人的样子去
作,时间一长就会自然而然的明白,这就像下棋一样,老头怎么下,你也跟着怎
么下,毕竟他出错的可能比你小。

还有,我觉着初学者不应把过多的精力放在象Cool的工具条,透明的、气泡状的
窗口之类的工作上。再搞这些之前,你最好问问自己,自己的程序配得上这些漂
亮的界面吗?尤其是,千万不要在刚开始动手时就先打扮界面,以免界面也弄好
了,热情也没了。毕竟,看在眼里的成果给人的刺激比枯燥的算法强得多。如果
你想搞的话,也要等程序主体定型后再搞。 初学时还应多留心关于程序结构组织
的文章,这些东西是很重要的。要从一开始便养成良好的风格。否则有一天当你
决定编一个大点的程序时,你就会发现干到一半就干不下去了。

编程不是技术活,而是体力活:学的时候满脑子全是技术,可用的时候就真成了
体力活了。真正做起东西来,最重要的是要有毅力坚持到完。意志不坚强就难免
半途而废。 关于初学者是该学VC还是该学VB的问题:我觉着,学VC会难一些没错
,但掌握学习方法的话也没想象的那么难,而且学VC才能深刻领会面向对象编程
的精髓。它使你的思想提升了一个高度,对以后的发展是大有好处的。再说,如
果这点困难都克服不了,以后也很难有什么作为。所以,即使你打定主意用VB,
也还是花些时间看看VC,至少知道它的大概结构。从长远看,这是很有好处的。

关于学C++ Builder还是Visual C++的问题:也许VC真的不太好,但总不会太糟。
可关于VC的资料不知是关于C++ Builder的多少倍。尤其对于初学者,这时很要命
的!何况两者相差其实并不太多,学会了一种,再学另一种也不会太费事。

呵,没想到说了这么多。我已经声明了,其实我也就是刚入门,以上一切都是我
自己的感受,难免有错误,还请高手指正。另外,这是我第一次写文章,加上我
语文很糟糕,其实就是想到哪写到哪,各位就凑或一下吧






<转帖>
我对VC的看法 
  

看了前面一篇"论c/c++程序员的门户之见",心有所感,也来谈谈从一个普通VC学习
者的角度对VC的看法。

首先介绍我的学习情况,我是属于那种MFC的所有类基本上都懂得一点,但又懂得不

,每种技术都懂得一些,但又不甚深入的那种。对我来说,似乎什么VC编程都会,但
是都得花
一番脑筋才能编好。我的学习历程是这样的,我在大一时必修课学了C,大一下自学
了C++,
大一暑假编了平生第一个"类库",自以为C++学得不错了,就开始学VC。

谁知这就是痛苦的开始。

我在学C++的时候,可以一个学期就光啃一本书,而且没上过机(直到暑假才把上机

践补上),还能看的津津有味,可是这本VC的书,我花了几周时间看完以后,就有上当
的感觉
。没错,我会编DOC/VIEW了,我会编对话框,按钮,控件了,可是光这些有什么用?

我不明白为什么VC没有入口函数而要在InitInstance里头加入初始化代码。
我不明白为什么VC非得用文档/视窗(现在叫视)结构,去掉了它会有什么结果?
我不明白Windows消息循环是什么机制,为什么我用ClassWizard可以加入消息映射

而手工添加的时候就老出错,ON_MESSAGE是什么意思?更可恶的是,为什么我往工程
中添加
一个空的CPP文件,编译器就要说我错误。
为什么,为什么这么多为什么我也不知道...

于是我渐渐地对学习VC不是那么热心了,开始报着什么时候用什么时候学的态度来

VC了。于是我开始学一点忘一点,于是我在回答别人提出的问题时,只能以一句"你
去查查
MSDN,我也不大清楚"来应付。

所以,我的感受是,VC教学需要改革,那些为VC入门者写书的人,请记住VC是VC

不是VB,学VC不是只会点几下鼠标,会做几个按钮对话框就叫会了。你们应该为初
学者想
想,至少应该想想你们自己当初学VC是怎么过来的,你们写的书对初学者很重要
,不要
把他们引入学习的歧途!我一直期待着有一些高手,写出这样一部书,暂起名为"
通向程
序员之路"(老套了一点,将就着用),它包括下列这些内容:

1.C/C++语言基础
不用说了,现在大部分这类书都能满足读者的要求,这个部分抄抄别人的就行啦.
:P

2.面向对象分析原理和类库的构造
这个部分可是C++程序员的看家本领,也是VC程序员值得向其他VB程序员或JAVA程

员称耀的地方。VC程序员可以是一个系统的构造者,而VB程序员只能是一个使用
者。一个
成功的VC程序员可以自豪的说,给我时间,我可以编出一个MFC,VB程序员可以吗
?
所以这个部分一定要有老资格的牛人来编写,应该结合一个具体的类库实例来编


3.Win32 API编程
不要以为这一套已经过时了,只有学了Win32 API,你才能真正理解什么是Windo
ws
操作系统,这部分的源码可能会很长很罗嗦,但是结合光盘上现成的例子,也不
用你自己
写什么代码了,反正真刀真枪用到这个的还真的不多。总之这个部分重在Window
s操作系
统原理和编程原理的讲解,当作例子的源代码嘛,估计是又长又臭,这个部分需
要及其富
有爱心的老同志来编。

4.MFC构造精解
注意是MFC构造精解而不是MFC大全,不是流水账似的铺诉都有哪些类啦,这些类都

哪些函数啦,这函数有什么用啦。而是MFC为什么要这么构造,如果要你来编MFC,
你会怎
么编?是否和Microsoft不谋而合?
这部分正是全书最难编的地方所在,这里需要一位绝绝对对的VC高手来编。恕我
直言
,现在大多数写书的人,恐怕都没有达到这个水平,或是不肯显露真本领给大家
看。
这部分的妙处在于,读透了它以后,你就是VC高手了!(我KAO,MFC我都可以编了

我不是高手是什么?)

5.VC编译原理
VC比起在DOS下的TC,BC简直是娇贵到了极点,这里一行,ClassWizard阿姨保管这

片,小朋友不要乱动欧,乱动要打屁屁的欧,那里一句,AFX_XXX老大罩着这,小
子要命
的话快给我滚。还有#ifndef ~~!!@#$$@%@%@,#pragma ...,让人家一看就晕菜,
难怪人
家说VC是一朵带刺的玫瑰,想要可是碰不得。 
请一位护花使者挺身而出,为玫瑰美人除去这一身的臭刺。

6.从COM到ActiveX
COM,Interface,Dispatch等等一个一个娓娓道来,当然也要认真介绍我IUnknown

,直到ActiveX服务器,ActiveX OLE文档,ActiveX控件,DCOM,COM++,前面几本
书都讲的
那么精彩了,到这我就不信你?br />
http://bbs.dlut.edu.cn/bbsanc.php?path=%2Fgroups%2FGROUP_3%2FC%2F4%2FM.1050207262.A
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Visio是一款非常流行的流程图制作软件,它可以帮助用户快速设计和生成各种图形,包括流程图、组织结构图、网络拓扑图等等。然而,对于一些初学者来说,使用Visio可能会存在一些困难和问题。以下是一些解决方法供参考: 1. 观看教学视频和阅读帮助文档:Visio软件本身提供了非常详细的帮助文档和教学视频,使用者可以参考这些材料,学习Visio的基本操作和功能。 2. 参加培训课程:一些公司和学校会举办Visio培训课程,使用者可以报名参加这些课程,通过专业老师的指导和讲解,快速掌握Visio的使用方法。 3. 寻求论坛帮助:在csdn等IT论坛上,有很多Visio的讨论版块,用户可以在这些论坛上发布各种问题,并得到其他Visio用户的回答和帮助。 4. 使用在线制图工具:如果使用者不想学习Visio软件的具体操作,可以通过在线的流程图制作工具(如ProcessOn等)来生成自己需要的图形。 5. 找其他图形制作软件:如果使用者对Visio一直存在难度,可以考虑使用其他图形制作软件,如Edraw Max、Lucidchart等,它们的操作方式与Visio类似,但更为简单易懂。 总的来说,解决使用Visio画图的问题需要耐心学习和不断实践,当遇到难点,多方寻找帮助和解决方案,才能更好地掌握这款流程图制作软件。 ### 回答2: 使用Visio来绘制图表会遇到一些问题,以下是解决方法: 1. 学习Visio:如果你在使用Visio遇到了困难,那么你应该先了解一下如何使用Visio。你可以从网络上搜索教程或者在线课程学习Visio的基本知识,并加强你的技能。 2. 查找错误:如果你无法绘制图表,那么你应该仔细检查你的Visio文档中是否存在错误。你可以先保存文件并重新打开文件,或者在Visio中使用“检查错误”的功能来查找错误。 3. 使用模板:为了方便操作,Visio提供了许多模板。你可以使用这些模板作为起点来完成图表。使用适当的模板可以把握好图表的基本结构和布局,并使你的绘图过程更加高效。 4. 寻求帮助:如果你仍然无法解决问题,那么你可以联系其他Visio用户或寻求专业帮助。你可以在在线论坛或社区中寻找Visio使用经验并向其他使用者请教。 综上所述,如果你要在Visio中绘制图表并遇到困难,你应该尝试学习Visio的基本知识,检查文件是否有误,使用模板,甚至向其他使用者寻求帮助。通过这些方法,你可以轻松地解决Visio绘图的问题并取得成功。 ### 回答3: 对于不会使用Visio软件画图的问题,有以下几种解决方法: 1. 学习使用Visio软件 可以通过搜索网上的教程视频或购买相关课程,系统地学习Visio软件的使用方法和技巧。 2. 使用其他绘图工具 如果不想学习Visio软件或者只是单纯地需要画图,可以选择其他绘图工具,如在线绘图网站、PPT软件、Photoshop等。 3. 寻求帮助 可以寻求身边熟悉Visio软件的人或专业的技术支持人员帮助。寻求帮助,应详细描述遇到的问题和需求,以便对方更好地帮助自己。 总之,不会使用Visio软件画图不要紧,只要选择适合自己的方法,或者善于寻求帮助,就可以解决问题并顺利完成任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值