重绘CCmoboBox控件,子类化后的消息响应为什么无效呢

重绘CCmoboBox控件,子类化后的消息响应为何无效呢?
本帖最后由 zyw067 于 2015-11-01 18:22:29 编辑
想重绘CComboBox控件,目标如下
重绘CCmoboBox控件,子类化后的消息响应为什么无效呢
重绘CCmoboBox控件,子类化后的消息响应为什么无效呢
默认为图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或者百度详细查询。