摘要: http://www.51see.com/asp/bbs/public/bp_show.asp?t_id=200308131152297103讲一下套接字模式和套接字I/O模型的区别。先说明一下,只针对Winsock,如果你要骨头里挑鸡蛋把UNIX下的套接字概念来往这里套,那就不关我的事。套接字模式:阻塞套接字和非阻塞套接字。或者叫同步套接字和异步套接字(#add这么叫是否可以待定)。套接字模型:描述如何对套接字的I/O行为进行管理。Winsock提供的I/O模型一共有五种:select,WSAAsyncSelect,WSAEventSelect,Overlapped,Completion。今 阅读全文
posted @ 2011-02-22 23:23 maxweii 阅读(749) 评论(0) 推荐(0) 编辑
摘要: 提到C++ STL,首先被人想到的是它的三大组件:Containers, Iterators, Algorithms,即容器,迭代器和算法。容器为用户提供了常用的数据结构,算法大多是独立于容器的常用的基本算法,迭代器是由容器提供的一种接口,算法通过迭代器来操控容器。接下来要介绍的是另外的一种组件,函数对象(Function Object,JJHou译作Functor仿函数)。 什么是函数对象 顾名思义,函数对象首先是一个对象,即某个类的实例。其次,函数对象的行为和函数一致,即是说可以像调用函数一样来使用函数对象,如参数传递、返回值等。这种行为是通过重载类的()操作符来实现的,举例说明之,cla 阅读全文
posted @ 2011-02-16 23:48 maxweii 阅读(3365) 评论(1) 推荐(0) 编辑
摘要: 1 merge 归并 将两个数组合并成一个(有序) merge(iarray1,iarray+len1,iarray2,iarray2+len2,result); 升序 merge(iarray1,iarray+len1,iarray2,iarray2+len2,result,greater<int>()); 降序2 reverse 元素反向 reverse(iarray,iarray+len1);3 reverse_copy 元素反向复制 reverse(iarray,iarray+len,iarray_new); 复制到新的数组中3 unique 剔除连续重复元素 ,剔除后元素 阅读全文
posted @ 2011-02-16 23:30 maxweii 阅读(795) 评论(0) 推荐(0) 编辑
摘要: vs2008重要快捷键ALT+SHIFT+ENTER 全屏活动文件自动定位到 解决方案视图8. 怎样调用智能提示? Ctrl J ALT + ->9. 怎样调用参数信息提示? 光标放到参数名上面,然后输入Ctrl Shif space。11向前 向后快捷键ctrl - 向后定位,ctrl shift - 向前定位。12定位到配对的括号ctrl ]格式化: VC6中:ALT + F8格式化: 选中代码后 Ctrl+K + F注释:选中代码后 Ctrl+K + C取消注释:选中代码后 Ctrl+K + UCtrl + M + P: 停止大纲显示 ,要开启可关闭该文件再打开即可Ctrl + M 阅读全文
posted @ 2011-02-14 23:03 maxweii 阅读(386) 评论(0) 推荐(0) 编辑
摘要: 1、IPicture接口对象的创建 方法1:直接通过文件创建LPCSTR szFileUrl;IPicture *pIPicture;OleLoadPicturePath(CComBSTR(szFileUrl), (LPUNKNOWN)NULL, 0, 0, IID_IPicture, (LPVOID*)&amp;pIPicture)) 方法2:通过IStream来创建// 加载电子地图LPCSTR szFileUrl;IStream *pStream = NULL;IPicture *pIPicture = NULL;;CFileStatus fstatus;CFile fi 阅读全文
posted @ 2011-02-12 14:06 maxweii 阅读(3906) 评论(0) 推荐(0) 编辑
摘要: 效果图:查找和替换 对话框也是非模态对话框,所以创建过程和MFC下创建非模态对话框的过程有点类似.先Create出一个窗口,设置好相关参数然后在显示出来使用就OK.Create原型:virtual BOOL Create(BOOL bFindDialogOnly, // TRUE for Find, FALSE for FindReplaceLPCTSTR lpszFindWhat, //默认被查找的字符串LPCTSTR lpszReplaceWith = NULL, //默认被查找替换的字符串DWORD dwFlags = FR_DOWN, //设置对话框里面的一些属性啦,下面说明了相关标志 阅读全文
posted @ 2011-02-10 11:14 maxweii 阅读(1529) 评论(1) 推荐(0) 编辑
摘要: 前段时间在用devcpp时,发现他有个插入快捷键,可以自定义注释模板,直接插入即可,感觉很方便。但是我偏向于VS,所以就在CSDN上提问了,很高兴的找到了我需要的答案---自定义宏注释模板。这里和大家分享下(虽然网上讲的很多了。。。)程序注释的重要性毋庸置疑,一个大型的项目通常情况下都是几个软件工程师合作出来的成果,假如该项目中的代码注释不全,那会给将来的维护者带来无穷无尽的隐患。通用的办法是给自己工程里面的函数添加注释——使用宏。1.打开Visual Studio 2008(2005一样适用)开发工具,单击“工具→宏→新建宏项目”,然后按照步骤建立注释宏,添加如下代码并保存。2.打开 菜单 阅读全文
posted @ 2011-01-29 17:44 maxweii 阅读(419) 评论(0) 推荐(0) 编辑
摘要: 介绍  本教程的目的是告诉你如何使用ATL创建一个COM服务器,并使用Visual C++和Visual Basic程序来分别调用这个服务器。我并不想深入探讨COM的细节,也不想让你深陷于IDL之中。这一教程只是为VC++的新手程序员设计的,告诉他们利用ATL来创建一个COM对象有多么简单,并让他们能对ATL产生更多的兴趣。第1步:启动ATL COM Wizard  你所需要做的第一件事情就是启动Visual C++并创建一个新的工程,选择“ATL COM Wizard”,工程名为“Simple_ATL”。设置好工程的路径之后,单击OK按钮。你会看到,屏幕上给了你若干选项。第一个选项为“Ser 阅读全文
posted @ 2011-01-29 17:13 maxweii 阅读(3863) 评论(0) 推荐(0) 编辑
摘要: 1 字符测试函数   1 函数原型均为int isxxxx(int)   2 参数为int, 任何实参均被提升成整型   3 只能正确处理处于[0, 127]之间的值   2 字符映射函数   1 函数原型为int toxxxx(int)   2 对参数进行检测, 若符合范围则转换, 否则不变   int tolower(int); 'A'~'Z' == 'a'~'z'   int toupper(int); 'a'~'z' == 'A'~'Z'   @函数名称: isalpha   函数原型: int isalpha(int ch);   函数功能: 检查ch是否是字母.    阅读全文
posted @ 2011-01-29 10:11 maxweii 阅读(561) 评论(0) 推荐(0) 编辑
摘要: 关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和 const_cast。下面对它们一一进行介绍。I. static_cast用法:static_cast < type-id > ( expression )该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安 阅读全文
posted @ 2011-01-26 10:29 maxweii 阅读(1717) 评论(0) 推荐(0) 编辑
摘要: 作者:winterTTr(转载请注明) 资料来源:《STL标准库》为什么说它神秘呢,那好吧,我可以换一个更直白的词语,那就是“陷阱重重”。对于不了解auto_ptr的人来说,使用它就是一种灾难,而避免这种灾难,就必须揭开它神秘的面纱,了解其内部运作机制。为什么要出现auto_ptr view plaincopy to clipboardprint?void f() { ClassA* ptr = new ClassA; //create an object explicitly ...; //perform some operations delete ptr; //clean up ( 阅读全文
posted @ 2011-01-24 15:20 maxweii 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 1、定义一个CMap,向这个CMap中增加数据项(键-值对)。CMap<CString, LPCTSTR, CString, LPCTSTR>m_ItemMap;CString strKey = _T(""), str = _T("");int i;for(i = 0; i < 5; i++) { strKey.Format("%d", i); //这个是键 str.Format("A%d", i); //键对应的值 m_ItemMap.SetAt(strKey, str); }2、遍历整个CMa 阅读全文
posted @ 2011-01-20 14:11 maxweii 阅读(1214) 评论(0) 推荐(0) 编辑
摘要: 什么是STL呢?STL就是Standard Template Library,标准模板库。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。 STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用额外安装什麽。它被内建在你的编译器之内。因为STL的list是一个简单的容器,所以我打算从它开始介绍STL如何使用。如果你懂得了这个概念,其他的就都没有问题了。另 阅读全文
posted @ 2011-01-18 20:46 maxweii 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 详细解说STL hash_map系列 来源于http://www.stlchina.org/0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华山派掌门人,人称君子剑张三丰-武当掌门人,太极拳创始人东方不败-第一高手,葵花宝典...这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"的信息,最傻的方法就是取得所有的记录,然后按照名字一个一个比较。如果要速度快,就需要把这些记录按照字母顺序排列,然后按照二分法查找 阅读全文
posted @ 2011-01-18 20:38 maxweii 阅读(389) 评论(0) 推荐(0) 编辑
摘要: 举一个简单的例子int & B(int &n){  n++;  return n;}int main(){  int a = 10;  int & b = B(a); // 调用 B, 传递的是 a 的引用  // 到了 B 里, n 就是指 a,  // return n; 就相当是 return a;  // 返回到 b 的就是 a 的引用, b 就是 a  // 对 n 和 b 的操作会直接影响 a, 因为它们是同一个东西.  cout b endl;  cout a endl;}----------------------------------对于 int A 阅读全文
posted @ 2011-01-17 20:36 maxweii 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。如下是一个XML片段:<Persons><PersonID="1&q 阅读全文
posted @ 2011-01-14 19:08 maxweii 阅读(550) 评论(0) 推荐(0) 编辑
摘要: 概览:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。1. 模板的概念。我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。//函数1.int max(int x,int y);{return(xy)?x:y ;}//函数2.float max( float x,float y){return 阅读全文
posted @ 2011-01-11 21:13 maxweii 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 首先构造一个对象并提供相应的参数,构造函数原型如下: CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义如下: bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。 lp 阅读全文
posted @ 2011-01-11 20:34 maxweii 阅读(324) 评论(0) 推荐(0) 编辑
摘要: 一、默认参数在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数。默认参数的语法与使用:(1)在函数声明或定义时,直接对参数赋值。这就是默认参数;(2)在函数调用时,省略部分或全部参数。这时可以用默认参数来代替。注意:(1)默认参数只可在函数声明中设定一次。只有在没有函数声明时,才可以在函数定义中设定。(#add ,此句意为存在函数声明和定义两部分的时候。验证表明有这个限制,可以随便,但出于规范,在声明中指定)(2)如果一个参数设定了缺省值时,其右边的参数都要有缺省值。(#add 这是定义时,类的成员函数的参数表在声明时默认参数位于参数表右部, 使用 阅读全文
posted @ 2011-01-11 20:22 maxweii 阅读(6198) 评论(0) 推荐(1) 编辑
摘要: 一.Map 概述Map 是STL 的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map 中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map 内部数据的组织,map 内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map 内部所有的数据都是有序的,后边我们会见识到有序的好处。下面举例说明什么是一对一的数据映射。比如一个班级中,每个学生的学号跟他的姓名就存在着一一映射的关系,这个模型用map 可能轻易描述,很明显学号用int 描述,姓名 阅读全文
posted @ 2011-01-10 15:03 maxweii 阅读(468) 评论(0) 推荐(0) 编辑
摘要: 作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。UML结构图:抽象基类:1)Prototype:虚拟基类,所有原型的基类,提供Clone接口函数接口函数:1)Prototype::Clone函数:纯虚函数,根据不同的派生类来实例化创建对象.解析:Prototype模式其实就是常说的"虚拟构造函数"一个实现,C++的实现机制中并没有支持这个特性,但是通过不同派生类实现的Clone接口函数可以完成与"虚拟构造函数"同样的效果.举一个例子来解释这个模式的作用,假设有一家店铺是配钥匙的,他对外提供配制钥匙的服务(提供Clone接口函数),你需要配什么钥匙它不知道只是提供这种服务, 阅读全文
posted @ 2011-01-10 00:53 maxweii 阅读(1187) 评论(0) 推荐(0) 编辑
摘要: 作用:允许一个对象在其内部状态改变时改变它的行为.UML结构图:解析:State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责任交给了具体的状态类去负责.同时,State模式和Strategy模式在图示上有很多相似的地方,需要说明的是两者的思想都是一致的,只不过封装的东西不同:Stat 阅读全文
posted @ 2011-01-10 00:47 maxweii 阅读(379) 评论(0) 推荐(0) 编辑
摘要: 作用:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。UML结构图:适用于以下情况:1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。2)当构造过程必须允许被构造的对象有不同的表示时。抽象基类:1)Builder:这个基类是全部创建对象过程的抽象,提供构建不同组成部分的接口函数接口:1)Builder::BuildPartA,Builder::BuildPartB:是对一个对象不同部分的构建函数接口,Builder的派生类来具体实现.另外还有一个需要注意的函数,就是Director::Construct函数,这个函数里面通过调用上面的两个接口函数 阅读全文
posted @ 2011-01-09 22:47 maxweii 阅读(841) 评论(0) 推荐(0) 编辑
摘要: 作用:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作.UML结构图:解析:Comnand模式的思想是把命令封装在一个类中,就是这里的Command基类,同时把接收对象也封装在一个类中就是这里的Receiver类中,由调用这个命令的类也就是这里的Invoker类来调用.其实,如果弄清楚了Command模式的原理,就会发现其实它和注册回调函数的原理是很相似的,而在面向过程的设计中的回调函数其实和这里的Command类的作用是一致的.采用Command模式解耦了命令的发出者和命令的执行者.实现:1)Command.h/**//**** 阅读全文
posted @ 2011-01-09 22:02 maxweii 阅读(959) 评论(0) 推荐(0) 编辑
摘要: 作用:提供一种方法顺序访问一个聚合对象中各个元素,,而又不需暴露该对象的内部表示.UML结构图:解析:Iterator几乎是大部分人在初学C++的时候就无意之中接触到的第一种设计模式,因为在STL之中,所有的容器类都有与之相关的迭代器.以前初学STL的时候,时常在看到讲述迭代器作用的时候是这么说的:提供一种方式,使得算法和容器可以独立的变化,而且在访问容器对象的时候不必暴露容器的内部细节,具体是怎么做到这一点的呢?在STL的实现中,所有的迭代器(Iterator)都必须遵照一套规范,这套规范里面定义了几种类型的名称,比如对象的名称,指向对象的指针的名称,指向对象的引用的名称....等等,当新生 阅读全文
posted @ 2011-01-09 21:46 maxweii 阅读(5754) 评论(0) 推荐(1) 编辑
摘要: 作用:将一个类的接口转换成客户希望的另外一个接口。Adapt 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。UML示意图1)采用继承原有接口类的方式2)采用组合原有接口类的方式解析:Adapt模式其实就是把完成同样的一个功能但是接口不能兼容的类桥接在一起使之可以在一起工作,这个模式使得复用旧的接口成为可能.实现:Adapt模式有两种实现办法,一种是采用继承原有接口类的方法,一种是采用组合原有接口类的方法,这里采用的是第二种实现方法.1)Adapt.h/**//************************************************************ 阅读全文
posted @ 2011-01-09 21:36 maxweii 阅读(833) 评论(0) 推荐(0) 编辑
摘要: 作用:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.UML结构图:实现:1)Strategy.h/**//********************************************************************created:2006/08/06filename:Strategy.hauthor:李创http://www.cppblog.com/converse/purpose:Strategy模式的演示代码************************************************ 阅读全文
posted @ 2011-01-09 21:11 maxweii 阅读(410) 评论(0) 推荐(0) 编辑
摘要: placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。它的原型如下:void *operator new( size_t, void *p ) throw(){ return p; }首先我们区分下几个容易混淆的关键词:new、operator new、placement new (#add 全局new,类内部new)new和delete操作符我们应该都用过,它们是对堆中的内存进行申请和释放,而这两个都是不能被重载的。要实现不同的内存分配行为,. 阅读全文
posted @ 2011-01-06 10:27 maxweii 阅读(528) 评论(0) 推荐(0) 编辑
摘要: 作用: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 UML结构图: 解析: Observer模式定义的是一种一对多的关系,这里的一就是图中的Subject类,而多则是Obesrver类,当Subject类的状态发生变化的时候通知与之对应的Obesrver类们也去相应的更新状态,同时支持动态的添加和删除Observer对象的功能。Obesrver模式的实现要点是,第一:一般subject类都是采用链表等容器来存放Observer对象,第二:抽取出Observer对象的一些公共的属性形成Observer基类,而Subject中保存的则 阅读全文
posted @ 2010-12-28 19:41 maxweii 阅读(339) 评论(0) 推荐(0) 编辑
摘要: •UML中的关系(Relationships)主要包括4种:关联关系、依赖关系、泛化关系和实现关系。 关联关系(Association)•关联关系是一种结构化的关系,指一种对象和另一种对象有联系。给定关联的两个类,可以从其中的一个类的对象访问到另一个类的相关对象。•在UML图中,关联关系用一条实线表示。 依赖关系(Dependency) •对于两个对象X、Y,如果对象X发生变化,可能会引起对另一个对象Y的变化,则称Y依赖于X。•在UML图中,依赖关系用一条带有箭头的虚线来表示。 泛化关系(Generalization)•UML中的泛化关系定义了一般元素和特殊元素之间的分类关系,与和C++及Ja 阅读全文
posted @ 2010-12-28 10:45 maxweii 阅读(362) 评论(0) 推荐(0) 编辑
摘要: 在Delphi中TabCtrl的使用是比较方面的,但在VC中并不是怎么的好用;VC中的CtabCtrl类只提供了一些基本的控制与消息,而TabCtrl上的页面呈现还需我们用对话框来处理。下面我们就以例子的形式来讲述VC中CtabCtrl的相关用法,希望对你有一定的帮助。在VC中使用CtabCtrl主要经历如下步骤:1、建立一个基于对话框的应用程序 2、画CTabCtrl控件,类向导中关联变量名为m_rTabCtrl,新建三个对话框属性设为Child,None,用ClassWizard生成新的类,基类为CDialog,分别为CTestpage0,CTestpage1,CTestpage2,ID号 阅读全文
posted @ 2010-12-27 14:31 maxweii 阅读(3801) 评论(0) 推荐(0) 编辑
摘要: DLL的优点简单的说,dll有以下几个优点:1) 节省内存。同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中。如果使用dll,则只在内存中加载一次,所有使用该dll的进程会共享此块内存(当然,像dll中的全局变量这种东西是会被每个进程复制一份的)。2) 便于不需编译的软件系统升级,若一个软件系统使用了dll,则该dll被改变(函数名不变)时,系统升级只需要更换此dll即可,不需要重新编译整个系统。事实上,很多软件都是以这种方式升级的。例如我们经常玩的星际、魔兽等游戏也是这样进行版本升级的。3) Dll库可以供多种 阅读全文
posted @ 2010-12-26 17:50 maxweii 阅读(303) 评论(0) 推荐(0) 编辑
摘要: (目前只能用在基于对话框的程序,SDI测试失败,待解决,在SDI中响应OnSize消息则可)1、最小化的原理:首先要将窗口隐藏,然后 在右下角绘制图标。2、恢复的原理:将窗口显示,再将托盘中的图片删除。(二)程序实现1、自定义消息WM_SHOWTASK: #define WM_SHOWTASK (WM_USER +1)2、在MFC的(的dlg类中)OnSysCommand(UINT nID, LPARAM lParam)函数体中增加一个命令响应 if(nID==SC_MINIMIZE) ToTray(); //最小化到托盘的函数3、在消息映射中添加 ON_MESSAGE(WM_SHOWTA 阅读全文
posted @ 2010-12-25 23:50 maxweii 阅读(3079) 评论(0) 推荐(0) 编辑
摘要: 下图是一个类似VC的界面,左边、底下有两个可浮动、可变大小的控制窗口。许多朋友都希望在自己的程序中实现类似的界面,因为此种类型的界面用途很广、通用性很强,所以笔者总结了一下实现的步骤,辑此一文,并提供源代码供大家参考!一、实现原理图中两个窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi Posea先生已经为我们实现了一个称为CSizingControlBar的类,而且做得相当完美!我们所要做的便是好好地利用该类,为了尽可能地简洁,笔者将CSizingControlBar类修改了一下并命名为CCoolBar,接下来我们将详细介绍如何利用该类实现我们 阅读全文
posted @ 2010-12-24 18:09 maxweii 阅读(4542) 评论(1) 推荐(0) 编辑
摘要: 使用过IE浏览器的朋友都知道IE界面上的扁平工具条、地址栏,扁平工具栏上的按钮正常状态下为扁平态,按钮上的图像为灰色,当鼠标放在按钮上时,按钮突起(这种状态称为手柄),并且其上的图像变得鲜艳醒目,一些按钮上还有汉字说明或标有小黑三角的下拉按钮,单击时显示下拉菜单,这些技术是怎么实现的呢,本文针对这些问题介绍了如何利用VC编程来实现它们。  IE风格的实现主要在主框架类的CMainFrame::OnCreate()实现,它的主要思想如下:首先定义一个CReBar对象,用以作工具条、地址栏的容器,然后分别声明图像列表对象img用于存储工具栏上按钮的热点图像和正常状态下显示的图像。为了显示扁平工具栏 阅读全文
posted @ 2010-12-24 18:03 maxweii 阅读(454) 评论(0) 推荐(0) 编辑
摘要: 本文在实现过程中,为了方便起见,参照VC 知识库《轻松实现类VC界面》。一、实现原理图中右侧浮动窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi Posea先生已经为我们实现了一个称为CSizingControlBar的类,而且做得相当完美!我们所要做的便是好好地利用该类,为了尽可能地简洁,将CSizingControlBar类修改了一下并命名为CCoolBar,接下来我们将详细介绍如何利用该类实现我们所需的界面。二、实现步骤示例[1]前期准备已知一个单文档的MFC工程TESS,其它选项默认。将本文示例代码中的CSizingControlBar类 阅读全文
posted @ 2010-12-24 16:43 maxweii 阅读(609) 评论(0) 推荐(0) 编辑
摘要: IMPLEMENT_DYNAMIC是实现“运行时类型识别”宏,与之相对应的是DECLARE_DYNAMIC(声明“运行时类型识别”宏)。也就是说你在.CPP文件中如果看见有IMPLEMENT_DYNAMIC,则在.H文件中必定有DECLARE_DYNAMIC的声明。 DECLARE_DYNAMIC/DEClARE_DYNAMIC是为了确定运行时对象属于哪一个类而定义的宏。 DEClARE_DYNCREATE/IMPLEMENT_DYNCREATE是为了“动态创建"类的实例而定义的宏。new可以用来创建对象,但不是动态的。比如说,你要在程序中实现根据拥护输入的类名来创建类的实例,下面的做法是通不 阅读全文
posted @ 2010-12-24 11:54 maxweii 阅读(1396) 评论(0) 推荐(0) 编辑
摘要: CDC是MFC的DC的一个类 HDC是DC的句柄,API中的一个类似指针的数据类型.MFC类的前缀都是C开头的 H开头的大多数是句柄 首先说一下什么是DC(设备描述表)解:Windows应用程序通过为指定设备(屏幕,打印机等)创建一个设备描述表(Device Context, DC)在DC表示的逻辑意义的“画布”上进行图形的绘制。DC是一种包含设备信息的数据结构,它包含了物理设备所需的各种状态信息。Win32程序在绘制图形之前需要获取DC的句柄HDC,并在不继续使用时释放掉。在c++ 编程中常会见到HDC,CDC,CClientDC,CPaintDC,CWindowDC这样的类HDC是DC的句 阅读全文
posted @ 2010-12-23 18:13 maxweii 阅读(849) 评论(0) 推荐(1) 编辑
摘要: OnCreate InitDialog区别:WM_CREATE的时候窗口还没有建立,你可以给成员变量赋值,也可以修改窗口的基本内容比如风格,但是不能对窗口控件操作,因为窗口还没有建立。 INITDIALOG时候窗口已经建立,你可以移动窗口,修改风格等等,也可以给成员变量赋值,通常你要先建立(OnCreate)一个窗体,然后再对他进行初始化(OninitDialog).WM_INITDIALOG The WM_INITDIALOG message is sent to the dialog box procedure immediately before a dialog box is disp 阅读全文
posted @ 2010-12-23 01:00 maxweii 阅读(2705) 评论(0) 推荐(1) 编辑
摘要: BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误。 BoundsChecker能检测的错误包括:1)指针操作和内存、资源泄露错误,比如:内存泄露;资源泄露;对指针变量的错误操作。2)内存操作方面的错误,比如:内存读、写溢出;使用未初始化的内存。3)API函数使用错误。使用BoundsChecker对程序的运行时错误进行检测,有两种使用模式可供选择。一种模式叫做ActiveCheck,一种模式叫做FinalCheck。下面分别进行介绍。一,ActiveCheck是BoundsChecker提供的一种方便、快捷的错误检测模式,它能检测的错误种类有 阅读全文
posted @ 2010-12-21 18:55 maxweii 阅读(678) 评论(0) 推荐(0) 编辑