OnCustomDraw函数是在OnPaint函数之后还是之前被调用的啊?
时间:2011-12-18
来源:互联网
给各位大神帮忙解惑啊!
void CEditListCtrl::OnPaint()
{
if (m_iSubItem >= 0 && m_edtItemEdit.m_hWnd)
{
CRect rect;
CRect rcEdit;
m_edtItemEdit.GetWindowRect(rcEdit);
ScreenToClient(rcEdit);
GetSubItemRect(m_iItem, m_iSubItem, LVIR_LABEL, rect);
//当文本编辑框缩小时,擦除露出的项文本高亮部分
if (rcEdit.right < rect.right)
{
rect.left = rcEdit.right;
CClientDC dc(this);
dc.FillRect(rect, &CBrush(::GetSysColor(COLOR_WINDOW)));
ValidateRect(rect);
}
}
CListCtrl::OnPaint();
}
void CEditListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
//draw each item.set txt color,bkcolor....
NMLVCUSTOMDRAW* pNMLVCustomDraw = (NMLVCUSTOMDRAW*)pNMHDR;
// Take the default processing unless we set this to something else below.
*pResult = CDRF_DODEFAULT;
// First thing - check the draw stage. If it's the control's prepaint
// stage, then tell Windows we want messages for every item.
if (pNMLVCustomDraw->nmcd.dwDrawStage == CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if (pNMLVCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
// This is the notification message for an item. We'll request
// notifications before each subitem's prepaint stage.
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if (pNMLVCustomDraw->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
{
int iItem = (int)pNMLVCustomDraw->nmcd.dwItemSpec;
int iSubItem = pNMLVCustomDraw->iSubItem;
CDC* pDC = CDC::FromHandle(pNMLVCustomDraw->nmcd.hdc);
CString strItemText = GetItemText(iItem, iSubItem);
CRect rcItem, rcText;
GetSubItemRect(iItem, iSubItem, LVIR_LABEL, rcItem);
rcText = rcItem;
CSize size = pDC->GetTextExtent(strItemText);
if(strItemText == _T(""))
{
size.cx = 41;
}
//设置文本高亮矩形
rcText.left += 4;
rcText.right = rcText.left + size.cx + 6;
if(rcText.right > rcItem.right)
{
rcText.right = rcItem.right;
}
COLORREF crOldTextColor = pDC->GetTextColor();
//绘制项焦点/高亮效果
if(m_bFocus)
{
if((m_iItem == iItem) && (m_iSubItem == iSubItem))
{
if(m_bHighLight)
{
pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
pDC->FillSolidRect(&rcText, ::GetSysColor(COLOR_HIGHLIGHT));
}
pDC->DrawFocusRect(&rcText);
}
}
//绘制项文本
rcItem.left += 6;
pDC->DrawText(strItemText, &rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS | DT_NOCLIP);
pDC->SetTextColor(crOldTextColor);
*pResult = CDRF_SKIPDEFAULT;// We've painted everything.
}
}
作者: UstbNo1_ball 发布时间: 2011-12-18
因为在点击了ListCtrl 控件上的一个SubItem之后CEditListCtrl的OnLButtonDown函数被激活,然后判断是第几次点击,如果是第一次点的话,就会给它一个高亮的背景,如果是第二次就给它编辑的能力;
我现在想知道点击第一次之后,是先调用的OnPaint还是先调用的OnCustomDram函数呢?
void CEditListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bFocus = TRUE;
LVHITTESTINFO lvhit;
lvhit.pt = point;
int item = SubItemHitTest(&lvhit);
//if (over a item/subitem)
// if (item != -1 && (lvhit.flags & LVHT_ONITEM))
if (LVHT_ONITEMLABEL & lvhit.flags)
{
CListCtrl::OnLButtonDown(nFlags, point);
if(m_bHighLight && m_iItem == lvhit.iItem && m_iSubItem == lvhit.iSubItem)
{
//第二次单击
// EditLabel(m_iItem);
ASSERT(::IsWindow(m_hWnd));
HWND m=(HWND)SendMessage(LVM_EDITLABEL, m_iItem, 0L);
(CEdit*)CWnd::FromHandle(m);
return;
}
else
{
//第一次单击
m_iItem = lvhit.iItem;
m_iSubItem = lvhit.iSubItem;
m_bHighLight = TRUE;
// CListCtrl::OnLButtonDown(nFlags, point);
// return;
}
}
else
{
if(m_edtItemEdit.m_hWnd == NULL)
{
//未出现文本编辑框时
m_bHighLight = FALSE;
}
CListCtrl::OnLButtonDown(nFlags, point);
// return;
}
Invalidate();
}
我现在想知道点击第一次之后,是先调用的OnPaint还是先调用的OnCustomDram函数呢?
void CEditListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bFocus = TRUE;
LVHITTESTINFO lvhit;
lvhit.pt = point;
int item = SubItemHitTest(&lvhit);
//if (over a item/subitem)
// if (item != -1 && (lvhit.flags & LVHT_ONITEM))
if (LVHT_ONITEMLABEL & lvhit.flags)
{
CListCtrl::OnLButtonDown(nFlags, point);
if(m_bHighLight && m_iItem == lvhit.iItem && m_iSubItem == lvhit.iSubItem)
{
//第二次单击
// EditLabel(m_iItem);
ASSERT(::IsWindow(m_hWnd));
HWND m=(HWND)SendMessage(LVM_EDITLABEL, m_iItem, 0L);
(CEdit*)CWnd::FromHandle(m);
return;
}
else
{
//第一次单击
m_iItem = lvhit.iItem;
m_iSubItem = lvhit.iSubItem;
m_bHighLight = TRUE;
// CListCtrl::OnLButtonDown(nFlags, point);
// return;
}
}
else
{
if(m_edtItemEdit.m_hWnd == NULL)
{
//未出现文本编辑框时
m_bHighLight = FALSE;
}
CListCtrl::OnLButtonDown(nFlags, point);
// return;
}
Invalidate();
}
作者: UstbNo1_ball 发布时间: 2011-12-18
用一个MessageBox看一下就知道了
作者: ghj123h 发布时间: 2011-12-18
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28