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

问题描述 投票:0回答:2

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

但它为编辑控件返回 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);
}
winapi mfc
2个回答
2
投票

下拉列表框和组合框控件之间没有关系。它是一个弹出控件,没有组合框控件作为父级。

我看到的唯一方法是枚举进程的所有组合框窗口,并检查您知道的列表框是否属于它。

如果它是样式为

CBS_DROPDOWNLIST
的组合框,则没有编辑控件。

只有具有

CBS_DROPDOWN
的 Combobox 控件才有这样的编辑控件。


0
投票

有一篇 Microsoft 文章介绍了如何执行此操作:https://learn.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,但随后我获得了接收击键的窗口类“编辑”的控制权。

© www.soinside.com 2019 - 2024. All rights reserved.