我將子目錄的組合框列表框中。在列表框的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);
}
您是否檢查'GetParent'是否返回您期望的窗口? –
@JonathanPotter:組合框的下拉列表中沒有組合框作爲父項。這是一個免費的彈出窗口,並且不可見作爲組合框控件的孩子。 – xMRi
是的,GetParent正在返回我expect.GetCurSel(),窗口的句柄,但GetComboBoxInfo()和GetDlgItem(1001)返回的編輯控制的空柄處理罰款。我的combox使用下拉式而不是下拉式列表。 – user566