自定义类CEditItem
头文件
#define EDIT_TYPE_DOUBLE 1
#define EDIT_TYPE_STRING 2
#define EDIT_TYPE_NBR16 3
#define EDIT_TYPE_NBR10 4
#define WM_EDIT_ITEM (WM_USER+0002)
class CEditItem : public CEdit
{
// Construction
public:
CEditItem();
CEditItem(int nItem, int nSubItem,int nDigitType = EDIT_TYPE_STRING)
{
m_nItem = nItem;
m_nSubItem = nSubItem;
m_nDigitType = nDigitType;
m_sTempText = "";
}
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CEditItem)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CEditItem();
// Generated message map functions
protected:
//{{AFX_MSG(CEditItem)
afx_msg void OnKillFocus(CWnd* pNewWnd);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int m_nItem;
int m_nSubItem;
int m_nDigitType;//数据类型
CString m_sTempText;//存储先前的内容
public:
void SetWindowText(CString strText);
源文件
CEditItem::CEditItem()
{
m_nItem = -1;
m_nSubItem = -1;
m_nDigitType = 0;
m_sTempText = "";
}
CEditItem::~CEditItem()
{
}
BEGIN_MESSAGE_MAP(CEditItem, CEdit)
//{{AFX_MSG_MAP(CEditItem)
ON_WM_KILLFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CEditItem message handlers
void CEditItem::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);
// TODO: Add your message handler code here
CString str = "";
CEdit::GetWindowText(str);
if(str.IsEmpty())
{
SetWindowText(m_sTempText);
}
GetParent()->SendMessage(WM_EDIT_ITEM,m_nItem,m_nSubItem);
}
BOOL CEditItem::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
{
CString str = "";
CEdit::GetWindowText(str);
if(str.IsEmpty())
{
SetWindowText(m_sTempText);
}
GetParent()->SendMessage(WM_EDIT_ITEM,m_nItem,m_nSubItem);
return true;
}
else if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
{
SetWindowText(m_sTempText);
GetParent()->SendMessage(WM_EDIT_ITEM,m_nItem,m_nSubItem);
return true;
}
else if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == 0x30 || pMsg->wParam == 0x31 || pMsg->wParam == 0x32
||pMsg->wParam == 0x33||pMsg->wParam == 0x34||pMsg->wParam == 0x35||pMsg->wParam == 0x36
||pMsg->wParam == 0x37||pMsg->wParam == 0x38||pMsg->wParam == 0x39 ))
{
}
else if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == 0x41 || pMsg->wParam == 0x42 || pMsg->wParam == 0x43
||pMsg->wParam == 0x44 || pMsg->wParam == 0x45 || pMsg->wParam == 0x46 ))
{
if((m_nDigitType == EDIT_TYPE_NBR10 ) || (m_nDigitType == EDIT_TYPE_DOUBLE ) )
{
return true;
}
}
else if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == 0xBD || pMsg->wParam == 0xBE ))
{
if(m_nDigitType == EDIT_TYPE_NBR16 )
{
return true;
}
}
else if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_NUMPAD0 || pMsg->wParam == VK_NUMPAD1 || pMsg->wParam == VK_NUMPAD2
||pMsg->wParam == VK_NUMPAD3||pMsg->wParam == VK_NUMPAD4||pMsg->wParam == VK_NUMPAD5||pMsg->wParam == VK_NUMPAD6
||pMsg->wParam == VK_NUMPAD7||pMsg->wParam == VK_NUMPAD8||pMsg->wParam == VK_NUMPAD9))
{
}
else if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_BACK || pMsg->wParam == VK_DELETE || pMsg->wParam == VK_LEFT
||pMsg->wParam == VK_RIGHT || pMsg->wParam == VK_UP || pMsg->wParam == VK_DOWN || pMsg->wParam == VK_SUBTRACT))
{}
else if(pMsg->message == WM_KEYDOWN)
{
if(m_nDigitType == EDIT_TYPE_NBR10 || m_nDigitType == EDIT_TYPE_NBR16)
{
return true;
}
if(m_nDigitType == EDIT_TYPE_DOUBLE)
{
if(pMsg->wParam == VK_DECIMAL)
{}
else
{
return true;
}
}
}
return CEdit::PreTranslateMessage(pMsg);
}
//获取控件之前内容
void CEditItem::SetWindowText(CString strText)
{
m_sTempText = strText;
CEdit::SetWindowText(strText);
}
自定义类CComboBoxItem
头文件
#define WM_COMBO_ITEM (WM_USER+0003)
class CComboBoxItem : public CComboBox
{
// Construction
public:
CComboBoxItem();
CComboBoxItem(int nItem, int nSubItem)
{
m_nItem = nItem;
m_nSubItem = nSubItem;
}
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CComboBoxItem)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CComboBoxItem();
// Generated message map functions
protected:
//{{AFX_MSG(CComboBoxItem)
afx_msg void OnKillFocus(CWnd* pNewWnd);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int m_nItem;
int m_nSubItem;
};
源文件
CComboBoxItem::CComboBoxItem()
{
m_nItem = -1;
m_nSubItem = -1;
}
CComboBoxItem::~CComboBoxItem()
{
}
BEGIN_MESSAGE_MAP(CComboBoxItem, CComboBox)
//{{AFX_MSG_MAP(CComboBoxItem)
ON_WM_KILLFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CComboBoxItem message handlers
void CComboBoxItem::OnKillFocus(CWnd* pNewWnd)
{
CComboBox::OnKillFocus(pNewWnd);
// TODO: Add your message handler code here
GetParent()->SendMessage(WM_COMBO_ITEM,m_nItem,m_nSubItem);
}
控件控制类CMyListCtrl
头文件
#include "EditItem.h"
#include "ComboBoxItem.h"
/
// CMyListCtrl window
class CMyListCtrl : public CListCtrl
{
// Construction
public:
CMyListCtrl();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyListCtrl)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMyListCtrl();
// Generated message map functions
protected:
//{{AFX_MSG(CMyListCtrl)
afx_msg void OnEditItem(WPARAM wParam, LPARAM lParam);
afx_msg void OnComboItem(WPARAM wParam, LPARAM lParam);
afx_msg void OnDblclk(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
CComboBoxItem *m_pCombo;
CEditItem *m_pEdit;
};
源文件
CMyListCtrl::CMyListCtrl()
{
m_pEdit = NULL;
m_pCombo = NULL;
}
CMyListCtrl::~CMyListCtrl()
{
}
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CMyListCtrl)
ON_MESSAGE(WM_EDIT_ITEM,OnEditItem)
ON_MESSAGE(WM_COMBO_ITEM,OnComboItem)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CMyListCtrl message handlers
void CMyListCtrl::OnEditItem(WPARAM wParam, LPARAM lParam)
{
CString strText = "";
if(m_pEdit)
{
m_pEdit->GetWindowText(strText);
m_pEdit->PostMessage(WM_CLOSE);
delete m_pEdit;
m_pEdit = NULL;
}
else
{
return;
}
int nItem = int(wParam);
int nSubItem = int(lParam);
SetItemText(nItem,nSubItem,strText);
}
void CMyListCtrl::OnComboItem(WPARAM wParam, LPARAM lParam)
{
CString strText = "";
if(m_pCombo)
{
m_pCombo->GetWindowText(strText);
m_pCombo->PostMessage(WM_CLOSE);
delete m_pCombo;
m_pCombo = NULL;
}
else
{
return;
}
int nItem = int(wParam);
int nSubItem = int(lParam);
SetItemText(nItem,nSubItem,strText);
}
void CMyListCtrl::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if( -1 == pNMListView->iItem)
{
*pResult = 0;
return;
}
int nItem = pNMListView->iItem;
int nSubItem = pNMListView->iSubItem;
CString strText = GetItemText(nItem,nSubItem);
CRect rect( 0,0,1,1 );
GetSubItemRect(nItem, nSubItem,LVIR_BOUNDS , rect);
if(2 == nSubItem)//combo
{
if(m_pCombo)
{
m_pCombo->PostMessage(WM_CLOSE);
delete m_pCombo;
m_pCombo = NULL;
}
rect.bottom += 300;
m_pCombo = new CComboBoxItem(nItem, nSubItem);
DWORD dwStyle = ES_LEFT;
dwStyle |= WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | WS_VSCROLL;
m_pCombo->Create(dwStyle, rect, this, 122);
m_pCombo->ResetContent();
m_pCombo->AddString("boy");
m_pCombo->AddString("girl");
m_pCombo->SelectString(-1,strText);
m_pCombo->ShowDropDown();
m_pCombo->SetFocus();
}
else if(1 == nSubItem)//edit
{
if(m_pEdit)
{
m_pEdit->PostMessage(WM_CLOSE);
delete m_pEdit;
m_pEdit = NULL;
}
m_pEdit = new CEditItem(nItem, nSubItem);
DWORD dwStyle = ES_LEFT;
dwStyle |= WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL;
m_pEdit->Create(dwStyle,rect,this,121);
m_pEdit->SetWindowText(strText);
m_pEdit->SetFocus();
m_pEdit->SetSel(0,-1);
}
else
{
if(0 == nSubItem)
{
rect.right = rect.left + GetColumnWidth(0);
}
}
*pResult = 0;
}
对话框调用方法
头文件
#include "MyListCtrl.h"
/
// CListEditDlg dialog
class CListEditDlg : public CDialog
{
// Construction
public:
CListEditDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CListEditDlg)
enum { IDD = IDD_LISTEDIT_DIALOG };
CMyListCtrl m_list1;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CListEditDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CListEditDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
void SetListInit();
};
源文件
void CListEditDlg::SetListInit()
{
//属性设置
m_list1.ModifyStyle(LVS_TYPEMASK,LVS_REPORT&LVS_TYPEMASK|LVS_SINGLESEL);
DWORD dwStyle = m_list1.GetExtendedStyle();
m_list1.SetExtendedStyle(dwStyle|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
//设置行宽
CImageList image;
image.Create(1,30,ILC_COLOR24|ILC_MASK,4,0);
m_list1.SetImageList(&image,LVSIL_SMALL);
//设置字体和大小
CFont font;
font.CreateFont(16,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"宋体");
m_list1.SetFont(&font);
m_list1.GetHeaderCtrl()->SetFont(&font);
//设置标题头
m_list1.InsertColumn(0,"序号",LVCFMT_LEFT,80,0);
m_list1.InsertColumn(1,"姓名",LVCFMT_LEFT,120,0);
m_list1.InsertColumn(2,"性别",LVCFMT_LEFT,80,0);
//设置内容
m_list1.InsertItem(0,"001");
m_list1.SetItemText(0,1,"小明");
m_list1.SetItemText(0,2,"boy");
m_list1.InsertItem(1,"002");
m_list1.SetItemText(1,1,"小红");
m_list1.SetItemText(1,2,"gril");
m_list1.InsertItem(2,"003");
m_list1.SetItemText(2,1,"小华");
m_list1.SetItemText(2,2,"boy");
}
运行效果
双击姓名栏
双击性别栏