2017-09-18 81 views
0

我將子目錄的組合框列表框中。在列表框的mousehover事件中,我嘗試使用下面的代碼獲取ComboBox的編輯控件的句柄。如何從Combox的子目錄Combox的列表框中獲取Combox的Edit控件句柄

但它爲編輯控件返回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

您是否檢查'GetParent'是否返回您期望的窗口? –

+0

@JonathanPotter:組合框的下拉列表中沒有組合框作爲父項。這是一個免費的彈出窗口,並且不可見作爲組合框控件的孩子。 – xMRi

+0

是的,GetParent正在返回我expect.GetCurSel(),窗口的句柄,但GetComboBoxInfo()和GetDlgItem(1001)返回的編輯控制的空柄處理罰款。我的combox使用下拉式而不是下拉式列表。 – user566

回答

2

有下拉列表框和COMBOX框控件之間沒有任何關係。這是一個彈出式控件,它沒有組合框控件作爲父項。

我看到的唯一方法是枚舉過程的所有組合框窗口,並檢查您知道的列表框是否屬於它。

如果它是風格爲CBS_DROPDOWNLIST的組合框,那麼也沒有編輯控件。

只有具有CBS_DROPDOWN的組合框控件具有這樣的編輯控件。

+0

我只使用CBS_DROPDOWN風格。在對話框的oninitdialog中,我可以使用GetComboBoxInfo()或GetDlgItem(1001)獲取編輯控件句柄。而從combox的子類列表框中,使用這些API我無法獲得組合框的編輯控件的句柄。 – user566

+0

更改了我的答案。 – xMRi

+0

雖然我相當肯定,下拉列表中有組合框作爲其所有者。哪個'GetParent'(儘管它的名字)會返回。 – IInspectable