第一次学习用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了。请问如何解决?
在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了。请问如何解决?
解决方案 »
- gsoap加入客户端工程编译后出现namespace重定义错误
- 新手求助~~~在vs08 MFC程序中画个矩形(详细可见内容)
- CListCtrl OnClick问题
- 特简单问题,有几行代码不懂,给解释一下
- 请zhoujinhua(火腿)来领分100!!!
- 如何在其他win98上注册在98下开发的com组件!
- 系统问题?
- 简单问题,立即给分:如何在框架类中调用文档类公有函数?
- 蒋涛网管请注意:你们的服务器再不升级,就要被黑掉了
- RadFile的size参数为什么是DWORD呢?
- VC2008支持opengl的colortable吗?
- vc中服务器已经连接好了数据库而程序里要连接数据库,程序中还需要再导入数据吗?为什么?
ActiveX控件的话是会使用DDX DDP这里的东西来完成数据保存以及与属性页间数据传递的。
单步调试,跟踪变量 m_pWeiChartWnd->Type的值的变化
emPie画横线,当其为emCylind时画竖线。
看看在设置属性的时候是否有修改
实在不行,就把所有有m_pWeiChartWnd->Type 地方都用TRACE输出里面的内容