我对控件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控件,而不是我子类化后的控件(我增加的特殊效果没有了)。我要创建的是子类化后的控件,应该怎么办?
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控件,而不是我子类化后的控件(我增加的特殊效果没有了)。我要创建的是子类化后的控件,应该怎么办?
用subclasswindow并联
假设需要效果如下
鼠标在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)最后编译,运行,检验效果。