设为首页 收藏本站
查看: 1071|回复: 0

[经验分享] LVS_EDITLABELS风格的listctrl(nm_customdraw示例)

[复制链接]

尚未签到

发表于 2015-11-21 04:32:44 | 显示全部楼层 |阅读模式
  帖子
  


  

#pragma once
#include "HeaderCtrlEx.h"
class CItemEdit : public CEdit
{
public:
CItemEdit();
virtual ~CItemEdit();
int m_iXPos;
protected:
afx_msg void OnWindowPosChanging(WINDOWPOS FAR* lpwndpos);
DECLARE_MESSAGE_MAP()
};
// CMyListCtrl
class CMyListCtrl : public CListCtrl
{
DECLARE_DYNAMIC(CMyListCtrl)
public:
CMyListCtrl();
virtual ~CMyListCtrl();
void LockHeader(BOOL bLockHeader);
protected:
virtual void PreSubclassWindow();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnPaint();
afx_msg void OnLvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnLvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnSetFocus(CWnd* pOldWnd);
DECLARE_MESSAGE_MAP()
private:
intm_iSubItem;//子项标识符
intm_iItem;//主项标识符
BOOLm_bHighLight;//是否高亮文本
BOOLm_bFocus;       //是否绘制焦点框
CItemEditm_edtItemEdit;  // 用于子类化EditLabel函数返回的CEdit*指针
CHeaderCtrlExm_HeaderCtrl;
};



  
  

// MyListCtrl.cpp : 实现文件
//
#include "stdafx.h"
#include "ListCtrlEx.h"
#include "MyListCtrl.h"

// CMyListCtrl
IMPLEMENT_DYNAMIC(CMyListCtrl, CListCtrl)
CMyListCtrl::CMyListCtrl()
{
m_iItem = -1;
m_iSubItem = -1;
m_bHighLight = FALSE;
m_bFocus = FALSE;
}
CMyListCtrl::~CMyListCtrl()
{
}

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
ON_NOTIFY_REFLECT(LVN_BEGINLABELEDIT, &CMyListCtrl::OnLvnBeginlabeledit)
ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, &CMyListCtrl::OnLvnEndlabeledit)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CMyListCtrl::OnNMCustomdraw)
ON_WM_KILLFOCUS()
ON_WM_SETFOCUS()
END_MESSAGE_MAP()

// CMyListCtrl 消息处理程序
void CMyListCtrl::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
CListCtrl::PreSubclassWindow();
ModifyStyle(0, LVS_EDITLABELS);
CHeaderCtrl* pHeader = GetHeaderCtrl();
m_HeaderCtrl.SubclassWindow(pHeader->GetSafeHwnd());
}
void CMyListCtrl::LockHeader(BOOL bLockHeader)
{
m_HeaderCtrl.LockHeader(bLockHeader);
}
void CMyListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bFocus = TRUE;
LVHITTESTINFO lvhit;
lvhit.pt = point;
int item = SubItemHitTest(&lvhit);
if ( item != -1 && ((lvhit.flags) & LVHT_ONITEM) )
{
CListCtrl::OnLButtonDown(nFlags, point);
if ( m_bHighLight && m_iItem == lvhit.iItem && m_iSubItem == lvhit.iSubItem )
{
// 第二次单击
EditLabel(m_iItem);
return;
}
else
{
// 第一次单击
m_iItem = lvhit.iItem;
m_iSubItem = lvhit.iSubItem;
m_bHighLight = TRUE;
}
}
else
{
if ( m_edtItemEdit.m_hWnd == NULL )
{
// 未出现文本编辑框时
m_bHighLight = FALSE;
}
CListCtrl::OnLButtonDown(nFlags, point);
}
Invalidate();
}
void CMyListCtrl::OnPaint()
{
//CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CListCtrl::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 CMyListCtrl::OnLvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult)
{
LV_DISPINFO *pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: 在此添加控件通知处理程序代码
if ( m_iSubItem >= 0 )
{
ASSERT(m_iItem == pDispInfo->item.iItem);
CRect rcSubItem;
GetSubItemRect(pDispInfo->item.iItem, m_iSubItem, LVIR_BOUNDS, rcSubItem);
HWND hWnd = (HWND)SendMessage(LVM_GETEDITCONTROL);
ASSERT(hWnd != NULL);
VERIFY(m_edtItemEdit.SubclassWindow(hWnd));
m_edtItemEdit.m_iXPos = rcSubItem.left + 4;
m_edtItemEdit.SetWindowText(GetItemText(pDispInfo->item.iItem, m_iSubItem));
}
*pResult = 0;
}
void CMyListCtrl::OnLvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult)
{
LV_DISPINFO *pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: 在此添加控件通知处理程序代码
LV_ITEM *plvItem = &pDispInfo->item;
if ( m_iSubItem >= 0 )
{
if ( plvItem->pszText != NULL )
{
SetItemText(plvItem->iItem, m_iSubItem, plvItem->pszText);
}
VERIFY(m_edtItemEdit.UnsubclassWindow() != NULL);
*pResult = 0;
}
//编辑文本时对控件父窗口操作(如单击其它控件)引发&quot;OnEndlabeledit&quot;时刷新控件
CRect rect;
GetWindowRect(&rect);
CPoint point;
::GetCursorPos(&point);
if ( !rect.PtInRect(point) )
{
m_iItem = -1;
m_iSubItem = -1;
m_bFocus = FALSE;
m_bHighLight = FALSE;
}
}
void CMyListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW* pNMLVCustomDraw = (NMLVCUSTOMDRAW*)pNMHDR;
// TODO: 在此添加控件通知处理程序代码
*pResult = CDRF_DODEFAULT;
if ( pNMLVCustomDraw->nmcd.dwDrawStage == CDDS_PREPAINT )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( pNMLVCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPREPAINT )
{
*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 == &quot;&quot; )
{
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;
}
}
void CMyListCtrl::OnKillFocus(CWnd* pNewWnd)
{
CListCtrl::OnKillFocus(pNewWnd);
// TODO: 在此处添加消息处理程序代码
CRect rect;
GetWindowRect(&rect);
CPoint point;
::GetCursorPos(&point);
if ( !rect.PtInRect(point) && GetParent()->GetFocus() != NULL )
{
m_iItem = -1;
m_iSubItem = -1;
m_bFocus = FALSE;
m_bHighLight = FALSE;
Invalidate();
}
}
void CMyListCtrl::OnSetFocus(CWnd* pOldWnd)
{
//CListCtrl::OnSetFocus(pOldWnd);
// TODO: 在此处添加消息处理程序代码
}

CItemEdit::CItemEdit()
{
}
CItemEdit::~CItemEdit()
{
}

BEGIN_MESSAGE_MAP(CItemEdit, CEdit)
ON_WM_WINDOWPOSCHANGING()
END_MESSAGE_MAP()

void CItemEdit::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
lpwndpos->x = m_iXPos;
CEdit::OnWindowPosChanging(lpwndpos);
}

源码是 ftd2013 网友写的,下载链接: http://download.iyunv.com/detail/ftd2013/5991065
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-141648-1-1.html 上篇帖子: ListView 的CUSTOMDRAW和LVS_OWNERDATA 下篇帖子: LVS的配置详解配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表