2017-09-18 1 views
0

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); 
} 
+0

Avez-vous vérifié si 'GetParent' renvoie la fenêtre que vous attendez? –

+0

@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

+0

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

Répondre

2

Il n'y a pas de relation entre la zone de liste déroulante et la commande de boîte de Combox. C'est un contrôle contextuel qui n'a pas le contrôle de la zone de liste déroulante en tant que parent. La seule façon que je vois serait d'énumérer toutes les fenêtres de la zone de liste déroulante du processus et de vérifier si la zone de liste que vous connaissez lui appartient.

De même, il n'existe aucun contrôle d'édition s'il s'agit d'une zone de liste déroulante de style CBS_DROPDOWNLIST. Seuls les contrôles Combobox avec CBS_DROPDOWN ont un tel contrôle d'édition.

+0

J'utilise uniquement le style CBS_DROPDOWN. Dans l'onglet oninitdialog de la boîte de dialogue, je peux obtenir le handle de contrôle d'édition en utilisant GetComboBoxInfo() ou GetDlgItem (1001). Alors que dans la liste déroulante de combox, en utilisant ces API, je suis incapable d'obtenir le handle du contrôle d'édition de combobox. – user566

+0

Modifié ma réponse. – xMRi

+0

Je suis assez certain, que la liste déroulante a la liste déroulante comme son propriétaire, cependant. Quel 'GetParent' (malgré son nom) retournerait. – IInspectable