J'ai sous-classé la liste déroulante de la liste déroulante. Dans l'événement mousehover de la boîte de liste, j'ai essayé d'obtenir le handle du contrôle d'édition de combobox en utilisant le code ci-dessous.Comment obtenir le handle de contrôle Edit de Combox à partir de la liste déroulante de Combox sous-classé
Mais il renvoie le handle NULL pour le contrôle d'édition.
méthode 1
HWND hWndParent = ::GetParent(GetSafeHwnd());
CWnd* pParentWnd = CWnd::FromHandle(hWndParent);
CWnd *pCBEdit = ((CComboBox*)pParentWnd)->GetDlgItem(1001);
procédé 2
HWND hWndParent = ::GetParent(GetSafeHwnd());
CWnd* pParentWnd = CWnd::FromHandle(hWndParent);
COMBOBOXINFO cbi = { sizeof(COMBOBOXINFO) };
((CComboBox*)pParentWnd)->GetComboBoxInfo(&cbi);
Dans OnInitDialog de dialogue() I ont le code ci-dessous.
COMBOBOXINFO cbi = { sizeof(COMBOBOXINFO) };
m_Combo.GetComboBoxInfo(&cbi);
m_Lbox.SubclassWindow(cbi.hwndList);
Le code de la sous-classe
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);
}
Avez-vous vérifié si 'GetParent' renvoie la fenêtre que vous attendez? –
@JonathanPotter: La liste déroulante d'une liste déroulante n'a pas la zone de liste déroulante en tant que parent. Il s'agit d'une fenêtre contextuelle gratuite qui n'est pas visible en tant qu'enfant dans le contrôle de liste déroulante. – xMRi
Oui, GetParent renvoie la fenêtre que j'attends.GetCurSel(), findstring fonctionne bien sur le handle de cette fenêtre, mais GetComboBoxInfo() et GetDlgItem (1001) retournent le handle vide pour le contrôle d'édition. Mon combox utilise le style déroulant et non la liste déroulante. – user566