如何从子类Combox的列表框中获取Combox的Edit控件句柄

时间:2017-09-18 06:34:42

标签: winapi mfc

我将组合框的列表框子类化。在列表框的鼠标悬停事件中,我尝试使用下面的代码获取组合框编辑控件的句柄。

但它返回编辑控件的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);
}

2 个答案:

答案 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”的控件,该控件接收击键。