您的位置:首页 > 其它

为List Control控件添加可编辑功能

2014-11-26 09:17 417 查看
整体的思路,就是利用消息传输机制,继承CListCtrl类,然后添加OnLButtonDown、OnLButtonDblClk以及esc和回车键的消息响应

#if !defined(AFX_MYLISTCTRL_H__7FDA9396_E298_4F10_B778_EB8ADFD82F9A__INCLUDED_)
#define AFX_MYLISTCTRL_H__7FDA9396_E298_4F10_B778_EB8ADFD82F9A__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MyListCtrl.h : header file
//
#define IDC_MY_LIST_EDITBOX 0xffff

#define MLSM_ITEMCHANGED (WM_USER + 200)
/////////////////////////////////////////////////////////////////////////////
// CMyListCtrl window

class CMyListCtrl : public CListCtrl
{
// Construction
public:
CMyListCtrl();

// Attributes
public:
// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyListCtrl)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CMyListCtrl();

// Generated message map functions
protected:
CEdit m_EditItem;
int m_Row;
int m_Col;
//{{AFX_MSG(CMyListCtrl)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MYLISTCTRL_H__7FDA9396_E298_4F10_B778_EB8ADFD82F9A__INCLUDED_)


// MyListCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "MyListCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyListCtrl

CMyListCtrl::CMyListCtrl()
{
m_Col = m_Row = -1;
}

CMyListCtrl::~CMyListCtrl()
{
m_EditItem.DestroyWindow();
}

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CMyListCtrl)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyListCtrl message handlers

void CMyListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_EditItem.m_hWnd != NULL)
{
m_EditItem.ShowWindow(0);
if(m_Row != -1)
{
CString ItemText;
m_EditItem.GetWindowText(ItemText);
this->SetItemText(m_Row, m_Col, ItemText);
::PostMessage(GetParent()->m_hWnd, MLSM_ITEMCHANGED, (WPARAM)MAKELONG(m_Row, m_Col), (LPARAM)this->m_hWnd);
}
}
m_Col = m_Row = -1;
CListCtrl::OnLButtonDown(nFlags, point);
}

void CMyListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
LVHITTESTINFO hi;
hi.pt = point;

if(SubItemHitTest(&hi) != -1 )
{
m_Row = hi.iItem;
m_Col = hi.iSubItem;
if(m_EditItem.m_hWnd == NULL)
{
RECT rect;
rect.left = rect.top = 0;
rect.bottom = 20;
rect.right = 100;
m_EditItem.Create(WS_CHILD | ES_LEFT | WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN | ES_MULTILINE, rect, this, IDC_MY_LIST_EDITBOX);
m_EditItem.SetFont(this->GetFont(), FALSE);
}
CRect rect;
GetSubItemRect(hi.iItem, hi.iSubItem, LVIR_BOUNDS, rect);
m_EditItem.SetWindowText(this->GetItemText(hi.iItem, hi.iSubItem));
m_EditItem.MoveWindow(&rect, TRUE);
m_EditItem.ShowWindow(1);
}
CListCtrl::OnLButtonDblClk(nFlags, point);
}

BOOL CMyListCtrl::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
BOOL bHandledMsg = FALSE;

if(pMsg->hwnd == m_EditItem.m_hWnd)
{
switch (pMsg->message)
{
case WM_KEYDOWN:
{
switch (pMsg->wParam)
{
case VK_RETURN://回车
if(m_Row != -1)
{
CString ItemText;
m_EditItem.GetWindowText(ItemText);
this->SetItemText(m_Row, m_Col, ItemText);
::PostMessage(GetParent()->m_hWnd, MLSM_ITEMCHANGED, (WPARAM)MAKELONG(m_Row, m_Col), (LPARAM)this->m_hWnd);
}
case VK_ESCAPE://ESC键
m_EditItem.ShowWindow(0);
m_Col = m_Row = -1;
bHandledMsg = TRUE;
break;
default:
break;
}
}// case WM_KEYDOWN
break;
default:
break;
}// switch(pMsg->message)
}// if(pMsg->hwnd...
return (bHandledMsg ? TRUE : CListCtrl::PreTranslateMessage(pMsg));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐