自己写了一个控件,继承与 CStatic ,现在将其简化如下:// 头文件定义
//我在头文件中定义了一个成员变量 CClientDC* m_dc; 用来代表这个控件自己的 ClientDC
//以便在绘制控件的过程中使用它
class CTrend : public CStatic
{
public:
CTrend();
Init();
public:
CDC m_MemDC;
CClientDC* m_dc;
CRect       m_rctThis;
public:
virtual ~CTrend();protected:
//{{AFX_MSG(CTrend)
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG DECLARE_MESSAGE_MAP()
};
源文件在这里//cpp文件
CTrend::CTrend()
{
     m_dc=new CClientDC(this);//调用无效,m_dc为空
}CTrend::~CTrend()
{
    
}
BEGIN_MESSAGE_MAP(CTrend, CStatic)
//{{AFX_MSG_MAP(CTrend)
ON_WM_SIZE()
ON_WM_CREATE() //}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CTrend message handlersvoid CTrend::OnSize(UINT nType, int cx, int cy) 
{
CStatic::OnSize(nType, cx, cy);
         m_dc=new CClientDC(this);//调用无效,m_dc为空
}int CTrend::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CStatic::OnCreate(lpCreateStruct) == -1)
return -1;
m_dc=new CClientDC(this);//调用无效,m_dc为空
return 0;
}
我知道,可以在 OnPaint 中得到 ClientDC,但是,我的DC还有别的用处,所以,只能在这个控件的整个生命周期内,初始化一次,请问,我该在什么地方得到正确的 ClientDC 呢????注意:只能在这个控件的整个生命周期内,正确得初始化一次

解决方案 »

  1.   

    dc是上下文相关哈
    你只是new出来当然没用
    getdc得出来
      

  2.   

    首先,在构造函数里面当然不会有CClientDC了.这个时候什么都没有呢.构造函数等于什么都没有做.只是初始化数据.也就是说这个是后还没有句柄呢.哪来的m_dc.Onsize里面肯定会无效的.OnSize触发比较早.我的理解是OnCreate后m_dc才会有值个人理解,不知道是否正确.
      

  3.   

    //我现在在类中添加一个 Init 函数
    void CTrend::Init() 
    {
         m_dc=new CClientDC(this);
    }//然后,在对话框的 OnInitDialog 中调用
    void CMyDialog::OnInitDialog()
    {
        CTrend t1;
        t1.Init(); //可以得到正确的 m_dc。。
    }所以说 1楼 兄弟的说法不对啊用 new 也是可以得到 dc 的。大家说要在 Create 之后调用,我在上面的代码中,在 OnCreate 里面调用了 m_dc=new CClientDC(this);但是,返回值确实为空啊
      

  4.   

    我晕,我刚发现,在我的 CTrend 类中,我重载的 OnCreate 没有被执行这是怎么回事啊在对话框中,我是这么使用 CTrend 类的//对话框头文件中声明
    CTrend t1;//在对话框源文件中
    void CMyDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_STATIC100, t1);//在这里把 t1 和对话框模板中的控件对应起来
    }
    那么,我在 CTrend 类中重载的 OnCreate 函数怎么没有被执行呢??
      

  5.   

    你的Create是否是Virtual的Create呢?个人记得Create是virtula BOOL类型的函数,不是MFC的Message Handler。
      

  6.   

    原来,用我在5楼的方法创建控件的话,是不会触发控件的 OnCreate 事件的。
    只好使用自己添加的 Init() 函数了