第一次学习用ATL写控件,请大家帮助。CWeiChartCtrl是我的控件类,CChartWnd是控件里面的窗口。
在CWeiChartCtrl里有个成员变量CChartWnd* m_pChartWnd;在控件创建非客户区时,创建CChartWnd类,代码如下:
LRESULT CWeiChartCtrl::OnNcCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
bHandled = FALSE; ASSERT( m_pChartWnd==NULL );
m_pChartWnd = new CChartWnd;
if( m_pChartWnd->SubclassWindow(m_hWnd) ){
m_pChartWnd->m_pWeiChartCtrl = this;
}

    return 0;
}CChartWnd类有一变量ChartType m_nChartType;
在类构造时将其初始化为emPie:
CChartWnd::CChartWnd(): m_nChartType(emPie)
{
}ChartType的定义为:
typedef enum tagChartType{
emPie=0,
emCylind=1
}ChartType;控件有一个设置类型的接口,下面是实现代码:
STDMETHODIMP CWeiChartCtrl::put_Type(ChartType newVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此添加实现代码
ASSERT( m_pChartWnd!=NULL );
m_pChartWnd->m_nChartType = newVal; return S_OK;
}在测试工程里在视图中:
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1; // TODO:  在此添加您专用的创建代码
if(!m_WeiChartWnd.CreateControl(CLSID_WeiChartCtrl,NULL,WS_CHILD | WS_VISIBLE, CRect(0,0,200,200),this,AFX_IDW_PANE_FIRST)){
TRACE0("未能创建窗口\n");
return -1;
}
m_pWeiChartWnd = m_WeiChartWnd.GetControlUnknown();
==1处==ASSERT(m_pWeiChartWnd != NULL);
m_pWeiChartWnd->Type = emCylind; return 0;
}上面这些代码完全能正常工作,我把该控件放到对话框中也能正常显示。但是当我在对话框的设计界面中,在控件的Type属性中,选择下拉列表里的第二个属性emCylind时,开发环境就报错了。选择调试发现断在“==1处==”处。于是我把m_pChartWnd = new CChartWnd;移到了CWeiChartCtrl类的构造函数中,现在选择emCylind时不出错了,但当抬起鼠标时,属性自动变成emPie了。请问如何解决?

解决方案 »

  1.   

    应该是变量的持久性的问题 ATL不太懂 看你的程序里面没有将接口通过一定形式保存 也就是没有完成设计器数据与控件本身之间的数据交互过程。
    ActiveX控件的话是会使用DDX DDP这里的东西来完成数据保存以及与属性页间数据传递的。
      

  2.   

    给些建议:
    单步调试,跟踪变量 m_pWeiChartWnd->Type的值的变化
      

  3.   

    CChartWnd怎么写的?CChartWnd是复合控件吗?什么是"现在选择emCylind时不出错了,但当抬起鼠标时,属性自动变成emPie了 "?
      

  4.   

    CChartWnd是最简单的一个派生自CWnd的窗口,只是在OnPaint中画了一条线而已。控件有两个属性TYPE,当其为
    emPie画横线,当其为emCylind时画竖线。
      

  5.   

    在开发环境中对话框编辑界面上控件的属性中,可以看到Type的两个属性emPie、emCylind,默认值为emPie。想把Type值改成emClind,但选择后自动又变为emPie
      

  6.   

    上述问题已解决,原因是get_Type方法没实现,将它实现了,就好了。但现在又发现一新的问题,将其设成emClind后,虽然设计界面上值是改过来了。但程序运行后,发现其类型还是emPie
      

  7.   

    跟踪一下你的m_pWeiChartWnd->Type 变量
    看看在设置属性的时候是否有修改
    实在不行,就把所有有m_pWeiChartWnd->Type 地方都用TRACE输出里面的内容
      

  8.   

    现在的问题是,Type如果不设初始值,在设计界面没法给它指定属性值。如果设了初始值,设计界面的指定的属性便没有作用。因为对象构造的时候,初始值被赋给了它。