乞丐中的霸主(ぃ枫.net)(天行健,君子以自强不息;地势坤,君子以厚德载物! -《周易》)

C#,C++ 学习

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  63 随笔 :: 1 文章 :: 20 评论 :: 1 引用

2008年8月22日 #

     摘要: 服务端(异步):using System.Net ;using System.Net.Sockets ;using System.IO ;using System.Text ;using System.Threading ; public static ManualResetEvent allDone = new ManualResetEvent(false); private Thread t... 阅读全文
posted @ 2008-08-22 16:07 郑江涛 阅读(28) | 评论 (0)编辑

 

很早毛主席他老人家说过:人一辈子做一件好事不难,难得是一辈子做好事不做坏事。
就说明了这样一个道理,坚持是多么难的一件事。

互联网创业也同样贵在坚持!
马云因为坚持,把阿里巴巴送上了市,造就了中国的电子商务时代,而更重要的是跟随他10年的18罗汉竟然没有一个离开,一直坚持跟随他,一直坚持把着件事做好。他们成功了!
马云说过:今天很残酷,明天更残酷,后天很美好,大部分人死在明天晚上,看不到后天的太阳。”

金山的成功的背后也是不断自我颠覆,自我否定,自我选择,自我创新的艰难历程。
金山的坚持不但是为了活下去,而且是在残酷的竞争,甚至是死亡中坚持。最终金山终于实现上市的光荣与梦想。而为了这一切雷军坚持了18年!

冯仑总说,“伟大是熬出来的”,他认为对信念的执着不能靠一时的小聪明。在遇到困难时,多数人是再选择而不是将原来的选择坚持到底,“成功者与常人的差别并不是智商而是一种毅力”

创业如此,职场也是如此,一个开发人员经常换语言或开发工具的人往往哪个也学不精,因为没有专业积累。一个频繁换工作的人往往也很难有提升,因为没有行业积累。

人做事往往会前紧后松,刚开始做的时候很积极,很认真,时间长了,就慢慢松懈了。
人的心态如果能始终如一坚持一种积极进取和激情,一如既往的保持一种状态,想不成功都难!
人需要一种持之以恒的精神,
坚持是一种能力,坚持是一种智慧,坚持是一种风度,
坚持就会胜利! 

posted @ 2008-08-22 15:59 郑江涛 阅读(16) | 评论 (1)编辑

2008年8月21日 #

     摘要: 最近根据项目需要,需要我去用 vc++6.0 作一个 ActiveX web 组件。自己从来没有接触过这方面的编程,这次是头一遭!所以咱就做了,不过倒很出乎我的意料,比我想象的要快很多就完成了。现将 vc++6.0 操作 word 部分的关键代码部分帖出来,共享给大家。因为我在开发的时候遇到了很多问题,并且网上的资料很少,基本都是最基本的操作。所以帖出来,希望能让大家在开发的过程少走些弯路! 工... 阅读全文
posted @ 2008-08-21 10:09 郑江涛 阅读(31) | 评论 (0)编辑

2008年8月6日 #

MFC
 
前面我们利用AppWizard创建了一个应用程序框架,它除了显示一个Windows的多文档界面以外,目前还没有任何实际的用处,我们必须为它添加实际的功能。事实上,大多数Visual C++程序员都是在这个应用程序框架的基础上从事添加各种功能模块的工作,包括设计自己的类,编写具有一定功能的成员函数。
Visual C++的集成开发环境向用户提供了一个功能很强的操作类的工具—ClassWizard,我们可以利用该工具非常方便地向应用程序中添加类、向类中添加消息处理函数、成员函数、以及添加成员变量等。利用ClassWizard,我们再也不用手工编写那些繁琐的代码,只需使用简单的鼠标和键盘操作就能够完成大量的工作,相当于用机器制造机器。
一 ClassWizard简介
从字面上看,Class是类的意思,而Wizard则是“智者”的意思,两者合起来,ClassWizard的意思就是智能地操作类的工具。
在Visual C++ 6.0的集成开发环境中,ClassWizard最能体现它的特征。与AppWizard类似,ClassWizard也能自动生成程序代码,只是两者生成的对象不同,AppWizard主要用来创建应用程序的框架,而ClassWizard则主要是在应用程序框架的基础上创建和编辑各种类。
ClassWizard既可以操作由AppWizard在应用程序框架中创建的类,又可以操作后来由ClassWizard自己添加的类。利用ClassWizard可以很轻松地完成一些最基本、最普通的工作,如在自己的应用程序中创建新类、映射消息为其添加消息处理函数、覆盖虚拟函数、将对话框中的控件与某个变量相关联等。
ClassWizard只能用于使用MFC类库的应用程序中。
ClassWizard可以完成的主要功能如下:
◆ 创建新类。这是ClassWizard最基本的用途之一。创建的新类由一些主要的基类派生而来,这些基类用于处理Windows的消息,对一般用户来说,这些基类已经足够了。
◆ 进行消息映射。这些消息主要和窗口、菜单、工具栏、对话框、控件以及加速键相关联。
◆ 添加成员变量。利用ClassWizard,可以很方便地向类中添加成员变量,并将这些成员变量与对话框或窗口中的控件关联起来,当控件的值改变时,所对应的成员变量的值也跟着发生变化。
◆ 覆盖虚拟函数。使用ClassWizard可以方便地覆盖基类中定义的虚拟函数。
二 ClassWizard操作说明
在刚进入Visual C++ 集成开发环境时,菜单项View|ClassWizard是灰化禁止的,只有在打开一个工作区文件后,该菜单项才能正常显示,表明该选项是可用的。
首先打开以前创建的多文档应用程序FirstApp,再选择菜单项View|ClassWizard,即可启动ClassWizard,进入ClassWizard环境,ClassWizard是一个对话框,其中包含五个选项卡,分别为:Message Maps、Member Variables、Automation、ActiveX Events、以及Class Info。它们针对不同的对象完成不同的任务。
1. Message Maps选项卡
它是ClassWizard对话框中最重要的选项卡,主要完成创建新类、添加、删除消息处理函数等任务。
该选项卡中包含了两个下拉列表框:Project下拉列表框和Class name下拉列表框;三个列表框:Object IDs列表框、Message列表框和Member functions列表框;一个文本信息框;四个工具按钮。
★ Project下拉列表框:该下拉列表框用于选择当前操作的项目。当当前打开的工作区中包含多个项目文件时,用户可以从这个下拉列表框中选择将要操作的项目文件。对于单项目工作区来说,其默认值就是项目文件。
★ Class name下拉列表框:该下拉列表框用于选择当前要操作的类。当用户在Class name下拉列表框中选中了某个类之后,Object IDs窗口中的内容将会发生相应的变化。
★ Object IDs列表框:该列表框用于显示当前选定类中能够产生消息的对象的ID值。这些对象包括菜单选项、工具栏按钮选项、对话框以及各种控件等。
通常Object IDs列表框中所包含的第一个对象就是当前类名。
★ Message列表框:Message列表框中列出了对应于Object IDs列表框中所选中的当前项可以处理的消息以及可被重写的MFC虚函数。当Object IDs列表框中选定当前类名时,Message列表框前部分显示的是当前类所能覆盖的虚拟函数,后部分显示的是能够处理的消息。如Object IDs列表框中选定其它对象,则Message列表框显示的就是当前项可以处理的消息。
★ Member functions列表框:Member functions列表框中列出了在Class name下拉列表框中所选中的当前类包含的所有成员函数。其中用字母“V”标出的是MFC虚函数,用字母“W” 标出的是Windows消息处理函数。
★ 文本信息框:在Project下拉列表框的下方有一个文本信息框,用于显示当前选中类的源文件,包括.h文件和.cpp文件。该文本信息框中显示的内容会随着选定类的变化而变化。
★ Add Class按钮:该按钮用于向当前的Project中添加一个新类,新类可以是自己创建,也可以是从已有的文件中选取。
★ Add Function按钮:该按钮用于向当前选定类中为当前选定的消息添加一个消息处理函数。其中类是在Class name下拉列表框中选定的类;而当前消息则是在Message列表框中选定的消息。
Add Function按钮平时是灰化禁止的,只有当用户在Message列表框中选中某个特定的消息之后,该按钮才能正常显示,即此时才能使用。
★ Delete Function按钮:该按钮用于在当前选定的类中删除已有的成员函数。Delete Function按钮平时是灰化禁止的,只有当用户在Member functions列表框中选中某个消息处理函数之后,才能选择该按钮。
★ Edit Code按钮:单击该按钮将打开编辑窗口,并将光标位置自动跳到当前选定的成员函数的源代码处。
2. Member Variables选项卡
该选项卡主要用于添加与对话框中的控件相关联的成员变量,以便程序能利用这些成员变量与对话框中的控件进行数据交换。该选项卡与Message Maps选项卡一样,也包含Project下拉列表框和Class name下拉列表框,分别用于选定用户操作的当前项目和当前类;Add Class按钮用于向当前项目中添加一个新类;一个文本信息框,用于显示当前选中类的源文件。
此外,Member Variables选项卡中还包含另一个列表框以及另外四个工具按钮。列表框中共有3列数据,分别为:
★ Control IDs:该项显示了当前选定类中能够映射成员变量的控件的ID值。所谓能映射成员变量的控件,就是可以使用类中的成员变量来代表某个控件,当控件发生改变时,该成员变量的值也发生相应变化。
★ Type:该项表示成员变量的类型。
★ Member:该项表示成员变量的名字。
注意:并不是所有的类都有这些信息,只有在选择了对话框类、有格式视图类或记录视图类时才能显示出这些信息。
★ Add Variable按钮:该按钮用于为当前选定的控件添加一个成员变量。
★ Delete Variable按钮:该按钮用于删除一个现有的成员变量。该按钮平时是灰化禁止的,只有当用户在Control IDs列表框中选中某个成员变量以后,才能选择该按钮执行删除工作。
★ Update Columns按钮:该按钮用于选定一个数据源,只在记录集合类中才可以使用。
★ Bind All按钮:只适用于记录集合类,单击此按钮将把所有未绑定的记录集里的数据成员绑定到数据源的一个表中相应的列上。在默认情况下,MFC AppWizard和ClassWizard将绑定所有的列,所以很少需要使用数据绑定。如果通过删除相关的数据成员将一些或所有列取消绑定,那么在这之后还可以重新绑定它们。
3. Automation选项卡
该选项卡允许用户加入方法或属性以增强Automation功能。
4. ActiveX Events选项卡
该选项卡允许用户加入事件以支持ActiveX控件。
5. Class Info选项卡
该选项卡用于显示和设置当前选定类中的一些重要信息。

三 使用ClassWizard创建新类
使用ClassWizard最重要的作用就是创建新类,用户将不必手工添加创建类所需的大量代码,只需指定一些关于新类的重要信息,ClassWizard将自动为你生成这些代码。
下面以应用程序FirstApp为例说明创建过程。步骤如下:
(1) 首先打开FirstApp的项目工作区。
(2) 点击菜单项View|ClassWizard,进入ClassWizard对话框。
(3) 在Message Maps选项卡中选择功能按钮Add Class,并从其下拉选项栏中单击New选项,将会打开New Class对话框。
(4) 首先在Name栏中键入新类的名称,如FirstButton。此时我们将看到在下面的File name栏中显示出ClassWizard自动为新类定义的默认文件名:FirstButton.cpp。如果你不想要这个名字,也可以单击Change按钮对文件名进行修改。
(5) 接下来应当设定新类的基类,即该类是由什么类派生而来的。在Base class下拉列表框中选中所需的基类名,如CButton。
(6) 如果你创建的基类需要对话框或其它资源,则应当在Dialog ID框中选择一个资源ID值。
(7) Automation组框用于设置类的自动化信息,这只适用于能够自动化的类,即由CCmdTarget所派生的类,我们保持其默认选择None。
(8) 最后单击OK按钮结束。
至此我们已经成功地向项目中添加了一个新类FirstButton。
回到Visual C++的主窗口中,我们将发现在FirstApp的项目工作区中发生了一些变化。打开ClassView选项卡,将看到一个新类FirstButton已经被添加到该项目的类列表中了。同时在FirstView选项卡中将发现FirstApp项目中新增加了两个文件:FirstButton.h,FirstButton.cpp。

四 使用ClassWizard添加消息处理函数
使用ClassWizard来为类添加消息处理函数,用户将不需要手工编写消息映射所需的各种消息宏,这样大大减轻了工作量。
本节将以FirstApp应用程序为例来添加消息处理函数,处理用户在视图中的单击鼠标操作。步骤如下:
(1) 首先打开FirstApp的项目工作区。
(2) 点击菜单项View|ClassWizard,进入ClassWizard对话框。
(3) 选择Message Maps选项卡,在Project下拉列表框中选择项目名FirstApp,在Class name下拉列表框中选择类名CFirstAppView。
(4) 在Object IDs列表框中选择对象ID为CFirstAppView。
(5) 在Message列表框中选择需要处理的消息为WM_LBUTTONDOWN,即按下鼠标左键消息。
(6) 此时会发现Add Function按钮已经可用。单击此按钮,ClassWizard将选中消息的处理函数添加到Member Functions列表框中。在本例中,对应WM_LBUTTONDOWN消息的处理函数是OnLButtonDown()。
(7) 最后单击OK按钮结束。
注意:当用户为一些标准的Windows消息添加消息处理函数时,ClassWizard一般会自动地为你创建一个默认的消息处理函数名。而当用户为非标准消息添加处理函数时,ClassWizard将弹出一个对话框,并给出一个缺省的函数名,用户可以重新命名该消息响应函数。
在Visual C++的主窗口中打开项目工作区的ClassView选项卡,并打开CFirstAppView类的成员列表,就会发现消息处理函数OnLButtonDown()已经被添加进去了。
同时,通过查看文件,将会看到在CFirstAppView类的头文件FirstAppView.h中新加了消息处理函数OnLButtonDown()的声明。
可以看到该函数体是空的,其中只调用了一个其父类的成员函数,并且ClassView为用户生成了一些重要的注释行,以提示用户在何处添加自己的代码。
五 使用ClassWizard添加成员变量
成员变量也是类中不可或缺的组成部分,用于保存类的信息,我们将利用ClassView来为类添加成员变量。具体步骤如下:
(1) 首先打开FirstApp的项目工作区。
(2) 点击菜单项View|ClassWizard,进入ClassWizard对话框。
(3) 在ClassWizard对话框中选择Member Variables选项卡,在Project下拉列表框中选择当前项目名FirstApp,在Class name下拉列表框中选择当前类名CAboutDlg。此时在Controls IDs列表框中将显示该类中包含的控件ID:“IDOK”,这个ID值对应于About对话框中的OK按钮。
(4) 单击Add Variables按钮,将打开Add Member Variables对话框。有3个控件用来设置新成员变量的一些重要信息。
◆ Member variables name文本框:该文本框用来输入新成员变量的名字,在默认情况下,ClassWizard提供“m_”这个前缀以便将这个变量确认为成员变量。
◆ Category下拉列表框:该下拉列表框用于指定新变量是一个“Value”类型的成员变量还是一个“Control”类型的成员变量。对于标准的Windows控件来说,选择Value可以创建一个包含由用户来输入控件文本和控件状态的成员变量。而当用户选中Control选项时,就可以创建一个“Control”类型的变量,我们可以对这个控件直接进行访问。
◆ Variable type下拉列表框:该下拉列表框用于选择变量的数据类型。
(5) 在Member variables name栏中输入变量名m_ok;在Category栏中选择该变量的类型:copntrol类型;在Variable type栏中选择该变量的数据类型CButton。
(6) 单击OK按钮退出,这时我们可以看到,ClassWizard对话框中发生了改变。
打开FirstApp程序的项目工作区,可以看到,在CAboutDlg类的数据成员中,新增加了一个成员变量:m_ok。在CAboutDlg类的成员函数DoDataExchange()中,也添加了一条语句来映射控件ID值IDOK和成员变量m_ok:
DDX_Control(pDX, IDOK, m_ok);
六 使用ClassWizard覆盖虚拟函数
我们还可以使用ClassWizard来覆盖基类中定义的虚拟函数,方法如下:
(1) 打开ClassWizard对话框的Message Maps选项卡。
(2) 在Class name下拉列表框中选择一个类名来作为当前类。如CFirstAppView。
(3) 在Object Ids列表框中再次选择该类名,如CFirstAppView。此时在Message列表框中将列出所有可以覆盖的虚拟函数名和所有可操作的Windows消息。
(4) 在Message列表框中选择所要覆盖的虚拟函数,如OnPaint()。
(5) 单击Add Function按钮覆盖基类的该虚拟函数。此时在Member functions列表框中将显示虚拟函数名OnPaint()。注意在此函数前有一个“V”字母,表示该函数是一个虚拟函数。
(6) 单击OK按钮结束。
我们在头文件FirstAppView.h中可看到该虚拟函数的定义:
virtual void OnPaint(CDC * pDC, CPrintInfo * pInfo);
同时在实现函数FirstAppView.cpp中可看到该虚拟函数的函数体:
void CFirstAppView::OnPaint(CDC * pDC, CPrintInfo * pInfo)
{
//在此处加上专门代码或调用基类
CView::OnPaint(pDC, pInfo);
}

posted @ 2008-08-06 15:44 郑江涛 阅读(103) | 评论 (2)编辑

2008年8月5日 #

创建型模式

1
、FACTORY 追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory

工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

2
、BUILDER —MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。(这一定比美军在伊拉克用的翻译机好卖)

建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

3
、FACTORY METHOD请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。

工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

4
、PROTOTYPE跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)

原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

5
、SINGLETON俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)

单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。

结构型模式

6
、ADAPTER在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我)

适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。

7
、BRIDGE 早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了

桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

8
、COMPOSITE —Mary今天过生日。“我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己挑。”“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。”“喂,买了三件了呀,我只答应送一件礼物的哦。”“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。”“……”,MM都会用Composite模式了,你会了没有?

合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。

9
、DECORATOR —Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?

装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。

10
、FAÇADE我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。

门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

11
、FLYWEIGHT每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。

享元模式:FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。

12
、PROXY 跟MM在网上聊天,一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?”这些话,真烦人,写个程序做为我的Proxy吧,凡是接收到这些话都设置好了自动的回答,接收到其他的话时再通知我回答,怎么样,酷吧。

代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

行为模式

13
、CHAIN OF RESPONSIBLEITY晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑!

责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。

14
、COMMAND俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,才请我吃面。”,

命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

15
、INTERPRETER俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟MM约会时,只要做一个Interpreter,照着上面的脚本执行就可以了。

解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。

16
、ITERATOR我爱上了Mary,不顾一切的向她求婚。
   Mary
:“想要我跟你结婚,得答应我的条件”
  
我:“什么条件我都答应,你说吧”
   Mary
:“我看上了那个一克拉的钻石”
  
我:“我买,我买,还有吗?”
   Mary
:“我看上了湖边的那栋别墅”
  
我:“我买,我买,还有吗?”
   Mary
:“你的小弟弟必须要有50cm长”
  
我脑袋嗡的一声,坐在椅子上,一咬牙:“我剪,我剪,还有吗?”
   ……

迭代子模式:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。

17
、MEDIATOR 四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给我,一切就OK啦,俺得到了四个MM的电话。

调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

18
、MEMENTO同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。

备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

19
、OBSERVER —想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦

观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

20
、STATE跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。

21
、STRATEGY跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。

策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

22
、TEMPLATE METHOD ——看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(Template method),但每个步骤针对不同的情况,都有不一样的做法,这就要看你随机应变啦(具体实现);

模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

23
、VISITOR情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻松多了;

访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

posted @ 2008-08-05 13:54 郑江涛 阅读(20) | 评论 (0)编辑

1. 完善了新建项目功能,支持简单3层和工厂模式项目的生成。
2. 完善了代码自动批量生成。
3. 增加了代码插件机制,支持可扩展的代码生成插件,用户可以自己定制代码生成的插件,按用户需求进行代码生成。详见插件接口开发帮助和源码。
4. 支持父子表(事务)的代码生成。
5. 新增直接生成Web项目的Aspx页面及cs文件 
6. 支持视图的代码生成。
7. 完善了DB脚本和存储过程生成的一些问题。
8. 支持Word2007的数据库文档的生成。
9. 支持多主键和条件字段的情况。
10. 修正了一些bug。

功能截图预览

下载地址1:http://files.cnblogs.com/ltp/Codematic2.rar
下载地址2:http://www.maticsoft.com/softdown.aspx

posted @ 2008-08-05 13:52 郑江涛 阅读(30) | 评论 (0)编辑



1.要重视建立销售手册
2.凡是先做试点,风险才低。
3.找到自己的细分市场。
4.不要总想着同竞争对手对立,而是要想办法让自己弥补竞争对手的不足。
5. 如果没有价格上的优势与技术上的绝对优势,千万不要进入红海市场,否则你会必输无疑!
6.抓住关键环节,重点抓好市场调研。
7.与其改变消费者固有的想法,不如在消费者已熟悉的想法上去引导消费者。
8.要改变消费者固有的想法,比登太阳还难;但不是不可能的。
9.对普通员工,首先考虑其利益,然后才是社会价值。
10.我在我的公司只管一件事——市场调研。
11.公司在小的时候,尽量要股权集中。
12.要花大的精力建立一个连最基层的员工可以看明白及易于操作的手册,尤其是《管理手册》和《营销手册》;
13.要重视建设团队,核心团队一般不超过7人。
14.要脚踏实地的从小做起,团队重于个人作用。
15.要注意广告的法律限制。
16.90%的困难你现在想都没有想到,你都不知道那是困难。
17.首先一定要建立、运营第一家店,并根据其写成一个“傻瓜手册”,做成功一个店之后离你大的成功就不远了,首先就是脚踏实地、集中精力做成功一个。
18.试销市场慢跑,快不得;全国市场快跑,慢不得!
   做全国性市场,一定要先做一个试销市场,要一点点来,快不得;
   做成了,真到做全国市场时,要快半步,慢不得!
19.不要只看塔尖,二三线市场比一线的更大。
20.失败是很重要的财富,我们要好好的利用它。
   作为我们曾经失败过,至少有过失败经历的人,应该经常从里面学点东西。人在成功的时候是学不到东西的,人在顺境的时候,在成功的时候,沉不下心来,总结的东西自然是很虚的东西。只有失败的时候,总结的教训才是深刻的,才是真的。
21.关系不是核心竞争力;关系是最靠不住的东西!
22.广告靠吸引比靠强迫更难。
23.不要为改变而改变,主要看改变的商业模式能提升什么样的价值。
24.创业过程中很重要的在于制度建设。
25.要让公司全部人员知道——管理无情,人有情,公司制度是无价的;
26.在公司只有功劳,没有苦劳。
27.当战略定好后,关键在于执行力,细节决定成败。
28.在下班后,可以将员工当成伙伴,但上班时员工就是员工。
29. 团队核心成员有人要提出辞职时,不要挽留,既然提出了,他迟早是要走的。
30.所谓人才,就是你交给他一件事情,他做成了;你再交给他一件事情,他又做成了。
31.最痛苦的时候,压力最大的时候,脑子里面只有一件事儿的时候,我把全国分公司经理招到荒山脚下北大门那个地方.招待所里面,然后在那个地方闭门开批判会。大家批判我,批判了三天三夜,我觉得那个就很有用。
32.如果脑白金无效,就请告诉身边一百个人
33 创造事件营销让媒体自觉报道
    我先找到差异化,我的产品和其它的产品差异在哪儿?
    营销里面有个叫第一法则。你到哈佛去学的时候,他会说一个案例。对美国人来说,谁第一个飞越大西洋的人?一般都能回答得出来,但是问谁是第二个飞越的,就没人能回答出来了。谁是第三个飞越的?记得了。为什么?第三个是第一个女性飞越,她拥有了个第一。
    你一定要在你的品牌建设里面,把你的第一给挖出来,猛宣传那一点。
    宣传用什么手段呢?我建议别上来上电视。第一、报纸,第二个、创造事件营销,让媒体作为新闻自觉去报道你,这样很省钱。
posted @ 2008-08-05 13:48 郑江涛 阅读(20) | 评论 (0)编辑

2008年7月28日 #

     摘要: 一、打开CD-ROMmciSendString("SetcdAudiodooropenwait",NULL,0,NULL);二、关闭CD_ROMmciSendString("SetcdAudiodoorclosedwait",NULL,0,NULL);三、关闭计算机OSVERSIONINFOOsVersionInfo;//包含操作系统版本信息的数据结构OsVersionInfo.dwOSVersi... 阅读全文
posted @ 2008-07-28 12:01 郑江涛 阅读(62) | 评论 (0)编辑

 Win 95及NT的注册数据库(Registry) 是系统中非常重要的组成部分。在Win32 API中有一组Reg函数来处理这些问题。其一般的读写过程如下:
 
    1、使用RegOpenKeyEx或RegCreateKeyEx函数打开或创建一个键; 
    2、如果上一步成功,使用RegQueryValueEx读取子键的值,使用RegSetValueEx设置子键值,使用RegEnumKey获得所有子键,使用RegDeleteKey删除一个键; 
    3、完成操作后使用RegCloseKey关闭键。 
    下面这段程序打开HKEY_CURRENT_USER\Software\Zeal SoftStudio\AskPro FTP\LastTime键,然后读取WOL子键的值。 

    HKEY hkey; 
    char sz[256]; 
    DWORD dwtype, sl = 256; 
     
    RegOpenKeyEx(HKEY_CURRENT_USER, 
    "Software\\Zeal SoftStudio\\AskPro FTP\\LastTime", 
    NULL, KEY_ALL_ACCESS, &hkey); 
    RegQueryValueEx(hkey, "WOL", NULL, &dwtype, (LPBYTE)sz, &sl); 
    RegCloseKey(hkey); 
    MFC程序可以使用CRegKey类读写注册表。VB中调用API的办法可以参考QA000226 "如何访问Windows系统注册表"。

    打开注册键
    LONG RegOpenKeyEx( HKEY hKey,  // handle to open key 

    LPCTSTR lpSubKey,              // address of name of subkey to open 
    DWORD ulOptions,               // reserved =0
    REGSAM samDesired,             // security access mask 
    PHKEY phkResult                // address of handle to open key 
    );

    例:
    HKEY hd;
    hd=HKEY_LOCAL_MACHINE;
    char* Regkeyname="SoftWare\\Xy123\\Poker\\";
    LONG a=RegOpenKeyEx(hd,Regkeyname,0,KEY_READ, &hd);   //成功返回ERROR_SUCCESS,否则返回错误代码
 

    关闭注册键
    LONG RegCloseKey( HKEY hKey // handle to key to close );
例:
     RegCloseKey(HKEY_LOCAL_MACHINE);
OR:  RegCloseKey(hd); 
建立注册键
LONG RegCreateKeyEx( HKEY hKey, // handle to an open key 
      LPCTSTR lpSubKey, // address of subkey name 
      DWORD Reserved, // reserved =0
      LPTSTR lpClass, // address of class string 
      DWORD dwOptions, // special options flag 
      REGSAM samDesired, // desired security access 

      LPSECURITY_ATTRIBUTES lpSecurityAttributes, // address of key security         structure 
      PHKEY phkResult, // address of buffer for opened handle 
      LPDWORD lpdwDisposition // address of disposition value buffer );
例:
   char *sclass="";  //类名指定为空
   DWORD nbf=0;    //接受返回值,指明是建立新键还是打开已有的键.(经试验总是返回REG_OPENED_EXISTING_KEY.
   LONG II=RegCreateKeyEx(hd,Regkeyname,0,sclass,REG_OPTION_NON_VOLATILE,
                KEY_READ|KEY_WRITE,NULL,&hd,&nbf);

//REG_OPTION_NON_VOLATILE 指明键永久保留.安全结构指明NULL,自动获得一默认值
//成功返回ERROR_SUCCESS,否则返回错误代码 
枚举键值
LONG RegEnumValue( HKEY hKey, // handle to key to query 
      DWORD dwIndex, // index of value to query 
      LPTSTR lpValueName, // address of buffer for value string 
      LPDWORD lpcbValueName, // address for size of value buffer 
      LPDWORD lpReserved, // reserved =NULL
      LPDWORD lpType, // address of buffer for type code 

      LPBYTE lpData, // address of buffer for value data 
      LPDWORD lpcbData // address for size of data buffer);
例:
   DWORD dinx=0;
   char valuename[70];  //分配数值名称缓冲区
   strcpy(valuename,"DeskPattern");  //随便指定哪个键值名
   DWORD nsize=69;  //数值名称缓冲区大小
   DWORD k=REG_SZ;  //指明数据类型
   unsigned char vari[70]; //分配数值缓冲区
   DWORD ncbvari=69; //数值缓冲区大小
   dinx=0; //从0开始

   while((II=RegEnumValue(hd,dinx,valuename,&nsize,NULL,&k,vari,&ncbvari)) 
          != ERROR_NO_MORE_ITEMS)
   {
       dinx++;//索引 +1,准备取下一个值
       nsize=69; //恢复原来大小
       ncbvari=69;
   }
成功后返回值0,各变量返回后设置如下:
valuename=数值名称,以0结尾;如 : DeskColor
nsize=数值名称长度, 9
k=REG_SZ  DeskColor 的类型为 REG_SZ
vari=键值,32768 DeskColor="32768",
ncbvari=键值长度 REG_SZ包括结尾0,=6, 
读取键值
LONG RegQueryValueEx( HKEY hKey, // handle to key to query 

       LPTSTR lpValueName, // address of name of value to query 
       LPDWORD lpReserved, // reserved 
       LPDWORD lpType, // address of buffer for value type 
       LPBYTE lpData, // address of data buffer 
       LPDWORD lpcbData // address of data buffer size );
例:
   RegQueryValueEx(hd,valuename,NULL,&k,vari,&ncbvari);
变量定义及成功后各变量设置值同RegEnumValueEx 
写键值
LONG RegSetValueEx( HKEY hKey, // handle to key to set value for 
       LPCTSTR lpValueName, // name of the value to set 

       DWORD Reserved, // reserved 
       DWORD dwType, // flag for value type 
       CONST BYTE *lpData, // address of value data 
       DWORD cbData // size of value data );
例:
   strcpy(valuename,"Hello");
   unsigned char vari[10];
   DWORD k=REG_SZ;
   strcpy((char*)vari,"1234567")
   RegSetValueEx(hd,valuename,0,k,vari,7);
成功后在Poker下增加一个键值 Hello : REG_SZ : 1234567
写整型变量:
int hi=8;
RegSetValueEx(pj,valuename,0,REG_BINARY,(unsigned char*)&hi,sizeof(int));

成功后在Poker下增加一个键值 Hello2 : REG_BINARY :08 00 00 00



void AddEventSource()
{
    HKEY hk; 
    DWORD dwData; 
    UCHAR szBuf[80]; 

    // Add your source name as a subkey under the Application 
    // key in the EventLog registry key. 

    if (RegCreateKey(HKEY_LOCAL_MACHINE, 
            "SYSTEM\\CurrentControlSet\\Services\ 
            \\EventLog\\Application\\SamplApp", &hk)) 
        ErrorExit("Could not create the registry key."); 

    // Set the name of the message file. 

    strcpy(szBuf, "%SystemRoot%\\System\\SamplApp.dll"); 

    // Add the name to the EventMessageFile subkey. 

    if (RegSetValueEx(hk,             // subkey handle 
            "EventMessageFile",       // value name 
            0,                        // must be zero 
            REG_EXPAND_SZ,            // value type 
            (LPBYTE) szBuf,           // pointer to value data 
            strlen(szBuf) + 1))       // length of value data 

        ErrorExit("Could not set the event message file."); 

    // Set the supported event types in the TypesSupported subkey. 

    dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | 
        EVENTLOG_INFORMATION_TYPE; 

    if (RegSetValueEx(hk,      // subkey handle 
            "TypesSupported",  // value name 
            0,                 // must be zero 
            REG_DWORD,         // value type 
            (LPBYTE) &dwData,  // pointer to value data 

            sizeof(DWORD)))    // length of value data 
        ErrorExit("Could not set the supported types."); 

    RegCloseKey(hk); 




以下代码把注册表自启动shell的键值改写为C:\DK1\ATM\HARP\ExAtmShell.exe:

         HKEY hkey;
LONG res; 
DWORD datatype=REG_SZ; 
unsigned char szvalue[_MAX_PATH];
strcpy((char*)szvalue,"C:\\DK1\\ATM\\HARP\\ExAtmShell.exe");

res =::RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\", 0, 
KEY_WRITE|KEY_READ, &hkey); 

if(res!=ERROR_SUCCESS)
{
AfxMessageBox("aaa");
return;
}
res = ::RegSetValueEx(hkey, "Shell", 0, datatype, szvalue, strlen(LPCSTR(szvalue))); 

RegCloseKey(hkey);
if(res==ERROR_SUCCESS)
::AfxMessageBox("你已经成功地将注册表自启动shell的键值设置为C:\\DK1\\ATM\\HARP\\ExAtmShell.exe");
else
::AfxMessageBox("设定失败:目标位置不存在这样的键!");
posted @ 2008-07-28 12:00 郑江涛 阅读(49) | 评论 (0)编辑

     摘要: <PRE>voidRecursiveDelete(CStringszPath){CFileFindff;CStringpath=szPath;if(path.Right(1)!="\\")path+="\\";path+="*.*";BOOLres=ff.FindFile(path);while(res){res=ff.FindNextFile();if(!ff.IsDots()&am... 阅读全文
posted @ 2008-07-28 11:59 郑江涛 阅读(96) | 评论 (0)编辑