我对控件CListBox作了子类化,加了一些特殊的效果,新的类为CListBoxEx。但是我的这个控件是动态创建的,创建过程如下:CListBoxEx m_ListBoxEx;RECT rect;
rect.top=40;
rect.left=80;
rect.right=200;
rect.bottom=180;m_ListBoxEx.CreateEx( 0,"ListBox","",WS_POPUP|WS_BORDER|WS_VISIBLE,40,80,200,180, HWND_DESKTOP,NULL )现在的问题是,控件倒是动态创建成功了,但创建的是原始的ListBox控件,而不是我子类化后的控件(我增加的特殊效果没有了)。我要创建的是子类化后的控件,应该怎么办?

解决方案 »

  1.   

    为什么要重载createex啊?重载的时候添加哪些代码?
      

  2.   

    试试不要动态创建
    用subclasswindow并联
      

  3.   

    以CStatic为例
    假设需要效果如下
    鼠标在CStatic区域内的时候
    CStatic变为红色,否则CStatic为白色
    首先,生成一个基于对话框的MFC程序,并在对话框上放一个CStatic控件,ID为ID_STATICEX,同时勾选Notify风格
    然后映射两条消息,WM_MOUSEMOVE, WM_PAINT
    void CEditEx::OnMouseMove(UINT nFlags, CPoint point) 
    {
    this->SetCapture();

    CDC* pDC = this->GetDC();
    CRect rect;
    this->GetClientRect(&rect); if(rect.PtInRect(point))
    {
    CBrush br(m_Color);
    pDC->FillRect(&rect, &br);
    }else
    {
    this->Invalidate();
    }
    CEdit::OnMouseMove(nFlags, point);
    }void CEditEx::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting
    CBrush br(RGB(255, 255, 255));
    CRect rect; this->GetClientRect (&rect);
    dc.FillRect(&rect, &br);
    // Do not call CEdit::OnPaint() for painting messages
    }第三.在该对话框类中声明一个CStaticEx的成员变量m_StaticEx
    在OnInitDlg里,写以下语句
    m_StaticEx。SubclassDlgItem(ID_STATICEX, this)最后编译,运行,检验效果。