我将组合框的列表框子类化。在列表框的鼠标悬停事件中,我尝试使用下面的代码获取组合框编辑控件的句柄。
但它返回编辑控件的NULL句柄。
方法1
HWND hWndParent = ::GetParent(GetSafeHwnd());
CWnd* pParentWnd = CWnd::FromHandle(hWndParent);
CWnd *pCBEdit = ((CComboBox*)pParentWnd)->GetDlgItem(1001);
方法2
HWND hWndParent = ::GetParent(GetSafeHwnd());
CWnd* pParentWnd = CWnd::FromHandle(hWndParent);
COMBOBOXINFO cbi = { sizeof(COMBOBOXINFO) };
((CComboBox*)pParentWnd)->GetComboBoxInfo(&cbi);
在对话框的onInitDialog()中,我有以下代码。
COMBOBOXINFO cbi = { sizeof(COMBOBOXINFO) };
m_Combo.GetComboBoxInfo(&cbi);
m_Lbox.SubclassWindow(cbi.hwndList);
子类代码
IMPLEMENT_DYNAMIC(CMyListBox, CListBox)
CMyListBox::CMyListBox(){}
CMyListBox::~CMyListBox(){}
BEGIN_MESSAGE_MAP(CMyListBox, CListBox)
ON_WM_MOUSEHOVER()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
// CMyListBox message handlers
void CMyListBox::OnMouseHover(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
BOOL bOutside = TRUE;
CString str;
HWND hWndParent = ::GetParent(GetSafeHwnd());
CWnd* pParentWnd = CWnd::FromHandle(hWndParent);
CWnd *pCBEdit = ((CComboBox*)pParentWnd)->GetDlgItem(1001);
/*COMBOBOXINFO cbi = { sizeof(COMBOBOXINFO) };
((CComboBox*)pParentWnd)->GetComboBoxInfo(&cbi);*/
VERIFY(m_pwndTarget != NULL);
UINT ndx = ItemFromPoint(point, bOutside);
if (!bOutside)
{
GetText(ndx, str);
pCBEdit->SetWindowText(str);
}
CListBox::OnMouseHover(nFlags, point);
}
void CMyListBox::OnMouseMove(UINT nFlags, CPoint point)
{
TRACKMOUSEEVENT tme = { sizeof(TRACKMOUSEEVENT) };
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.dwHoverTime = 1;
tme.hwndTrack = GetSafeHwnd();
TrackMouseEvent(&tme);
CListBox::OnMouseMove(nFlags, point);
}
答案 0 :(得分:2)
下拉列表框和combox box控件之间没有关系。这是一个弹出控件,没有组合框控件作为父级。
我看到的唯一方法是枚举进程的所有组合框窗口,并检查您知道的列表框是否属于它。
如果是带有CBS_DROPDOWNLIST样式的组合框,也没有编辑控件。
只有使用CBS_DROPDOWN的Combobox控件才有这样的编辑控件。
答案 1 :(得分:0)
有一篇有关如何执行此操作的Microsoft文章:https://docs.microsoft.com/en-us/windows/win32/controls/subclass-a-combo-box
最重要的是,他们使用这样的代码片段来获取编辑控件:
// Get the edit window handle to each combo box.
pt.x = 1;
pt.y = 1;
hwndEdit1 = ChildWindowFromPoint(hwndCombo1, pt);
尝试时,我不得不使用pt.x = 5 pt.y = 5,但是随后我获得了控件窗口类“ Edit”的控件,该控件接收击键。