這裡涉及到MFC控件開發許多知識點:
消息響應,視窗繪制,根據滑鼠點選位置取得行列資訊。
<a></a>
/********************************************/
/* EditListCtrl.h */
/* 可編輯ListCtrl */
#pragma once
#include "afxcmn.h"
#include "ListCtrlEdit.h"
// 大氣象:定義一個ID
#define IDC_EDIT 1001
class CEditListCtrl :public CListCtrl
{
// 大氣象:聲明動态運作時CRuntimeClass
DECLARE_DYNAMIC(CEditListCtrl)
// 大氣象 2012-11-16 ↓
public:
int nItem; // 行
int nSubItem; // 列
CListCtrlEdit m_Edit;
void ShowEdit(bool bShow, int nItem, int nSubItem, CRect rcCtrl);
DECLARE_MESSAGE_MAP()
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg LRESULT OnEditEnd(WPARAM wParam,LPARAM lParam = FALSE);
// 大氣象 2012-11-16 ↑
CEditListCtrl(void);
~CEditListCtrl(void);
};
/***********************************************/
/* EditListCtrl.cpp */
#include "StdAfx.h"
#include "EditListCtrl.h"
// 大氣象:确定運作時對象
IMPLEMENT_DYNAMIC(CEditListCtrl,CListCtrl)
// 大氣象 2012-11-16 ↓
BEGIN_MESSAGE_MAP(CEditListCtrl, CListCtrl)
ON_WM_LBUTTONDBLCLK() // 可以切換到類視圖,右擊屬性生成。
ON_MESSAGE(WM_USER_EDIT_END,CEditListCtrl::OnEditEnd)
END_MESSAGE_MAP()
void CEditListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
// 大氣象:取得行列資訊的固定方法
LVHITTESTINFO lvhti; // 大氣象:儲存ListCtrl行列資訊的結構
lvhti.pt = point;
nItem = CListCtrl::SubItemHitTest(&lvhti);
if (nItem == -1) return;
nSubItem = lvhti.iSubItem;
CRect rect;
CListCtrl::GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rect);
ShowEdit(TRUE,nItem,nSubItem,rect);
CListCtrl::OnLButtonDblClk(nFlags, point);
}
void CEditListCtrl::ShowEdit(bool bShow, int nItem, int nSubItem, CRect rcCtrl)
if (m_Edit.m_hWnd == NULL)
{
m_Edit.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,IDC_EDIT);
m_Edit.ShowWindow(SW_HIDE);
CFont tpFont;
tpFont.CreateStockObject(DEFAULT_GUI_FONT);
m_Edit.SetFont(&tpFont);
tpFont.DeleteObject();
}
if (bShow == TRUE)
CString strItem = CListCtrl::GetItemText(nItem,nSubItem);
rcCtrl.top -= 2; // 大氣象:防止上邊框被遮擋
m_Edit.MoveWindow(&rcCtrl);
m_Edit.ShowWindow(SW_SHOW);
m_Edit.SetWindowText(strItem);
m_Edit.SetFocus();
m_Edit.SetSel(-1);
else
LRESULT CEditListCtrl::OnEditEnd(WPARAM wParam,LPARAM lParam)
CString strText;
m_Edit.GetWindowText(strText);
CListCtrl::SetItemText(nItem,nSubItem,strText);
m_Edit.ShowWindow(SW_HIDE);
return 0;
// 大氣象 2012-11-16 ↑
CEditListCtrl::CEditListCtrl(void)
CEditListCtrl::~CEditListCtrl(void)
/* ListCtrlEdit.h */
/* 編輯框子視窗 */
#include "afxwin.h"
// 大氣象:自定義編輯結束消息
#define WM_USER_EDIT_END WM_USER + 1001
class CListCtrlEdit : public CEdit
DECLARE_DYNAMIC(CListCtrlEdit)
// 大氣象:控件中消息定義,需要以CWnd為參數
afx_msg void OnKillFocus(CWnd* pNewWnd);
CListCtrlEdit(void);
~CListCtrlEdit(void);
/**********************************************/
/* ListCtrlEdit.cpp */
IMPLEMENT_DYNAMIC(CListCtrlEdit,CEdit)
BEGIN_MESSAGE_MAP(CListCtrlEdit, CEdit)
ON_WM_KILLFOCUS()// 大氣象:與對話框中控件消息映射定義不同。
void CListCtrlEdit::OnKillFocus(CWnd* pNewWnd)
CEdit::OnKillFocus(pNewWnd);
// 大氣象:向父視窗發消息
CWnd* pParent = this->GetParent();
::PostMessage(pParent->GetSafeHwnd(),WM_USER_EDIT_END,0,0);
CListCtrlEdit::CListCtrlEdit(void)
CListCtrlEdit::~CListCtrlEdit(void)
使用:
m_editList.InsertColumn(0,"ID",LVCFMT_LEFT,50);
m_editList.InsertColumn(1,"NAME",LVCFMT_LEFT,100);
m_editList.InsertItem(0,"001");
m_editList.SetItemText(0,1,"大氣象");
m_editList.InsertItem(1,"002");
m_editList.SetItemText(1,1,"小氣象");
新手需要源碼留下郵箱。
還留下兩個問題:
1.設定行高。
2.設定最後一列寬度自适應。codeproject上好像有個源碼。
錯誤資訊:
IntelliSense: #error 指令: Please use the /MD switch for _AFXDLL builds
修改如下設定:工程(Project)->屬性(Properties)->
配置屬性(Configuration Properties)->c/c++->
代碼生成(Code Generation)->運作時庫(Use run-time library)->
多線程調試DLL(/MDd)(Multithreaded DLL/Debug Multithreaded DLL)
這裡我修改為/MD就好了。
本文轉自wenglabs部落格園部落格,原文連結:http://www.cnblogs.com/greatverve/archive/2012/11/18/CEditListCtrl.html,如需轉載請自行聯系原作者