重绘CCmoboBox控件,子类化后的消息响应为什么无效呢
重绘CCmoboBox控件,子类化后的消息响应为何无效呢?
想重绘CComboBox控件,目标如下


默认为图1状态,鼠标移动到控件上后,文字和背景变色如图2。
实现的时候,思路大概是这样:
子类化一个继承自CComboBox的类,有2个成员变量,分别继承自CEdit和CListBox,如下
然后重写CComboBox的PreSubclassWindow方法,如下
之后给CReComboBoxEdit类添加=WM_CTLCOLOR、WM_MOUSEMOVE、WM_MOUSEHOVER等消息
现在遇到的问题是子类化后的CEdit部分的消息响应不被触发,以至于其Mousemove和ctlcolor消息无效。问题出在哪了呢?烦请各位前辈指点一下,十分感谢!!
写了个最简单的Demo,CReComboBox类的mousemove消息不被响应,查看代码差错可能会更方便些,辛苦各位了
资源网址:http://download.****.net/download/zyw067/9231671
------解决思路----------------------
PreSubclassWindow子类化之前的预处理,控件还没有子类化。
子控件肯定不能子类化在父窗口前面。
------解决思路----------------------
vc6 是
protected:
CMyEdit m_edit;
CMyListBox m_listbox;
还有
------解决思路----------------------
我建议你用这个函数 SubclassDlgItem(); 他是针对窗口上某个控件的重写绑定的、我一直用的是这个。至于你的PreSubClassWindow我还真没有用过、可搜索MSDN或者百度详细查询。
想重绘CComboBox控件,目标如下
默认为图1状态,鼠标移动到控件上后,文字和背景变色如图2。
实现的时候,思路大概是这样:
子类化一个继承自CComboBox的类,有2个成员变量,分别继承自CEdit和CListBox,如下
CReComboBoxEdit m_cEdit; //class CReComboBoxEdit : public CEdit
CReComboBoxList m_cList; //class CReComboBoxList : public CListBox
然后重写CComboBox的PreSubclassWindow方法,如下
void CReComboBox::PreSubclassWindow()
{
//变量定义
COMBOBOXINFO m_comboBoxInfo;
m_comboBoxInfo.cbSize=sizeof(m_comboBoxInfo);
//绑定控件
if (TRUE == GetComboBoxInfo(&m_comboBoxInfo))
{
if (m_comboBoxInfo.hwndItem!=NULL)
{
m_cEdit.SetOwnerWnd(GetSafeHwnd());
m_cEdit.SubclassWindow(m_comboBoxInfo.hwndItem);
}
if (m_comboBoxInfo.hwndList!=NULL)
{
m_cList.SetOwnerWnd(GetSafeHwnd());
m_cList.SubclassWindow(m_comboBoxInfo.hwndList);
}
}
CComboBox::PreSubclassWindow();
}
之后给CReComboBoxEdit类添加=WM_CTLCOLOR、WM_MOUSEMOVE、WM_MOUSEHOVER等消息
现在遇到的问题是子类化后的CEdit部分的消息响应不被触发,以至于其Mousemove和ctlcolor消息无效。问题出在哪了呢?烦请各位前辈指点一下,十分感谢!!
写了个最简单的Demo,CReComboBox类的mousemove消息不被响应,查看代码差错可能会更方便些,辛苦各位了
资源网址:http://download.****.net/download/zyw067/9231671
------解决思路----------------------
PreSubclassWindow子类化之前的预处理,控件还没有子类化。
子控件肯定不能子类化在父窗口前面。
------解决思路----------------------
vc6 是
protected:
CMyEdit m_edit;
CMyListBox m_listbox;
HBRUSH CMyComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
char name[40];
if (nCtlColor == CTLCOLOR_LISTBOX)
{//ListBox control,It is a COMBOLBOX,not a normal listbox.Besides,
//It is not a child window of combobox.
if (m_listbox.GetSafeHwnd() == NULL)
{
m_listbox.SubclassWindow(pWnd->GetSafeHwnd());
int ID=m_listbox.GetDlgCtrlID ();//1000
GetClassName(m_listbox.m_hWnd,name,40);
afxDump << ID << "\n";//ComboLBox
// m_listbox.Attach(pWnd->GetSafeHwnd());
}
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
void CMyComboBox::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
// BOOL bl=m_listbox.SubclassDlgItem(1000,this);
m_edit.SubclassDlgItem(1001,this);
CComboBox::PreSubclassWindow();
}
还有
HBRUSH CSuperComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
if (nCtlColor == CTLCOLOR_LISTBOX)
{//ListBox control,It is a COMBOLBOX,not a normal listbox.Besides,
//It is not a child window of combobox.
if (m_listbox.GetSafeHwnd() == NULL)
{
m_listbox.SubclassWindow(pWnd->GetSafeHwnd());
//too later to change the sytle!
m_listbox.ModifyStyle(0,WS_HSCROLL
------解决思路----------------------
LBS_MULTICOLUMN);
//you have to create a new list box ?
//see "Dynamically re-creating a list box" code project.
RecreateComboLBox(&m_listbox);// no messages ?
}
}
if (nCtlColor == CTLCOLOR_EDIT)
{
m_hEdit=pWnd->GetSafeHwnd();
}
//
HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
------解决思路----------------------
我建议你用这个函数 SubclassDlgItem(); 他是针对窗口上某个控件的重写绑定的、我一直用的是这个。至于你的PreSubClassWindow我还真没有用过、可搜索MSDN或者百度详细查询。