2009年2月17日星期二

vc2005中属性和属性页控件值同步的问题

属性和属性页控件值同步的问题
-----------------------------------------

我刚开始学习ActiveX开发,使用MFC。我对ActiveX控件新增一个名为"Caption",类型为int的属性.我在ActiveX的属性页上新增一个Edit control,想通过该Edit control来直接设置"Caption"属性的值.
现在问题来了:
在VC6.0中开发时可以通过class wizard的"增加成员变量"来直接将该Edit control与"Caption"属性关联.生成的代码在DoDataExchange方法中如下:

void CCircPropPage::DoDataExchange(CDataExchange* pDX)
{
//{{AFX_DATA_MAP(CCircPropPage)
DDP_Text(pDX, IDC_CAPTION, m_caption, _T("Caption") );//(1)
DDX_Text(pDX, IDC_CAPTION, m_caption);
//}}AFX_DATA_MAP
DDP_PostProcessing(pDX);
}

其中(1)行的最一个参数:_T("Caption") ,就是该Edit control所关联的属性名.

但在VC++ 2005中,却没有直接将Edit control与属性相关联的功能.在VC++ 2005中在Edit control上右击,选择"添加变量",打开"添加成员变量向导",但该向导只能添加与Edit control关联的"成员变量",无法将该Edit control 与"Caption"属性关联.VC++ 2005生成的代码如下:

void CCircPropPage::DoDataExchange(CDataExchange* pDX)
{
//{{AFX_DATA_MAP(CCircPropPage)
//DDP_Text(pDX, IDC_CAPTION, m_caption, _T("Caption") );//(1)//这是VC6生成的代码,这里留作参照
//DDX_Text(pDX, IDC_CAPTION, m_caption);//这也是VC6生成的
//}}AFX_DATA_MAP
DDP_PostProcessing(pDX); //(2)
DDX_Text(pDX, IDC_CAPTION1, m_caption1);//<--(3) VC++产生的代码.
}

其中第(3)行为VC++ 2005产生的代码.它并没有调用DDP_系列的函数,也将代码放在了AFX_DATA_MAP宏的外面、第(2)行的下面(第2行函数的功能为:结束属性值与Control的转换),也就是说VC++ 2005并没有将Edit control与属性关联的功能!??
虽然可以通过手动添加方式解决,但我总觉得VC++ 2005应该提供如此功能,不知道有没有朋友遇到过与我相同的问题,如何解决之?

难道,正如别人所说,VC2005比VC6是一个退步。


--------------------------------------------
VC2005开发ActiveX控件把属性页和属性关联

在属性页里面添加好需要的控件.比如说一个文本框,让它和控件的一个属性向关联.这件事情在VC6.0时代应该是轻而易举的,可是VC2005好像是为了支持WindowsCE等不支持属性页的移动设备把这一个省事的 ClassWizard给取消了.不过关联这件事情其实并不困难.以下给出几个约略的步骤,如果你开发过AcitveX那么会十分清楚的,如果没有那么就是我再怎么说也不清楚.
首先给你的文本框关联一个变量;
然后在生成的DataExchange函数中添加一句

DDP_Text(pDX, IDC_EDIT4, AccSel,_T("Accurate"));

第二项十文本框的标识符,AccSel是你关联的那个变量名字,"Accurata"是属性的名字.
最后这个很关键,就是把

DDP_PostProcessing(pDX);

这句从函数开头移到函数末尾,这样就可以了.关联工作到此结束.

没有评论:

发表评论