然后在资源视图的属性对话框里面加了一个编辑框,为这个编辑框关联一个成员变量,怎么把这个变量和我自定义这个属性关联起来,
在vc6.0里面直接有这个选 项,Optional property name:
在vs2008里面应该怎么办?
我初学mfc,问题描述的不是很清楚,如果有哪位前辈愿意有时间的话,可以给我留言。
可能问题描述的不是很清楚,
比如说一个时钟控件,现在我给他加了一个自定义的属性interval(用来调整时间变化的间隔),
[id(1) , helpstring("property interval")] SHORT interval;
然后m_interval是这个属性的成员变量,用来保存数据
还有一个处理函数OnintervalChanged(void),定义如下:
void Cv18e1_ClockCtrl::OnintervalChanged(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your property handler code here
if(m_interval < 0 || m_interval > 6000)
{
m_interval = 1000;
}
else
{
m_interval = m_interval / 1000 * 1000;
KillTimer(1);
SetTimer(1, m_interval, NULL);
}
SetModifiedFlag();
}
控件里的OnDraw()函数里面加入了这些内容:
void Cv18e1_ClockCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
if (!pdc)
return;
// TODO: Replace the following code with your own drawing code.
//pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
//pdc->Ellipse(rcBounds);
CBrush brush(TranslateColor(GetBackColor()));//GetBackColor()是COleControl的成员函数,返回值类型是OLE_COLOR, 可调用TranslateColor()将之转换为COLORREF类型, 请参阅msdn
pdc->FillRect(rcBounds, &brush);//设置控件的背景色
pdc->SetTextColor(TranslateColor(GetForeColor()));//设置文本的颜色
pdc->SetBkMode(TRANSPARENT);//设置文本的背景为透明
CTime time = CTime::GetCurrentTime();
CString str = time.Format(_T("%H:%M:%S"));
pdc->TextOut(0, 0, str);
}
另外还有两个函数Oncreate()和OnTimer()函数分别用来生成定时器对象的实例和响应WM_TIMER消息:
int Cv18e1_ClockCtrl::OnCreate (LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
SetTimer(1, 1000, NULL);
return 0;
}
void Cv18e1_ClockCtrl::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
//Invalidate();
InvalidateControl();
COleControl::OnTimer(nIDEvent);
}
在vc6.0里面
当这个编辑框关联的成员变量和interval这个属性关联起来以后,在这个函数里面加上了这样的内容,
void Cv18e1_ClockPropPage::DoDataExchange(CDataExchange* pDX)
{
DDX_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval,_T("m_updateInterval"));
DDX_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval);
DDP_PostProcessing(pDX);
}
而在vs2008里面,由于我还没有找到怎么在添加成员变量时候把这个成员变量与我自定义的属性关联起来,这个函数现在是这样的
void Cv18e1_ClockPropPage::DoDataExchange(CDataExchange* pDX)
{
DDP_PostProcessing(pDX);
DDX_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval);
}
5 个解决方案
#1
帮顶一下
#2
这个问题已经解决
答案可参考下面两个链接:
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/958fa703-b200-4df9-b2ee-a57674e6cb99
http://msdn.microsoft.com/en-us/library/8fb847t6.aspx
简单的说,就是VC6中的Optional property name在2008中被删除了,必须在DoDataExchange中用DDP_Text手动关联控件变量
void CL18aClockPropPage::DoDataExchange(CDataExchange* pDX)
{
DDP_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval, _T("Interval"));
DDX_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval);
DDP_PostProcessing(pDX);
}
注意,DDP_Text(xxxxxxxx)语句一定要放在DDP_PostProcessing(pDX);之前。
附上答案,希望对大家有所帮助
答案可参考下面两个链接:
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/958fa703-b200-4df9-b2ee-a57674e6cb99
http://msdn.microsoft.com/en-us/library/8fb847t6.aspx
简单的说,就是VC6中的Optional property name在2008中被删除了,必须在DoDataExchange中用DDP_Text手动关联控件变量
void CL18aClockPropPage::DoDataExchange(CDataExchange* pDX)
{
DDP_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval, _T("Interval"));
DDX_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval);
DDP_PostProcessing(pDX);
}
注意,DDP_Text(xxxxxxxx)语句一定要放在DDP_PostProcessing(pDX);之前。
附上答案,希望对大家有所帮助
#3
我也碰到和你一样的疑问, 但是按照你说的手动添加这行语句时
DDP_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval, _T("Interval"));
编译报错了:
error C2665: “DDX_Text”: 17 个重载中没有一个可以转换所有参数类型
1> c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxdd_.h(39): 可能是“void DDX_Text(CDataExchange *,int,LPTSTR,int)”
1> 试图匹配参数列表“(CDataExchange *, int, long, const char [9])”时
DDP_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval, _T("Interval"));
编译报错了:
error C2665: “DDX_Text”: 17 个重载中没有一个可以转换所有参数类型
1> c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxdd_.h(39): 可能是“void DDX_Text(CDataExchange *,int,LPTSTR,int)”
1> 试图匹配参数列表“(CDataExchange *, int, long, const char [9])”时
#4
楼主辛苦了,不过在MSND中讲解也很详细,包括有举例。
#5
我也有看这部分,可为什么在Invoke Method 中修改值,程序却不进入OnIntervalChanged函数,计时器也没能被修改,楼主这部分没问题?
void CClockCtrl::OnIntervalChanged(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加属性处理程序代码
if (m_Interval <0 || m_Interval > 6000)
{
m_Interval = 1000;
}
else
{
m_Interval = m_Interval/1000*1000;
}
KillTimer(1);
SetTimer(1,m_Interval, NULL);
SetModifiedFlag();
}
void CClockCtrl::OnIntervalChanged(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加属性处理程序代码
if (m_Interval <0 || m_Interval > 6000)
{
m_Interval = 1000;
}
else
{
m_Interval = m_Interval/1000*1000;
}
KillTimer(1);
SetTimer(1,m_Interval, NULL);
SetModifiedFlag();
}
#1
帮顶一下
#2
这个问题已经解决
答案可参考下面两个链接:
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/958fa703-b200-4df9-b2ee-a57674e6cb99
http://msdn.microsoft.com/en-us/library/8fb847t6.aspx
简单的说,就是VC6中的Optional property name在2008中被删除了,必须在DoDataExchange中用DDP_Text手动关联控件变量
void CL18aClockPropPage::DoDataExchange(CDataExchange* pDX)
{
DDP_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval, _T("Interval"));
DDX_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval);
DDP_PostProcessing(pDX);
}
注意,DDP_Text(xxxxxxxx)语句一定要放在DDP_PostProcessing(pDX);之前。
附上答案,希望对大家有所帮助
答案可参考下面两个链接:
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/958fa703-b200-4df9-b2ee-a57674e6cb99
http://msdn.microsoft.com/en-us/library/8fb847t6.aspx
简单的说,就是VC6中的Optional property name在2008中被删除了,必须在DoDataExchange中用DDP_Text手动关联控件变量
void CL18aClockPropPage::DoDataExchange(CDataExchange* pDX)
{
DDP_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval, _T("Interval"));
DDX_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval);
DDP_PostProcessing(pDX);
}
注意,DDP_Text(xxxxxxxx)语句一定要放在DDP_PostProcessing(pDX);之前。
附上答案,希望对大家有所帮助
#3
我也碰到和你一样的疑问, 但是按照你说的手动添加这行语句时
DDP_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval, _T("Interval"));
编译报错了:
error C2665: “DDX_Text”: 17 个重载中没有一个可以转换所有参数类型
1> c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxdd_.h(39): 可能是“void DDX_Text(CDataExchange *,int,LPTSTR,int)”
1> 试图匹配参数列表“(CDataExchange *, int, long, const char [9])”时
DDP_Text(pDX, IDC_EDIT_INTERVAL, m_updateInterval, _T("Interval"));
编译报错了:
error C2665: “DDX_Text”: 17 个重载中没有一个可以转换所有参数类型
1> c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxdd_.h(39): 可能是“void DDX_Text(CDataExchange *,int,LPTSTR,int)”
1> 试图匹配参数列表“(CDataExchange *, int, long, const char [9])”时
#4
楼主辛苦了,不过在MSND中讲解也很详细,包括有举例。
#5
我也有看这部分,可为什么在Invoke Method 中修改值,程序却不进入OnIntervalChanged函数,计时器也没能被修改,楼主这部分没问题?
void CClockCtrl::OnIntervalChanged(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加属性处理程序代码
if (m_Interval <0 || m_Interval > 6000)
{
m_Interval = 1000;
}
else
{
m_Interval = m_Interval/1000*1000;
}
KillTimer(1);
SetTimer(1,m_Interval, NULL);
SetModifiedFlag();
}
void CClockCtrl::OnIntervalChanged(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加属性处理程序代码
if (m_Interval <0 || m_Interval > 6000)
{
m_Interval = 1000;
}
else
{
m_Interval = m_Interval/1000*1000;
}
KillTimer(1);
SetTimer(1,m_Interval, NULL);
SetModifiedFlag();
}