//处理combobox的listbox的消息处理
case WM_LBUTTONDOWN:
{
CRect rc, rcColor;
GetClientRect(hWnd, rc);
CPoint pt;
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam); if (PtInRect(rc, pt))
{
INT nItemHeight = SendMessage(hWnd, LB_GETITEMHEIGHT, 0, 0);
INT nTopIndex = SendMessage(hWnd, LB_GETTOPINDEX, 0, 0); // Compute which index to check/uncheck
INT nIndex = nTopIndex + pt.y / nItemHeight; SendMessage(hWnd, LB_GETITEMRECT, nIndex, (LONG)(VOID *)&rc); if (PtInRect(rc, pt))//每一个ITEM
{
// Invalidate this window
InvalidateRect(hWnd, rc, FALSE); // Notify that selection has changed
m_pComboBox->GetParent()->SendMessage(WM_COMMAND, MAKELONG(GetWindowLong(m_pComboBox->m_hWnd, GWL_ID), CBN_SELCHANGE), (LPARAM)m_pComboBox->m_hWnd);
if (!m_pComboBox->IsHandleStyle(nIndex))
{
bCloseOnLButtonUp = true;
break;
}
// Was the click on the check box?
HDC hdc = GetDC(hWnd);
TEXTMETRIC metrics;
GetTextMetrics(hdc, &metrics);
ReleaseDC(hWnd, hdc);
rc.right = rc.left + metrics.tmHeight + metrics.tmExternalLeading + 6;
rcColor = rc;
rcColor.left = rcColor.right;
rcColor.right = rcColor.left + metrics.tmHeight + metrics.tmExternalLeading ; if (PtInRect(rc, pt))//checkbox
{
// Toggle the check state
m_pComboBox->SetCheck(nIndex, !m_pComboBox->GetCheck(nIndex)); // Notify that check state has changed
m_pComboBox->GetParent()->SendMessage(WM_COMMAND, MAKELONG(GetWindowLong(m_pComboBox->m_hWnd, GWL_ID), BN_CLICKED), (LPARAM)m_pComboBox->m_hWnd);
}
else if(rcColor.PtInRect(pt))//颜色框位置
{
CColorDialog dlg;
if(dlg.DoModal() == IDOK)
{
m_pComboBox->SetColor(nIndex, dlg.GetColor());
m_pComboBox->GetParent()->SendMessage(WM_COMMAND, MAKELONG(GetWindowLong(m_pComboBox->m_hWnd, GWL_ID), BN_CLICKED), (LPARAM)m_pComboBox->m_hWnd);
m_pComboBox->SetFocus();
// m_pComboBox->SendMessage(WM_COLOR, 0, dlg.GetColor());
}
}
else
{
bCloseOnLButtonUp = true;
}
}
} // Do the default handling now
break;
这个当我处理颜色选择之后,combobox中的editctrl是的内容不是刚才选中的ITEM,而且选择颜色之后,第一次单击combobox不能响应鼠标的,没有单击是没有反应的,第二次就好了啊
case WM_LBUTTONDOWN:
{
CRect rc, rcColor;
GetClientRect(hWnd, rc);
CPoint pt;
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam); if (PtInRect(rc, pt))
{
INT nItemHeight = SendMessage(hWnd, LB_GETITEMHEIGHT, 0, 0);
INT nTopIndex = SendMessage(hWnd, LB_GETTOPINDEX, 0, 0); // Compute which index to check/uncheck
INT nIndex = nTopIndex + pt.y / nItemHeight; SendMessage(hWnd, LB_GETITEMRECT, nIndex, (LONG)(VOID *)&rc); if (PtInRect(rc, pt))//每一个ITEM
{
// Invalidate this window
InvalidateRect(hWnd, rc, FALSE); // Notify that selection has changed
m_pComboBox->GetParent()->SendMessage(WM_COMMAND, MAKELONG(GetWindowLong(m_pComboBox->m_hWnd, GWL_ID), CBN_SELCHANGE), (LPARAM)m_pComboBox->m_hWnd);
if (!m_pComboBox->IsHandleStyle(nIndex))
{
bCloseOnLButtonUp = true;
break;
}
// Was the click on the check box?
HDC hdc = GetDC(hWnd);
TEXTMETRIC metrics;
GetTextMetrics(hdc, &metrics);
ReleaseDC(hWnd, hdc);
rc.right = rc.left + metrics.tmHeight + metrics.tmExternalLeading + 6;
rcColor = rc;
rcColor.left = rcColor.right;
rcColor.right = rcColor.left + metrics.tmHeight + metrics.tmExternalLeading ; if (PtInRect(rc, pt))//checkbox
{
// Toggle the check state
m_pComboBox->SetCheck(nIndex, !m_pComboBox->GetCheck(nIndex)); // Notify that check state has changed
m_pComboBox->GetParent()->SendMessage(WM_COMMAND, MAKELONG(GetWindowLong(m_pComboBox->m_hWnd, GWL_ID), BN_CLICKED), (LPARAM)m_pComboBox->m_hWnd);
}
else if(rcColor.PtInRect(pt))//颜色框位置
{
CColorDialog dlg;
if(dlg.DoModal() == IDOK)
{
m_pComboBox->SetColor(nIndex, dlg.GetColor());
m_pComboBox->GetParent()->SendMessage(WM_COMMAND, MAKELONG(GetWindowLong(m_pComboBox->m_hWnd, GWL_ID), BN_CLICKED), (LPARAM)m_pComboBox->m_hWnd);
m_pComboBox->SetFocus();
// m_pComboBox->SendMessage(WM_COLOR, 0, dlg.GetColor());
}
}
else
{
bCloseOnLButtonUp = true;
}
}
} // Do the default handling now
break;
这个当我处理颜色选择之后,combobox中的editctrl是的内容不是刚才选中的ITEM,而且选择颜色之后,第一次单击combobox不能响应鼠标的,没有单击是没有反应的,第二次就好了啊
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货