摘要: 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 阅读(2741) 评论(0) 推荐(1) 编辑
摘要: MFC框架各部分指针获取方式:记住,是获取指针MFC消息流程图:string CString char* 的互相转换: string 转 CString CString.Format("%s", string.c_str()); //用c_str()比data()好 char 转 CString CString.Format("%s", char*); // 可以直接给CString赋值,不要用Format char* 转 string string s(char *); CString 转 string string s(CString.GetBuff 阅读全文
posted @ 2010-12-19 16:26 maxweii 阅读(1537) 评论(1) 推荐(1) 编辑
摘要: 矢量的概念: 如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。矢量加减法: 设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )。显然有性质 P + Q = Q + P,P - Q = - ( Q - P )。 矢量叉积: 计算矢量叉积是与直线和线段相关算法的核心部分。设矢... 阅读全文
posted @ 2011-09-14 00:00 maxweii 阅读(330) 评论(1) 推荐(1) 编辑
摘要: The ability to customize the summary information for a type in the Watch and Variable windows in the Visual C++ debugger has existed for a long time, and for this reason, the feature doesn't receive a lot of coverage in new articles and books on the Visual C++ debugger. Even though the display i 阅读全文
posted @ 2011-09-01 11:26 maxweii 阅读(498) 评论(0) 推荐(0) 编辑
摘要: 1 doxygen是大名鼎鼎代码文档工具。下载地址:www.doxygen.org安装它。http://www.stack.nl/~dimitri/doxygen/download.html可下载.2 Graphviz这个工具配合doxygen使用,可以提取函数,模块之间的调用关,非常清晰。下载地址:http://www.graphviz.org/Download..php下面是Graphviz提取出来的一些关系图:3 htmlhelp这个工具把doxygen生成的html文件,转化为一个CHM文件,看起来方便些。下载地址:http://www.microsoft.com/downloads/ 阅读全文
posted @ 2011-08-30 15:27 maxweii 阅读(1015) 评论(0) 推荐(0) 编辑
摘要: 十一、模板与继承1、当从模板类派生出子类时必须注意的是:子类并不会从通用的模板基类继承而来,只能从基类的某一实例继承而来。这样的话就有以下几种继承方式:a、基类是模板类的一个特定实例版本,比如template<class T> class B : public A<int>{};b、基类是一个和子类相关的一个实例,比如template<class T> class B : public A<T>{};这时当实例化一个子类B的时候,基类就相应的被实例化为一个和子类相同的实例版本,比如B<int> m;模板类B被实例化为int 版本,这时 阅读全文
posted @ 2011-08-26 14:24 maxweii 阅读(386) 评论(0) 推荐(0) 编辑
摘要: 1定义一个CTime类对象 CTime time;2得到当前时间 time = CTime::GetCurrentTime();3 GetYear(),GetMonth(), GetDay(), GetHour(), GetMinute(), GetSecond(), GetDayOfWeek() 返回整型(int)对应项目4 将当前时间格式化 CString date = time.Format("%Y-%m-%d %H:%M:%S %W-%A");说明:1) 结果为:2006-10-13 17:23:47 41-Friday2) 格式符号说明%a—— 星期(缩写英文), 阅读全文
posted @ 2011-08-23 18:05 maxweii 阅读(6591) 评论(1) 推荐(0) 编辑
摘要: 如果嵌套类型和其外部类型之间的关系需要成员可访问性语义,需要使用C++嵌套类,嵌套类型不应针对其声明类型以外的类型执行任务,而C++局部类允许类、结构和接口被分成多个小块儿并存储在不同的源文件中,这样的实现很容易开发和维护。 C++局部类:在一个函数体内定义的类称为局部类。局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关(#add,这半句是什么屁话?)。局部类不能被外部所继承。在定义局部类时需要注意:局部类中不能说明静态成员函数,并且所有成员函数都必须定义在类体内(#add,因为除此之外没有别的地方可以写定义体)。在实践中,局部类是很少使用的。下 阅读全文
posted @ 2011-08-12 13:25 maxweii 阅读(488) 评论(0) 推荐(0) 编辑
摘要: 1.常被人鄙视的方法(PreTranslateMessage)经常见到有人问怎么屏蔽html的右键菜单,有人答用PreTranslateMessage函数拦截wm_rbuttondown消息,于是总会有人说这种方法怎么烂,@_@,我真不知道为什么,不过我想这也是一种方法呀,而且非常简单,所以还是列出来吧:)BOOL CPreTranslateMsgView::PreTranslateMessage(MSG* pMsg){ // TODO: 在此添加专用代码和/或调用基类 if ((pMsg->message == WM_RBUTTONDOWN)||(pMsg->message == 阅读全文
posted @ 2011-08-02 18:40 maxweii 阅读(878) 评论(0) 推荐(1) 编辑
摘要: DoDataExchange由框架调用,作用是交互并且验证对话框数据,主要由(DDX) 和 (DDV)宏实现。永远不要直接调用这个函数,而是通过UpdateData(TRUE/FALSE)实现控件与变量之间值的传递。 当然你也可以不使用DoDataExchange而完成控件与变量之间值的传递,如: 通过GetWindowText和SetWindowText等等函数完成String变量与Edit控件之间的数据交互, DDX/DDV 通过使用ClassWizard向对话类添加成员变量,你可以利用ClassWizard所提供的高效特征,为对话数据交换和对话数据验证自动生成源代码,也就是人们所熟知的D 阅读全文
posted @ 2011-07-21 18:09 maxweii 阅读(6047) 评论(2) 推荐(3) 编辑
摘要: 使用由 CHeaderCtrl 类表示的标头控件显示纵栏式列表的列标头。例如,标头控件对于实现电子表格中的列控件应该很有用。 标头控件通常分为叫做“标头项”的各个部分,每个部分有一个关联文本或数字列的标题。根据设置的样式,可以为用户提供若干操作标头项的直接方式。 注意CListCtrl 提供嵌入标头控件,而 CListView 在 MFC 类中封装 CListCtrl。通常,可考虑使用 CHeaderCtrl 为想要自己绘制的列表加标签。 标头控件和列表控件 (List Control) 大多数情况下,使用嵌入 CListCtrl 或 CListView 对象中的标头控件。但在某些情况中,最好 阅读全文
posted @ 2011-07-14 10:01 maxweii 阅读(3940) 评论(0) 推荐(0) 编辑
摘要: 一 如果函数对传入的指针参数进行修改,一定要把参数设置为指针的指针或者指针的引用// Delete the first occurrence of the node// which value equals item in a single linked listvoid Delete(Node *head, int item){ if(head->value == item) head = NULL ;}这段代码的问题是,第一个参数是指针类型而head = NULL 修改的实际上是这个指针的一个副本(#add 诚然 这段代码仅为了用于防止野指针,因为仅将传入指针置为NULL,而没有去操 阅读全文
posted @ 2011-06-27 11:07 maxweii 阅读(329) 评论(0) 推荐(0) 编辑
摘要: Quake3游戏,这些源代码相当精髓,越是低层的函数,越令人叹为观止,效率是如此之高,函数如此之简洁,能读一下,对我们的编程能力相当有帮助.然而我只是初步浏览了一下,还有许多不明白的地方,诸如平台共享性,Quake3"游戏引擎"的更多精髓之处,资源文件的怎样编辑,怎样令CPU始终分配有续而不出现卡屏. 现在Quake3的游戏源代码已经全部开放,对于这个时代的"Quake迷"来说,不失为一个又学习编程与玩游戏的大好机会.费话勿说,进入正题. 在开始之后,请务必下载以下几个文件. 1.Quake 3 Demo版http://www.cnblogs.com/w 阅读全文
posted @ 2011-06-18 23:19 maxweii 阅读(591) 评论(1) 推荐(0) 编辑
摘要: 掌握C++对象模型底层知识的人都知道,C++利用虚函数的机制来实现运行期的多态。例如一个类申明如下:classA{public:A(){}~A(){}virtualvoidf1(){printf("Founctionf1called\n");}virtualvoidf2(){printf("Founctionf2called\n");}virtualvoidf3(){printf("Founctionf3called\n");}private:intn;};那么A对象在内存中的结构图大概如下: (缺失)如上图:可以看到A对象的前4个字 阅读全文
posted @ 2011-06-17 10:02 maxweii 阅读(2236) 评论(0) 推荐(0) 编辑
摘要: 1、非模态对话框的模板必须具有Visible风格,否则对话框将不可见,而模态对话框则无需设置该项风格。更保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。2、非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建在堆栈上。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。3、*通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是模态对话框的关键所在。由于Create函数不会启动新 阅读全文
posted @ 2011-06-13 15:56 maxweii 阅读(3505) 评论(0) 推荐(0) 编辑
摘要: 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序员使用。 iostream为内置类型类型对象提供了输入输出支持,同时也支持文件的输入输出,类的设计者可以通过对iostream库的扩展,来支持自定义类型的输入输出操作。 为什么说要扩展才能提供支持呢?我们来一个示例。#include <stdio.h> #include <iostream> using namespace s 阅读全文
posted @ 2011-06-10 15:48 maxweii 阅读(412) 评论(0) 推荐(0) 编辑
摘要: 1. IntroductionMD5算法是一种消息摘要算法(Message Digest Algorithm),此算法以任意长度的信息(message)作为输入进行计算,产生一个128-bit(16-byte)的指纹或报文摘要(fingerprint or message digest)。两个不同的message产生相同message digest的几率相当小,从一个给定的message digest逆向产生原始message更是困难(不过据说我国的某个教授很善于从message digest构造message),因此MD5算法适合用在数字签名应用中。MD5实现简单,在32位的机器上运行速度也 阅读全文
posted @ 2011-06-10 11:33 maxweii 阅读(507) 评论(0) 推荐(0) 编辑
摘要: 译者序:很久以前就知道了A*算法,但是从未认真读过相关的文章,也没有看过代码,只是脑子里有个模糊的概念。这次决定从头开始,研究一下这个被人推崇备至的简单方法,作为学习人工智能的开始。这篇文章非常知名,国内应该有不少人翻译过它,我没有查找,觉得翻译本身也是对自身英文水平的锻炼。经过努力,终于完成了文档,也明白的A*算法的原理。毫无疑问,作者用形象的描述,简洁诙谐的语言由浅入深的讲述了这一神奇的算法,相信每个读过的人都会对此有所认识(如果没有,那就是偶的翻译太差了--b)。现在是2005年7月19日的版本,应原作者要求,对文中的某些算法细节做了修改。原文链接:http://www.gamedev. 阅读全文
posted @ 2011-06-10 10:06 maxweii 阅读(337) 评论(2) 推荐(0) 编辑
摘要: 子类化 如果你曾经在 Windows 环境下编过程序,有时候就会发现:有一个现成的窗口,几乎有你所需要的全部功能,但还不完全一样。如果你需要一个具有过滤特殊字符功能的 Edit 控件。当然最直接的方法就是自己用代码来实现,但这的确是一个费时又很困难的任务,而子类化就可以用来做这种事情。 子类化允许你接管被子类化的窗口,使你对它有绝对的控制权。举个例子了来阐明一下:例如你需要一个只接受十六进制数字输入的文本编辑框,如果使用一个简单的 Edit控件,当用户输入十六进制以外的字符时,你既不知道也无计可施。也就是说,当用户进文本框中输入字符串 "zb+q*" 时,如果除了拒绝接受整 阅读全文
posted @ 2011-06-09 15:52 maxweii 阅读(767) 评论(0) 推荐(1) 编辑
摘要: Goolgle 于 2008.09.02 发布了浏览器 Google Chrome。Google Chrome 使用的内核源码来自开源浏览器引擎 WebKit Open Source Project。Google Chrome 的源码,同样亦是开源的。在 Google 的中文官方 Blog - Google 黑板报中,提到:QUOTE: 我们对很多开发开源项目的人心存感激,我们承诺会沿着前人的路继续前行。 我们借鉴了一些源自 Apple WebKit 和 Mozilla Firefox 的技术,怀着同样开源的精神,谷歌浏览器所有的代码全部开源。我们希望能与整个业界合作从而促进互联网的健康发展。 阅读全文
posted @ 2011-06-05 11:58 maxweii 阅读(794) 评论(0) 推荐(0) 编辑
摘要: 前一段时间编了一个小程序,因要在对话框上设置滚动条,现就对话框上应用滚动条的一点经验给大家作个参考,如有不对之处望各位高手给予指证。在对话框上要应用滚动条,首先当然是要将对话框的属性vertical scroll选中(在这里只介绍纵向滚动条,横向滚动条与之原理相同)。然后是按Ctlr+w进入classwizard选中对话消息WM_OnVScroll,并添加它的响应函数,接着进入代码编辑区,写入代码:void CRq::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message ha 阅读全文
posted @ 2011-06-03 19:41 maxweii 阅读(692) 评论(0) 推荐(0) 编辑
摘要: 恕我孤陋寡闻,数月前才知道2005里有很多ctrl+某键的快捷方式,最常用的ctrl+k、ctrl+c批量注释 和ctrl+k、ctrl+u批量取消注释。现在突然想在本本上用,只有6.0,找了个方法,可行,如下:打开记事本,输入如下代码:Sub CommentBlock()With ActiveDocument.Selection'对于当前窗口打开的文档中选中的文本 .ReplaceText "%", "//", dsMatchRegExpB'在开始位置增加 // 注释End WithEnd SubSub UncommentBlock() 阅读全文
posted @ 2011-06-01 15:29 maxweii 阅读(288) 评论(0) 推荐(0) 编辑
摘要: 一,什么是表驱动 表驱动,又称之为表驱动法、表驱动方法。 “表”是几乎所有数据结构课本都要讨论的非常有用的数据结构。表驱动方法出于特定的目的来使用表,程序员们经常谈到“表驱动”方法,但是课本中却从未提到过什么是"表驱动"方法。表驱动方法是一种使你可以在表中查找信息,而不必用很多的逻辑语句(if或Case)来把它们找出来的方法。事实上,任何信息都可以通过表来挑选。在简单的情况下,逻辑语句往往更简单而且更直接。但随着逻辑链的复杂,表就变得越来越富有吸引力了,通过下面的这个例子大家就能知道什么是所谓的表驱动方法了。 假设你需要一个可以返回每个月中天数的函数(为简单起见不考虑闰年) 阅读全文
posted @ 2011-06-01 14:32 maxweii 阅读(479) 评论(0) 推荐(0) 编辑
摘要: CComObjectRootObjectBase中以表驱动的方式对接口的查询作了一个内部的实现,即InternalQueryInterface()。所以在创建基于ATL的COM类时,需要创建一个包含所有实现接口的映射表。1. BEGIN_COM_MAP、END_COM_MAP、COM_INTERFACE_ENTRY与COM_INTERFACE_ENTRY2宏ATL提供了BEGIN_COM_MAP、END_COM_MAP、COM_INTERFACE_ENTRYCOM_INTERFACE_ENTRY2这4个宏来创建接口映射表。假设一个类CClassA继承了接口IIntA和IIntB,则该类的接口映 阅读全文
posted @ 2011-06-01 14:00 maxweii 阅读(803) 评论(0) 推荐(0) 编辑
摘要: Detours是微软开发的一个函数库,可用于捕获系统API。在用其进行程序开发之前,得做一些准备工作:一.下载Detours 在http://research.microsoft.com/sn/detours 可免费下载Detours二.安装Detours 一路NEXT三.生成Detours库 在安装后的文件夹下找不到直接可以拿来用的LIB文件,但是却有SRC文件(在**\Microsoft Research\Detours Express 2.1\src下)。该文件夹下还有Makefile,可以直接用来生成库。 将Detours路径下的SCR文件夹拷贝到**\Microsoft Visual 阅读全文
posted @ 2011-06-01 10:42 maxweii 阅读(3960) 评论(0) 推荐(0) 编辑
摘要: 1比如:vector vecID; 中保存了m个ID,这时要删除第n个ID。遍历是一个方法;即vector::itertor it = vecID.begin(); 然后++it n次。更好的方法是:vector::itertor it = vecID.begin() + n; vector的迭代器直接支持这种偏移。然后用vecID.erase(it)方法 删除该元素。2.去除一个容器中有特定值的所有对象1)如果容器是vector、string或deque,使用erase-remove惯用法,例如c.erase(remove(c.begin(), c.end(), 1963),c.end()) 阅读全文
posted @ 2011-05-31 18:02 maxweii 阅读(413) 评论(0) 推荐(0) 编辑
摘要: 刚接触TCP/IP通信设计的人根据范例可以很快编出一个通信程 序,据此一些人可能会认为TCP/IP编程很简单。其实不然, TCP/IP编程具有较为丰富的内容。其编程的丰富性主要体现在 通信方式和报文格式的多样性上。 一。通信方式: 主要有以下三大类: (一)SERVER/CLIENT方式 1.一个Client方连接一个Server方,或称点对点(peer to peer): 2.多个Client方连接一个Server方,这也是通常的并发服务器方式。 3.一个Client方连接多个Server方,这种方式很少见,主要用于一个客户向多个服务器发送请求情况。 (二)连接方式 1.长连接 Client 阅读全文
posted @ 2011-05-30 15:41 maxweii 阅读(292) 评论(0) 推荐(0) 编辑
摘要: 在windows系列上做编程,gdi是一个很重要的技术点,有很多程序在运行多次后出现异常,除了众所周知的内存泄露以外,gdi资源泄露也是一个很直接的原因.今天就把我自己在编程中总结的一些经验给大家分享,欢迎高手补充.1.Create出来的gdi对象,一定要用DeleteObject来释放,释放顺序是先Create的后释放,后Create的先释放.这里的Create指的是以它为开头的gdi函数,比如,CreateDIBitmap,CreateFont等等,最后都要调用DeleteObject来释放.2.Create出来的dc要用DeleteDC来释放,Get到的要用ReleaseDC释放.3.确 阅读全文
posted @ 2011-05-27 16:51 maxweii 阅读(863) 评论(4) 推荐(1) 编辑
摘要: 指针是 C 与其他语言区别的重要特征之一,在 C++ 中,指针也被广泛运用,我们通过指针实现多态。然而,众所周知,指针的使用必须小心,否则很容易造成内存泄漏 Memory Leak。当我们有几个指针指向同一个对象时有其应该注意,关于何时释放这个对象:(1) 如果释放的太早,那么其它的指针仍然指向这片内存,如果再使用它会造成未定义行为。(2) 如果一直不释放可能会丢失最后一个指向这个对象的指针 导致内存无法被释放。 用 C++ 的方法来解决这种问题就是建立一个类来包含需要管理的指针 ,由于这些类往往与被管理者相绑定 ,所以它们被称为 handel 类 ,人们再建立这种 handel 类的同时一般 阅读全文
posted @ 2011-05-27 00:07 maxweii 阅读(408) 评论(0) 推荐(0) 编辑
摘要: 一: 在代理类的帮助下,我们已经可以实现在一个容器里存储一个类层次里所有类型的对象,但是代理有一个很明显的缺点,就是需要复制对象,当一个对象非常大或者是一种不能轻易复制的资源的时候,这个实现遇到了很大的困难,于是我们有了句柄(handle)类这个技术。 我们有这么一个类class point{public:point():x_cdt(0),y_cdt(0){}point(int x,int y):x_cdt(x),y_cdt(y){}int get_x(){ return x_cdt; }int get_y(){ return y_cdt; }point& set_x(int x)// 阅读全文
posted @ 2011-05-26 23:56 maxweii 阅读(502) 评论(0) 推荐(0) 编辑
摘要: 重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符。以下讨论中将用到的例子:class CExample{public: CExample(){pBuffer = NULL; nSize = 0;} ~CExample(){delete pBuffer;} void Init(int n){ pBuffer = new char[n]; nSize = n;}private: char *pBuffer; //类的对象中包含指针,指向动态分配的内存资源 int nSize;};这个类的主要特点是包含指向其他资源的指针。pBuffer指向堆中分配的一段内存 阅读全文
posted @ 2011-05-26 14:43 maxweii 阅读(378) 评论(0) 推荐(0) 编辑
摘要: 委托就是把具体事情让别人做,我只调用你的函数。下面是一个例子:class RealSort{public:void sort();};class MySort{private:RealSort rs;public:SetName(RealSort rs){ this->rs = rs;}void sort(){ rs.sort();}};这里MySort将具体事情sort委托给RealSort做。委托的作用在于保持抽象层的稳定,让抽象层不随之细节的变化而变化,也就是你上层的代码如何变化,下层的代码可以维持稳定。就以这个例子来说,开始要求用选择排序,后来老板的要求变了,要用快速排序,那么我 阅读全文
posted @ 2011-05-23 10:16 maxweii 阅读(513) 评论(0) 推荐(0) 编辑
摘要: 问题是这样产生的.在OnEraseBkGnd中,如果你不调用原来缺省 的OnEraseBkGnd只是重画背景则不会有闪烁.而在OnPaint里面, 由于它隐含的调用了OnEraseBkGnd,而你又没有处理OnEraseBkGnd 函数,这时就和窗口缺省的背景刷相关了.缺省的 OnEraseBkGnd操作使用窗口的缺省背景刷刷新背景(一般情况 下是白刷),而随后你又自己重画背景造成屏幕闪动. 另外一个问题是OnEraseBkGnd不是每次都会被调用的.如果你 调用Invalidate的时候参数为TRUE,那么在OnPaint里面隐含 调用BeginPaint的时候就产生WM_ERASEBKGN 阅读全文
posted @ 2011-05-20 15:10 maxweii 阅读(671) 评论(0) 推荐(1) 编辑
摘要: 3.1 private的虚函数 考虑下面的例子:class A{public:void foo() { bar();}private:virtual void bar() { ...}};class B: public A{private:virtual void bar() { ...}}; 在这个例子中,虽然bar()在A类中是private的,但是仍然可以出现在派生类中,并仍然可以与public或者protected的虚函数一样产生多态的效果。并不会因为它是private的,就发生A::foo()不能访问B::bar()的情况,也不会发生B::bar()对A::bar()的overrid 阅读全文
posted @ 2011-05-19 11:24 maxweii 阅读(519) 评论(0) 推荐(0) 编辑
摘要: 自从1993年Bjarne Stroustrup 〔注1 〕提出有关C++ 的RTTI功能之建议﹐以及C++的异常处理(exception handling)需要RTTI;最近新推出的C++ 或多或少已提供RTTI。 然而,若不小心使用RTTI,可能会导致软件弹性的降低。本文将介绍RTTI的观念和近况﹐并说明如何善用它。 什么是RTTI? 在C++ 环境中﹐头文件(header file) 含有类之定义(class definition)亦即包含有关类的结构资料(representational information)。但是﹐这些资料只供编译器(compiler)使用﹐编译完毕后并未留下来. 阅读全文
posted @ 2011-05-11 23:15 maxweii 阅读(663) 评论(0) 推荐(0) 编辑
摘要: VC中在listctrl中嵌入进度条,截图如下:其实要实现这个非常容易,以下是自绘ListCtrl的代码,首先继承CListCtrl,然后增加函数OnCustomDraw:void CProcessList::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult){//draw each item.set txt color,bkcolor....NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);// Take the default processing unle 阅读全文
posted @ 2011-05-08 23:22 maxweii 阅读(2495) 评论(0) 推荐(0) 编辑
摘要: 消息系统是MFC的重要组成部分。MFC的消息响应机制并不复杂,而且MFC的开发环境 Visual Studio来供了非常好的自动化工具,自动生成代码。MFC也定义了丰富的宏来简化消息响应的代码。这使得很多初学者都能快速开发出基于消息响应机制的应用程序。然后也正是这些带来方便的宏,使很多人摸不着头脑。当不小心的代码操作使自动化工具不好用的时候,看着那一组更像是一堆的宏,很多人只好一头雾水。要想真正了解MFC的消息机制,必需弄清楚这些宏。好在源码面前无秘密,我们将从这些宏的源码着手,逐步分析、了解、并学习MFC的消息响应及映射机制。第一个宏:DECLARE_MESSAGE_MAP()作用:为一个消 阅读全文
posted @ 2011-05-06 09:37 maxweii 阅读(736) 评论(0) 推荐(0) 编辑
摘要: 要在程序中创建新设计的控件,显然不能用自动创建的办法,因为对话框模板对新控件的特性一无所知.程序可以用手工方法创建控件,在调用派生类的Create函数时,派生类会调用基类的Create函数创建控件.用Create函数创建控件是一件比较麻烦的工作,程序需要为函数指定一大堆的控件风格以及控件的坐标和ID.特别是控件的坐标,没有经验的程序员很难确切地安排控件的位置和大小,往往需要反复调整.利用MFC的CWnd::SubclassDlgItem提供的动态连接功能,可以避免Create函数的许多麻烦,该函数大大简化了在对话框中创建派生控件的过程. 大家知道,在用手工方法创建控件时,先要构建一个控件对象. 阅读全文
posted @ 2011-05-01 22:42 maxweii 阅读(450) 评论(0) 推荐(0) 编辑
摘要: 三、递推法 递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。设要求问题规模为N的解,当N=1时,解或为已知,或能非常方便地得到解。能采用递推法构造算法的问题有重要的递推性质,即当得到问题规模为i-1的解后,由问题的递推性质,能从已求得的规模为1,2,…,i-1的一系列解,构造出问题规模为I的解。这样,程序可从i=0或i=1出发,重复地,由已知至i-1规模的解,通过递推,获得规模为i的解,直至得到规模为N的解。【问题】阶乘计算 问题描述:编写程序,对给定的n(n≤100),计算并输出k的阶乘k!(k=1,2,…,n)的全部有效数字。 由于要求的整数可能大大超出一般整数的位数,程序用一 阅读全文
posted @ 2011-04-30 11:33 maxweii 阅读(762) 评论(0) 推荐(0) 编辑
摘要: “default”标签跳过“ ”的初始化操作问题解决:原因是在switch中有初始化的工作。在switch语句中不可以有定义部分。如果有定义,如初始化的时候,必须把定义部分需要用{ }括起来。 阅读全文
posted @ 2011-04-25 10:50 maxweii 阅读(524) 评论(0) 推荐(0) 编辑
摘要: 在STL中,map是按键来排序的,但很多时候需要按值来排序。一种方法是将map转化为vector,然后排序。(#add 此法缺点为 map内容没变,而是整个的传给vector了,之后所要用的是vector.或许也不能说是缺点.)另一个好的方案是 同时做一个反向的map,与之前的map,key value反过来存储.tool.h#ifndef TOOL_H#define TOOL_H#include <iostream>#include <vector>#include <map>#include <string>#include <algo 阅读全文
posted @ 2011-04-22 00:13 maxweii 阅读(1320) 评论(0) 推荐(0) 编辑
摘要: mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 他只能用于类的非静态和非常量数据成员 我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化! 如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员进行赋值.这个时候就需要用到mutable关键字了 . 阅读全文
posted @ 2011-04-21 11:19 maxweii 阅读(325) 评论(0) 推荐(0) 编辑