posts - 34,comments - 2,trackbacks - 0
    拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来。虽然都是复制对象,但是不同的复制方法,复制出来的新对象却并非完全一模一样,对象内部存在着一些差异。通常的拷贝方法有两种,即深拷贝和浅拷贝,那二者之间有何区别呢?
我的理解是:

1、深拷贝和浅拷贝之间的区别在于是否复制了子对象。
2、如果一个类拥有资源(堆,或者是其它系统资源),,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之对象存在资源,但复制过程并未复制资源的情况视为浅拷贝。

当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
①、一个对象以值传递的方式传入函数体:这个好理解,因为传递给函数体的参数不是  str 而是 _str  ,是str的复制品。所以必然会调用拷贝构造函数。 
②、一个对象以值传递的方式从函数返回 :相当于构造一个新的对象。
③、一个对象需要通过另外一个对象进行初始化。:同上、

正如您理解那样 “浅拷贝:只拷贝对象的基本属性,其他的引用不拷贝,还是保留引用”如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。当对象没有指针时,按照上面的规则,则一切正常,浅拷贝把数据复制过新对象。但当对象有指针时,因为浅拷贝引用不拷贝,所以新对象与旧对象他们指向的是同一个内存区,这时当释放内存时就出现释放两次,出错了。

这时需要深拷贝..................
所以通常我们需要自己写拷贝构造函数,以免出现错误。
//////////////参考资料所得,正确与否欢迎讨论、

 

posted @ 2011-09-27 01:24 Yu_ 阅读(365) | 评论 (0)编辑 收藏

1、         组件:组件是将应用程序分割成多个独立部分,维护时用新组件替代旧组件。而传统的应用程序是将程序分割成文件、模块和类,将他们编译并链接成一大块。

组件特点:

   、可修改,可替换,满足用户的需求

   、有组件库可以快速组装,AcitveX控件

   、分布式:事务逻辑和系统服务相分离,简化了系统开发的复杂性,

   、组件需要动态连接,,不可能在运行时编译。

   、要封装,不要改变其接口、

   、以二进制的形式发布,已编译好的。

2、         接口:提供两个不同对象间的一种连接,计算机是通过一组函数连接起来的,其实这组函数实质上就是定义了程序中不同部分的接口。对于COM接口是包含一个函数指针数组的内存结构。

用纯虚函数作为接口。看下面经典例子:

#define InSruct struct

InSruct          IA           //定义接口

{

       virtual void Fun1()=0;

};

 

class CA:public IA     //定义组件(注意类可以继承结构体,结构体也能继承结构体)

{

       void Fun1()

       {

              cout<<"class Fun1()";

       }

};

Void main()                    

{

       CA *pCa=new CA;

       IA *pIa=pCa;

       pIa->Fun1();   //表示接口:在程序内部实现。

       delete pCa;

}

 

//特别注意的是:类不是组件,组件不一定要类实现,也不不一定需要继承、

 

  

 

 

 

 

 

3、         组件的内存(探讨COM接口为什么可以用纯抽象基类实现COM组件)

抽象基类提供vtbl指针指向虚拟函数、每个对象共享同一个vtbl指针,但数据各自不同

//////////////////////////////////////////////////////////////////////////////////////////////

4、         客户通过不断询问清晰组件干什么,但没有完成知道组件内部怎么样。

客户如何向组件询问关于它所支持的接口?组件如何回答、以及这种请求应答方式的结果、

 

 

 

   HRESULT QueryInterface( REFIID iid, void** ppvObject);函数查询某个组件是否支持某个特定的接口

//iid 是要查询的接口ID, ppvObject是返回的接口的指针,

   关于类型转换:

static_cast

 用法:static_cast < type-id > ( expression )

  该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:

  用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。

  进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;

  进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

  用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。

  把空指针转换成目标类型的空指针。

  把任何类型的表达式转换成void类型。

  注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。

posted @ 2011-09-21 19:54 Yu_ 阅读(1045) | 评论 (0)编辑 收藏

通常我们做的程序不应该只局限于程序间的操作。也许能对电脑上其他的程序操作会更有意思。我们能做到,也很容易做到、使用

FindWindow。

HWND FindWindow( LPCTSTR lpClassName, // pointer to class name LPCTSTR lpWindowName // pointer to window name );

推荐使用HWND FindWindowEx(

HWND hwndParent,// handle to parent window

HWND hwndChildAfter, // handle to a child window

LPCTSTR lpszClass, // pointer to class name

LPCTSTR lpszWindow // pointer to window name );  功能更加强大。

FindWindowEx 能根据多种条件查找。

1、hwndParent   父窗口

2、hwndChildAfter  兄弟窗口

3、lpszClass   特定字符串

4、lpszWindow  或者窗口的标题。

当你仅知道要通信窗口的某一情况时,便可以查找到。

推荐使用小工具


能快速查找出你电脑的应用程序的类名与标题、

posted @ 2011-04-11 10:53 Yu_ 阅读(335) | 评论 (0)编辑 收藏

基于MSDN的ListBoxD 处理消息

(1)、LB_FINDSTRING 消息(一般查找)
wParam    在第一个条目被查找到之前的条目索引(也就是开始查找的索引位置)。当搜索达到列表框的底部时,搜索将重新回到由该参数指定的位置从头查找。如果该参数为-1,将从列表框的起始索引(0)开始查找。

lParam     一个指向以NULL结尾的字符串,该字符串包含了将要搜索的内容。搜索是大小写敏感的。所以可以搜索任何大小写组合的字符串形式。

Return Value      如果成功,返回第一个匹配的条目的索引,如果失败,返回LB_ERR。
备注::如果你以自绘形式创建的列表框,该消息会返回一个匹配由lParam参数提供的值长整型的值。

(2)、LB_FINDSTRINGEXACT 消息(精确查找)
wParam      基于零的开始索引。当搜索达到列表框的底部时,将返回到开始索引处继续进行搜索。如果该参数为-1,将从列表框的开始处从头执行搜索。 
lParam       指向被搜索字串的字符串指针。该字符串可以包含完整的文件名及扩展。搜索是不分大小写的。

Return Value     返回值是基于零的匹配条目的索引。当失败时,返回LB_ERR。
Remarks         该函数仅在指定字符串和列表框中的条目的长度相等且每个字符均相等的情况才算匹配。如果一个应用程序以自绘样式创建列表框,则由该消息执行的内容将取决于LBS_SORT是否被使用。


(3)、LB_GETANCHORINDEX 消息       //获得条目锚点的索引,锚点就是多选状态下选择的起始条目。


(4)、LB_GETCARETINDEX 消息                 //返回在多选状态下,具有焦点的条目的索引。该条目既可以被选中,也可以是没被选中。


(5)、LB_GETCURSEL 消息                  //获得当前被选条目的索引。仅在单选状态的列表框有效。
Return Value  在单选状态的列表框中,返回值是基于零的当前选中条目的索引,如果未发现选中的条目,返回值是LB_ERR。

Remarks    不要给多选状态的列表框发送该消息。为了获得处于多选状态的列表框的选中条目的索引,可以使用LB_GETSELITEMS消息。如果要获得多选状态下的列表框中哪一个条目具有焦点,可以使用LB_GETSEL消息。如果将该消息发送给一个具有多选状态的列表框,该消息返回具有焦点的条目索引。如果没有条目被选中,返回 0.


(6)、LB_GETHORIZONTALEXTENT 消息          //如果列表框具有一个水平滚动条,该消息获得水平滚动的宽度(单位像素)

Return Value           返回值是滚动宽度(单位是像素)

Remarks                 为了响应该消息列表框必须已经定义了WS_HSCROLL样式。如果应用程序并未给列表框定义水平扩展(使用LB_SETHORIZONTALEXTENT),默认的水平扩展时0.注意:列表框并不会自动更新水平扩展。

(7)、LB_GETITEMDATA 消息                   //获得与指定的列表框中条目相关的程序自定义值。


(8)、LB_GETITEMHEIGHT            //应用程序发送该消息用以返回一个Listbox中条目的高度
wParam         指定基于0的listbox 中的条目。该索引仅在列表框使用 LBS_OWNERDRAWVARIABLE风格时使用。否则,该值必须为0.

(9)、LB_GETITEMRECT            //获得列表框中条目的边界矩形尺寸
wParam 条目的索引值。 
lParam  指向一个RECT结构的指针,该结构用于接收列表框中条目的客户坐标值

(10)、LB_GETLOCALE            //获得当前列表框的区域。可以使用这个区域来决定显示文本正确的排序规则。

(11)、LB_GETSEL Message           //获得一个条目的选择状态。如果一个条目被选中,返回Yu值大于0,否则,返回值是0.如果发生错误,返回LB_ERR.

(12)、LB_GETSELCOUNT Message           //在具有多选状态的列表框中,该消息获得选中的条目的数量 。返回值是列表框中选中的条目的数量。如果列表框处于单选状态,返回值是LB_ERR。

(13)、LB_GETSELITEMS Message      //在具有多选状态的列表框中,该消息通过填充一个缓冲来保存被选中的条目。
wParam          选中条目数量的最大值。 
lParam         足够大的缓冲用于存储整型值。
Return Value               返回值是放置在缓冲中的条目的数量。如果列表框处于单选状态,返回值是LB_ERR.

(14)、LB_GETTEXT                  //从列表框中获得一个字符串。
wParam        所要返回的字符串。 
lParam        接收字符串的缓冲器。它的类型是LPTSTR,之后将强化转换为LPARAM。缓冲器必须具有足够的空间开存储字符串(包括结尾的NULL)。一个LB_GETTEXTLEN消息可以在应用该消息之前用来获得字符串长度(单位是TCHARS)。
Return Value        返回值是字符串长度(TCHARS)。不包括结尾的NULL字符。如果wParam未指定一个有效的索引,返回值LB_ERR
Remarks               如果以自绘样式创建一个列表框,缓冲器指针将接受与条目(条目数据)相关的值。

(15)、LB_GETTEXTLEN                     //获得一个列表框中字符串的长度
wParam           字符串的索引。 
lParam             未使用,必须为0
Return Value       返回值是字符串的长度,不包括结尾的NULL字符。在特定的情况下,该值事实上可能比文本的真实长度要大。如果wParam参数指向一个无效的索引,返回值是LB_ERR。
Remarks             在特定条件下,返回值将比真实的长度要大。这种情况发生在ANSI和Unicode混合时。
如果要获得精确的长度,可以使用WM_GETTEXT,LB_GETTEXT 或 CB_GETLBTEXT消息,或 GetWindowText 函数。

(16)、LB_GETTOPINDEX Message                //获得第一个“可见”的条目的索引。初始化时,第一个可见的条目是索引为0的条目,但如果列表框的发生滚动之后,该索引值会发生变化。
返回值是第一个可见的条目的索引。

(17)、LB_INITSTORAGE Message             //定位内存用于存储列表框中的条目。该消息在向列表框中加入大量条目时使用。
wParam    加入的条目数量。
lParam       内存的量用于存储条目字符串。(以字节)。
Return Value如果消息成功,返回值是所有的条目数量。如果消息失败,返回值是LB_ERRSPACE。
Remarks          该消息能够帮助加速条目数大于100的列表框初始化进程。它会预留一定量的内存空间,这样,接下来LB_ADDSTRING,LB_INSERTSTRING,LB_DIR 和 LB_ADDFILE消息会使用更少的时间。

(18)、LB_INSERTSTRING Message           //向列表框中插入一个条目数据或字符串。不像LB_ADDSTRING 消息,该消息不会激活LBS_SORT样式来对条目进行排序。
wParam          插入字符串的位置。如果参数为-1,字符串将插入到列表框的尾部。 
lParam          所要插入的字符串指针。如果以自绘的形式创建列表框,该参数的值会作为条目数据本身而不是字符串指针来存储。可以使用LB_GETITEMDATA 和LB_SETITEDATA 消息来接收或修改条目数据。
Return Value          返回值是插入处的索引。如果发生错误,返回值是LB_ERR。如果没有足够空间来存储新的字符串,返回值LB_ERRSPACE。

(19)、LB_ITEMFROMPOINT                   //一个应用程序发送这个消息用以返回基于0的位于ListBox内的离指定的点位置最近一个条目
返回值中低位存储的是最近条目,高位存储的值取决于给定点的位置,如果该点位于客户区内,则为0,否则为1

(20)、LB_SELITEMRANGE            //在多选状态下的列表框中选择或取消选择一个或多个连续条目。
wParam  TRUE 代表选择条目,FALSE为取消选择。 
lParam    低位字指定第一个选择的条目索引。高位字指定最后一个选择的条目索引。
Return Value如果发生错误,返回LB_ERR。
Remarks仅在具有多选状态的列表框中使用该消息。该消息仅能用于前65536个条目。

(21)、LB_SELITEMRANGEEX        //在多选状态下的列表框中选择一个或多个连续的条目。
wParam 指定选中条目中第一个条目的索引。 
lParam   指定选中条目中最后一个条目的索引

(22)、LB_SETANCHORINDEX          //  设置锚点条目——从该条目开始,一个多重选择开始。一个多重选择会跨越锚点条目和结尾条目间所有的条目
wParam   新锚点条目的索引。 
lParam 该参数未使用。
Return Value          如果消息成功,返回值是0,如果消息失败,返回值是LB_ERR。

(23)、LB_SETCARETINDEX            //在位于多选状态下的列表框中指定索引下设置焦点矩形。如果条目不可见,会自动滚动可见。

(24)、LB_SETCOLUMNWIDTH Message       //对多列的列表框设置所有列的宽度(单位是像素)
wParam 所有列的宽度(像素) 
lParam 未使用,可以为0
Return Value     无返回值
 

(25)、LB_SETCOUNT Message               //设置由LBS_NODATA样式而不是LBS_HASSTRINGS样式创建的列表框的条目数量。
wParam       指定列表框中的条目数量。
lParam        未使用。
Return Value如果发生错误,返回值是LB_ERR。如果没有足够的内存空间,返回LB_ERRSPACE。

(26)、LB_SETCURSEL Message               //选择一个字符串,并将其所在的条目滚动到视野内。当新的字符串被选定,列表框的高亮显示将从原有的选中字符串移动到这个新的字符串上。

wParam          指定字符串索引。如果该参数为-1,列表框不具有任何选中条目。 
lParam             未使用,可以为0.
Return Value         如果发生错误,返回LB_ERR。如果wParam为-1,则无论什么情况均返回LB_ERR
Remarks            该消息仅适用于单选状体下的列表框。

(27)、LB_SETHORIZONTALEXTENT          //  该消息用来设置列表框的宽度(单位是像素)。如果列表框的宽度小于设置的值,显示水平滚动条。如果列表框的宽度等于设置的值,则不显示滚动条。
LB_SETHORIZONTALEXTENT  wParam = (WPARAM) cxExtent;
 // 水平滚动宽度  lParam = 0;                 
// 未使用,必须为0

(28)、LB_SETITEMHEIGHT             //应用程序通过发送该消息来设置ListBox中条目的高度(单位是像素)。

wParam = (WPARAM) index;        // 条目索引lParam = MAKELPARAM(cyItem, 0);

lParam // 条目高度

(29)、LB_SETLOCALE 
设置列表框的当前区域。可以使用区域来决定显示文本的正确排序规则。
wParam          指定区域标识。该表示用于列表框添加文本时排序之用。 
lParam             该参数未被使用。 
Return Value           返回值是之前的区域标识符。如果wParam参数指定一个未在系统中安装的区域,返回值是LB_ERR,且当前的列表框区域不会发生改变。

可以使用MAKELCID宏来构建一个区域标识符


(30)、LB_SETSEL              //在多选状态下的列表框中选择一个字符串。

wParam         指定如何设置选择。如果该参数为TRUE ,字符串被选中且高亮,如果为FALSE,移除高亮且字符串不再处于被选中状态。 
lParam        指定字符串的索引。如果该参数为-1,选择的添加或删除取决于wParam的值。
Return Value       如果有错误,返回LB_ERR。
Remarks仅在多选状态的列表框使用该消息才有效。

(31)、LB_SETTABSTOPS               //设置列表框的移字键。
wParam  移字键编号。
lParam 编号数组的第一个编号。

(32)、LB_SETTOPINDEX                     //确保给定条目在列表框中式可见的
wParam  条目索引 
lParam 未被使用。 
Return Value     如果发生错误,则返回LB_ERR.
Remarks        系统会滚动列表框以使指定的条目出现在列表框的顶部或达到最大滚动范围

(33)、LB_SETITEMDATA Message            // 设置与列表框中指定条目相关的值。
wParam    指定条目的索引。如果该值为-1,lParam值应用于所有的列表框中的条目
lParam     指定与条目相关的值。
Return Value           发生错误,返回LB_ERR.
Remarks              如果条目位于一个以自绘样式创建的列表框中,该消息将替换LB_ADDSTRING 或 LB_INSERTSTRING 消息中lParam参数的值。

//////////////////////////////////////////

posted @ 2011-04-11 10:29 Yu_ 阅读(829) | 评论 (0)编辑 收藏
仅列出标题
共4页: 1 2 3 4