博文

Visual C++ 编程小技巧(2005-11-15 10:32:00)

摘要:  1.如何改变窗口的图标?   向窗口发送 WM_SECTION消息。   Example: HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON);ASSERT(hIcon);AfxGetMainWnd() ->SendMessage(WM_SECTION,TRUE,(LPARAM) hIcon);   2. 如何改变窗口的缺省风格?   重写 CWnd:: PreCreateWindow 并修改CREATESTRUCT 结构来指定窗口风格和其他创建信息. Example: Delete "Max" Button and Set Original Window’s Position and Size BOOL CMainFrame:: PreCreateWindow (CREATESTRUCT &cs){ cs.style &=~WS_MAXINIZEMOX; cs.x=cs.y=0; cs.cx=GetSystemMetrics(SM_CXSCREEN/2); cs.cy=GetSystemMetrics(SM_CYSCREEN/2); return CMDIFramewnd ::PreCreateWindow(cs); }   3. 如何将窗口居中显示? Easy, Call Function CWnd:: Center WindowsExample(1): Center Window( ); //Relative to it’s parent// Relative to ScreenExample(2): Center Window(CWnd:: GetDesktopWindow( ));//Relative to Application’s MainWindowAfxGetMainWnd( ) -> Center Window( );   4. 如何让窗口和 MDI窗口一启动就最大化和最小化?   先说窗口。   在 InitStance 函数中设定 m_nCmdShow的 取值. m_nCmdShow=SW_SHOWMAXMIZED ; //最大化m_nCmdShow=SW_SHOWMINMIZED ; //最小化m_nCmdShow=SW_SHOW......

阅读全文(2421) | 评论:0

编程入门:学习编程,从何入手(2005-11-15 10:23:00)

摘要:编程入门:学习编程,从何入手 如果您想学习编程,却又不知从何入手,那么您不妨看看下面的几种学习方案,可能会给您一些启示吧!   方案一 Basic语言 & Visual Basic   优点  (1)Basic 简单易学,很容易上手。  (2)Visual Basic 提供了强大的可视化编程能力,可以让你轻松地做出漂亮 的程序。  (3)众多的控件让编程变得象垒积木一样简单。  (4)Visual Basic 的全部汉化让我们这些见了English就头大的人喜不自禁。   缺点  (1)Visual Basic 不是真正的面向对象的开发文具。  (2)Visual Basic 的数据类型太少,而且不支持指针,这使得它的表达能力很有限。  (3)Visual Basic 不是真正的编译型语言,它产生的最终代码不是可执行的,是一种伪代码。它需要一个动态链接库去解释执行,这使 得Visual Basic 的编译速度大大变慢。   综述:方案一适合初涉编程的朋友,它对学习者的要求不高,几乎每个人都可以在一个比较短的时间里学会vB编程,并用VB 做出自己的作 品。对于那些把编程当做游戏的朋友来说,VB 是您最佳的选择。   Basic/Visual Basic简介  方案二 Pascal语言 & Delphi   优点  (1)Pascal语言结构严谨,可以很好地培养一个人的编程思想。  (2)Delphi是一门真正的面向对象的开发工具,并且是完全的可视化。  (3)Delphi使用了真编译,可以让你的代码编译成为可执行的文件,而且编译速度非常快。  (4)Delphi具有强大的数据库开发能力,可以让你轻松地开发数据库。   缺点  Delphi几乎可以说是完美的,只是Pascal语言的过于严谨让人感觉有点烦。   综述: 方案二比较适合那些具有一定编程基础并且学过Pascal语言的朋友。   Pascal语言简介  Delphi简介  方案三 C语言 & Visual&nbs......

阅读全文(4353) | 评论:1

关于指针(2005-11-13 20:43:00)

摘要:       不可否认,指针是C的精华,也是C的难点。每一个学C的人,当年应该都是在“漆黑”中摸过来的。我现在编程序时用指针用得很多,可以说绝大多数值与是通过指针来传递的,而struct、class的实例等则是完全用指针或引用来传递的。  我不敢说我是什么高手,也不敢说我对指针有多了解,对于网上的一大堆提问,我不敢说我能很好地回答。但是,我想:我把自己的一点点感悟写出来,多多少少会给读者一点启示。写得不到之处,请读者朋友们斧正。 一、指针就是变量:  虽然申明指针的时候也提类型,如:  char *p1;  int *p2;  float *p3;  double *p4;  .....  但是,这只表示该指针指向某类型的数据,而不表示该指针的类型。说白了,指针都是一个类型:四字节无符号整数。 二、指针的加减运算很特殊:  p++、p--之类的运算并不是让p这个“四字节无符号整数”加一或减一,而是让它指向下一个或上一个存储单元,它实际加减的值就是它所指类型的值的size。  比如:  char *型指针,每次加减的改变量都是1;  float *型的指针,每次加减的改变量都是4;  void *型指针无法加减。  还要注意的是:指针不能相加,指针相减的差为int型。  正是因为指针有着不同于其它变量的运算方式,所以,在任何时候用到指针都必须明确“指针的类型”(即指针所指的变量的类型)。这就不难理解为什么函数声明时必须用“int abc(char *p)”而调用的时候却成了“a = abc(p);”这样的形式了。 三、用指针做参数传递的是指针值,不是指针本身:  要理解参数传递,首先必须把“形参”与“实参”弄明白。  函数A在调用函数B时,如果要传递一个参数C,实际是在函数B中重新建立一个变量C,并将函数A中的C值传入其中,于是函数B就可以使用这个值了,在函数B中,无论有没有修改这个C值,对于函数A中的C都没有影响。函数B结束时,会将所有内存收回,局部变量C被销毁,函数B对变量C所做的一切修改都将被抛弃。  以上示例中,函数A中的变量C称为“实参”,函数B中的变量C被称为“形参”,调用函数时,会在B函数体内建立一个形参,该形参的值与实参的值是相同的,但是形参的改变不影响实参,函数结束时,形参被销毁,实参......

阅读全文(3309) | 评论:0

网上惊现“百度贴吧杀手” 网络贴吧存安全隐患 (2005-11-13 14:44:00)

摘要:   超女火了,各个贴吧的光顾率也成倍上涨,批量发帖的背后也让黑客看到了机会。8月31日,继超女贴吧存在恶意病毒后,江民反病毒中心再次监测到,网上惊现“百度贴吧杀手”程序,并附源代码。利用此程序,百度贴吧的代码过滤就形同虚设,任何人都可以借此迅速传播间谍软件、木马等有害程序。  据江民反病毒专家介绍,此软件程序现已被直接公布于国内一个非常知名的IT网站的下载频道http://download.****.com.cn/html/010042005080801.html,并被命名为“百度贴吧杀手”,属于免费下载软件。 此程序通过辨认图片识别百度贴吧特征码,30秒可以破解过滤代码,利用此代码,可以在百度贴吧任何吧嵌入恶意代码,甚至植入病毒,盗取点击者的机密信息等。  2003年11月百度贴吧 (post.baidu.com) 正式出炉后,目前已经创建了80多万个主题社区,仅超级女生一个吧目前就有600万条帖子,每天光顾的人可想而知。据悉,中国众多一线明星也通过百度贴吧与 fans 面对面,很多博客的作者也把自己的网络日志直接通过百度贴吧发表。操作简单而又针对性,这是贴吧火极一时的重要原因,可正因为如此,也存在一系列隐患。据江民反病毒专家介绍,百度发帖页面底部有一个表单,允许匿名发帖。如果要写一个自动发帖的程序,唯一的难点是验证码。(如图)  但此验证码存在两大问题,第一,验证图片上面有噪音点(指验证图片上的斑点),但此噪音是固定的,不是随机的,很容易识别,“百度贴吧杀手”就用利用了这一点。第二,此验证码是由脚本程序生成的,但生成算法又不够复杂,导致其验证图片上面的数字完全可以由产生它的链接地址直接计算得出。一旦利用验证码破解算法制作出发帖程序,效率将比“百度贴吧杀手”更高。  令人担忧的是,贴吧已越来越火,百度一下“贴吧”,可找到相关网页2,000,000篇,Google一下“贴吧”,相关网页也达1,630,000。百度,猫扑等更是众多贴吧中佼佼者。百度贴吧尚且如此,其他贴吧的安全更是问题重重。江民反病毒专家预测,如果贴吧系统维护者对这些问题视若无睹,那么目前贴吧这一新兴的网络应用将成为未来最大的网络病毒传播和滋生源。  针对贴吧发布系统存在的巨大安全隐患,专家也建议广大用户上贴吧发帖或是浏览时就注意打开实时监控等功能组件,也不要随意点击帖子上......

阅读全文(3666) | 评论:0

浅夜若梦(2005-11-13 14:14:00)

摘要:   外面又开始下雨。细细密密的那种,落在窗台上无声无息的。隔着蕾丝的窗帘,只看见外面雾蒙蒙一片。     听说已经立冬了。这个秋天亦如这场雨,无声无息。     秋天在我的生命中,一直是个隆重的季节。我执着地迷恋着乍冷的夜风吹起长发飘散在周围的样子;如果有雨,多是迷迷离离的,我便可在一如此时的昏暗灯光下,细细回忆那些将说未说的话语,将尽未尽的故事。     走的最急的,都是最美的时光。所以秋尽了,我才想起回首;秋逝了,我才开始留恋。留恋那些未来及挽留的乍现的欢乐,以及未来及收拾的怅然的心情。     将画纸展开,想重温那些年轻时的梦境。将希望描述在画里,让笔下千百个女子秋波中流转我的情绪。或惆怅或迷茫,或狂喜或忧伤。     如从前一般慢慢地一笔一笔勾勒,直到发现无论怎样也无法展现心中所期盼的那种情感。而我想要的,到底是什么呢?     是平静罢。     是单纯清澈的目光投诸远方,周围的喧嚣与纷争永远无法在那份恬淡中投影下波纹。然后画中的女子嘴角微微上扬,似在欣赏,又似沉湎于自己的遐思。我要的,便是如此罢。     然而,然而无论怎样,我也画不出。     人说文如其人,画如其人。我百般退却,将自己封锁在自以为清静的世界,而外界的风吹草动都会打破我拼命保持的平静。我的骨子里流动的,本就是不安分的血液呵,又该如何逃脱……     我想,与其自欺欺人,不如亲手解在禁锢着自己的枷锁。     也许,只有在纷纷扰扰的世界,才能看见所谓的云淡风清罢。     收起画纸,决定重新酝酿心情。     喜欢一个人走,在习惯了一个人走以后。     频频看见那句话,孤单是一个人的狂欢,狂欢是一群人的孤单。狂欢很远,孤单很近,我忽然不了解自己是个怎样的人。     贪恋夜凉如水,却惶恐黑暗中突如其来的窒息;笑叹浮生若梦,......

阅读全文(3743) | 评论:1

低歌·流年岁月(2005-11-13 14:12:00)

摘要:     岁月如流在穿梭     喜怒哀乐我深锁     只因有你在天涯尽头等着我     小色教我这首歌的时候我们都在念高中。那时候喜欢和她在傍晚散步,听她唱那些老歌,然后说莫名其妙的事给她听。有时候要求她翘课陪我游荡,她也会无奈地看我,然后说笑说,“你让人无法拒绝。”     唱这首歌的时候是个将深的夜,我们趴在阳台上,那晚的夜幕异常空旷,大大小小的星斗闪烁在眼前。后来她说,很久都没有见到那样的星空了,在那以后的日子,星总是很少,夜总是很暗。而看星星的时候也越来越少了。     她的声音是那种低低的沙哑,像男孩子那般,由于长相也比较中性,很多时候和我一起的时候都会被误认为是我的男朋友。     那时候我们也非常非常要好。说到要好,似乎她妥协的比较多。我一直是任性的女孩子,而性格偏向多愁善感,对朋友经常会做出一些无理的要求,而她,就是那种完全放任我的人。有时候想到她给我的忍让,会觉得自己很过分,任何人都应该受不了我那样强硬的性格的。     她就这样一直陪着我。我们看月,看夜,看尘世;听雨,听风,听流年。然后一切狂喜与忧伤,都在那时的岁月里绽放。     然而人是不是拥有了太多才忘记珍惜,沉浸在繁华中才会忽视那即将到来的凋零呢?     对于友情,我好象一直是不够重视的人。     后来他们说,小色是极容易受伤的。我知道啊!我比谁都清楚的。有谁和她一起看了雨又看雪,和她在冷风吹过的夜晚漫步到深夜?     ……     然而我仍是伤了她。好象在我一次次表现的莫不关心后她才离我渐渐遥远了的吧,还是我的狂热从一件事物到另一件,她终于厌倦了我的善变呢?     沉默相对。直到很久以后。         后来,后来我们都离开了,离开了先前那个记载着太多青春的悲喜的小城,然后在另个......

阅读全文(3793) | 评论:1

秋末·繁华与凋残(2005-11-13 14:08:00)

摘要: ——在这个不可预知的季节,纵有太多话想要说出         秋深     秋深 在回眸瞬间     然后才知道     有些繁华开始绽放     有些凋零 开始蔓延     像 极早的时候     将期盼写在落花里     再 放逐在风中     然后长久 而安静地等待     那未知的欢乐与忧伤     直到繁花落尽     才忽然觉醒 忽然     明白日夜守候的     不是曾经放出的愿望     而是 从未停止盼望的心     霎时的明澈与刺痛     竟化做两行热泪     将秋尽的一切绽放和凋零     倒映 其中        秋尽     狂喜总是走的最急     就如悲伤 总是来的猛烈     在黄叶落尽以后     万般绝美的誓言 总要凋残     终于此刻     我再次踏着落叶的残躯归来     终于此刻     我看遍了满山的繁华与枯萎     才明白无法再等待     而当我提起笔     在这张白纸上写出     那心底蕴藏太久 含泪的诗句     才忽然了解   &nb......

阅读全文(4001) | 评论:0

C++从零开始(十二)何谓面向对象编程思想 (2005-11-13 13:49:00)

摘要:--------------------------------------------------------------------------------前面已经说明了C++中最重要的概念——类,并且介绍了大部分和类相关的知识,至此,已经可以开始做些编程方面比较高级的应用——设计程序,而不再只是将算法变成代码。要说明如何设计程序,有必要先了解何谓编程思想。编程思想  编程,即编写程序,而之前已经说过,程序就是方法的描述,那么编程就是编写方法的描述。我知道如何到人民公园,然后我就编写了到人民公园的方法的描述——从市中心开始向东走400米再向右转走200米就是。接着另一个人也知道如何去,但他编的程序却是——从市中心沿人民东路走过两个交叉口,在第三个交叉口处右转,直走就能在右手方看到。很明显,两个程序不同,但最后走的路线是相同的,即大家的方法相同,但描述不同。  所谓的编程思想,就是如何编程,即编写程序的方法。那么之前在《C++从零开始(八)》中说的编程的三个步骤其实就是一种编程思想。这也是为什么不同的人对同一算法编写出的程序不同(指程序逻辑,不是简单的变量或函数名不同),不同的人的编程思想不同。  如果多编或多看一些程序,就会发现编程思想是很重要的。好的编程思想编出的程序条理分明,可维护性高;差的编程思想编出的程序晦涩难懂,可维护性低。注意,这里是从程序的易读性来比较的,实际出于效率,是会使用不符合人脑思维习惯的编程思想,进而导致代码的难于维护,但为了效率还是会经常在程序的瓶颈位置使用被优化了的代码(这种代码一般使用汇编语言编写,算法则很大程度上是数学上的优化,丢弃了大部分其在人类世界中的意义)。  本系列一直坚持并推荐这么一个编程思想——一切均按照语义来编写。而语义是语言的意义,之前说它是代码在人类世界中的意义。比如桌子,映射成一个结构,有桌脚数、颜色等成员变量,那么为什么没有质量、材料、价格、生产日期等成员?对此有必要说明一下“人类世界”的含义。世界  我们生活在一个四维的客观物理世界中,游戏中的怪物生活在游戏定义的游戏世界中,白雪公主生活在一个童话世界中。什么叫世界?世界即规则的集合。比如客观世界中,力可作用于有质量的物体上,并进而按照运动学定律改变物体的速度;电荷异性相吸同性相斥;能量守恒等,这些都是对客观......

阅读全文(7219) | 评论:0

C++从零开始(十一)(下)——类的相关知识 (2005-11-13 13:48:00)

摘要:--------------------------------------------------------------------------------本文的中篇已经介绍了虚的意思,就是要间接获得,并且举例说明电视机的频道就是让人间接获得电视台频率的,因此其从这个意义上说是虚的,因为它可能操作失败——某个频道还未调好而导致一片雪花。并且说明了间接的好处,就是只用编好一段代码(按5频道),则每次执行它时可能有不同结果(今天5频道被设置成中央5台,明天可以被定成中央2台),进而使得前面编的程序(按5频道)显得很灵活。注意虚之所以能够很灵活是因为它一定通过“一种手段”来间接达到目的,如每个频道记录着一个频率。但这是不够的,一定还有“另一段代码”能改变那种手段的结果(频道记录的频率),如调台。  先看虚继承。它间接从子类的实例中获得父类实例的所在位置,通过虚类表实现(这是“一种手段”),接着就必须能够有“另一段代码”来改变虚类表的值以表现其灵活性。首先可以自己来编写这段代码,但就要求清楚编译器将虚类表放在什么地方,而不同的编译器有不同的实现方法,则这样编写的代码兼容性很差。C++当然给出了“另一段代码”,就是当某个类在同一个类继承体系中被多次虚继承时,就改变虚类表的值以使各子类间接获得的父类实例是同一个。此操作的功能很差,仅仅只是节约内存而已。如:  struct A { long a; };  struct B : virtual public A { long b; }; struct C : virtual public A { long c; };  struct D : public B, public C { long d; };  这里的D中有两个虚类表,分别从B和C继承而来,在D的构造函数中,编译器会编写必要的代码以正确初始化D的两个虚类表以使得通过B继承的虚类表和通过C继承的虚类表而获得的A的实例是同一个。  再看虚函数。它的地址被间接获得,通过虚函数表实现(这是“一种手段”),接着就必须还能改变虚函数表的内容。同上,如果自己改写,代码的兼容性很差,而C++也给出了“另一段代码”,和上面一样,通过在派生类的构造函数中填写虚函数表,根据当前派生类的情况来书写虚函数表。它一定将某虚函数表填充为......

阅读全文(5473) | 评论:0

C++从零开始(十一)(中)——类的相关知识 (2005-11-13 13:47:00)

摘要:--------------------------------------------------------------------------------由于篇幅限制,本篇为《C++从零开始(十一)》的中篇,说明多重继承、虚继承和虚函数的实现方式。多重继承  这里有个有趣的问题,如下:  struct A { long a, b, c; char d; }; struct B : public A { long e, f; };  上面的B::e和B::f映射的偏移是多少?不同的编译器有不同的映射结果,对于派生的实现,C++并没有强行规定。大多数编译器都是让B::e映射的偏移值为16(即A的长度,关于自定义类型的长度可参考《C++从零开始(九)》),B::f映射20。这相当于先把空间留出来排列父类的成员变量,再排列自己的成员变量。但是存在这样的语义——西红柿即是蔬菜又是水果,鲸鱼即是海洋生物又是脯乳动物。即一个实例既是这种类型又是那种类型,对于此,C++提供了多重派生或称多重继承,用“,”间隔各父类,如下:  struct A { long A_a, A_b, c; void ABC(); }; struct B { long c, B_b, B_a; void ABC(); };  struct AB : public A, public B { long ab, c; void ABCD(); };  void A::ABC() { A_a = A_b = 10; c = 20; }  void B::ABC() { B_a = B_b = 20; c = 10; }  void AB::ABCD() { A_a = B_a = 1; A_b = B_b = 2; c = A::c = B::c = 3; }  void main() { AB ab; ab.A_a = 3; ab.B_b = 4; ab.ABC(); }  上面的结构AB从结构A和结构B派生而来,即我们可以说ab既是A的实例也是B的实例,并且还是AB的实例。那么在派生AB时,将生成几个映射元素?照前篇的说法,除了AB的类型定义符“{}”中定义的AB::ab和AB::c以外(类型均为long......

阅读全文(3641) | 评论:0