社区
界面
帖子详情
MFC 可编辑的表格控件
ZDL20092009
2010-10-29 05:26:00
请问一下各位大侠,有什么比较好用的表格控件推荐一下,要能够接受输入的!用MSFlexGrid控件是只读的
...全文
1007
8
打赏
收藏
MFC 可编辑的表格控件
请问一下各位大侠,有什么比较好用的表格控件推荐一下,要能够接受输入的!用MSFlexGrid控件是只读的
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ZDL20092009
2010-10-30
打赏
举报
回复
多谢各位!用CGridCtrl已经解决了,确实挺好用的!
BinboWang1987
2010-10-30
打赏
举报
回复
在CodeProject上有一个MFC GridCtrl控件,楼主可以去看看
ZDL20092009
2010-10-29
打赏
举报
回复
是那种可以设置多少列和多少行的,而且可以在程序里面动态设置行列数,接收输入且能够方便访问
Eleven
2010-10-29
打赏
举报
回复
[Quote=引用楼主 zdl20092009 的回复:]
请问一下各位大侠,有什么比较好用的表格控件推荐一下,要能够接受输入的!用MSFlexGrid控件是只读的
[/Quote]
codeproject上去搜索一下CListCtrl,自绘的,很多的
izardMan
2010-10-29
打赏
举报
回复
// EditListCtrl.cpp : implementation file
//
#include "stdafx.h"
//#include "CEditListCtrl.h"
#include "EditListCtrl.h"
#include <windowsx.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IDC_EDIT 0X01
#define PROPERTY_ITEM 0x02
#define PROPERTY_SUB 0x03
/////////////////////////////////////////////////////////////////////////////
// CEditListCtrl
CEditListCtrl::CEditListCtrl()
{
m_edit.m_hWnd = NULL;
}
CEditListCtrl::~CEditListCtrl()
{
}
BEGIN_MESSAGE_MAP(CEditListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CEditListCtrl)
ON_WM_LBUTTONDBLCLK()
ON_WM_PARENTNOTIFY()
//}}AFX_MSG_MAP
// ON_MESSAGE(WM_USER_EDIT_END,OnEditEnd)
END_MESSAGE_MAP()
void CEditListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CRect rcCtrl;
LVHITTESTINFO lvhti;
lvhti.pt = point;
int nItem = CListCtrl::SubItemHitTest(&lvhti);
if(nItem == -1)
return;
int nSubItem = lvhti.iSubItem;
CListCtrl::GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rcCtrl);
ShowEdit(TRUE,nItem,nSubItem,rcCtrl);
CListCtrl::OnLButtonDblClk(nFlags, point);
}
void CEditListCtrl::ShowEdit(BOOL bShow,int nItem,int nIndex,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,nIndex);
m_edit.MoveWindow(rcCtrl);
m_edit.ShowWindow(SW_SHOW);
m_edit.SetWindowText(strItem);
::SetFocus(m_edit.GetSafeHwnd());
m_edit.SetSel(-1);
m_edit.SetCtrlData(MAKEWPARAM(nIndex,nItem));
}
else
m_edit.ShowWindow(SW_HIDE);
}
void CEditListCtrl::OnEditEnd(WPARAM wParam,LPARAM lParam)
{
if(wParam == TRUE)
{
CString strText(_T(""));
m_edit.GetWindowText(strText);
DWORD dwData = m_edit.GetCtrlData();
int nItem= dwData>>16;
int nIndex = dwData&0x0000ffff;
CListCtrl::SetItemText(nItem,nIndex,strText);
}
else
{
}
if(lParam == FALSE)
m_edit.ShowWindow(SW_HIDE);
}
void CEditListCtrl::OnParentNotify(UINT message, LPARAM lParam)
{
CListCtrl::OnParentNotify(message, lParam);
//////////////////////////////////////////////////////////////////////////
CHeaderCtrl* pHeaderCtrl = CListCtrl::GetHeaderCtrl();
if(pHeaderCtrl == NULL)
return;
CRect rcHeader;
pHeaderCtrl->GetWindowRect(rcHeader);
ScreenToClient(rcHeader);
//The x coordinate is in the low-order word and the y coordinate is in the high-order word.
CPoint pt;
pt.x = GET_X_LPARAM(lParam);
pt.y = GET_Y_LPARAM(lParam);
if(rcHeader.PtInRect(pt) && message == WM_LBUTTONDOWN)
{
if(m_edit.m_hWnd != NULL)
{
DWORD dwStyle = m_edit.GetStyle();
if((dwStyle&WS_VISIBLE) == WS_VISIBLE)
{
m_edit.ShowWindow(SW_HIDE);
}
}
}
}
BOOL CEditListCtrl::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam == VK_TAB && m_edit.m_hWnd!= NULL)
{
DWORD dwStyle = m_edit.GetStyle();
if((dwStyle&WS_VISIBLE) == WS_VISIBLE)
{
OnEditEnd(TRUE,TRUE);
CRect rcCtrl;
int nItem;
int nSub;
if(FALSE == Key_Ctrl(nItem,nSub))
Key_Shift(nItem,nSub);
CListCtrl::GetSubItemRect(nItem,nSub,LVIR_LABEL,rcCtrl);
CPoint pt(rcCtrl.left+1,rcCtrl.top+1);
OnLButtonDblClk(0,pt);
POSITION pos = CListCtrl::GetFirstSelectedItemPosition();
if (pos == NULL)
{
}
else
{
while (pos)
{
int ntpItem = CListCtrl::GetNextSelectedItem(pos);
CListCtrl::SetItemState(ntpItem,0,LVIS_SELECTED);
}
}
CListCtrl::SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
return TRUE;
}
}
}
return CListCtrl::PreTranslateMessage(pMsg);
}
BOOL CEditListCtrl::Key_Shift(int& nItem,int& nSub)
{
int nItemCount = CListCtrl::GetItemCount();
DWORD dwData = m_edit.GetCtrlData();
nItem= dwData>>16;
nSub = dwData&0x0000ffff;
CHeaderCtrl* pHeader = CListCtrl::GetHeaderCtrl();
if(pHeader == NULL)
return FALSE;
short sRet = GetKeyState(VK_SHIFT);
int nSubcCount = pHeader->GetItemCount();
sRet = sRet >>15;
if(sRet == 0)
{
nSub += 1;
if(nSub >= nSubcCount)
{
if(nItem == nItemCount-1)
{
nItem = 0;
nSub = 0;
}
else
{
nSub = 0;
nItem += 1;
}
}
if(nItem >= nItemCount)
nItem = nItemCount-1;
return FALSE;
}
else
{
nSub -= 1;
if(nSub < 0)
{
nSub = nSubcCount -1;
nItem --;
}
if(nItem < 0)
nItem = nItemCount-1;
return TRUE;
}
return FALSE;
}
BOOL CEditListCtrl::Key_Ctrl(int& nItem,int &nSub)
{
short sRet = GetKeyState(VK_CONTROL);
DWORD dwData = m_edit.GetCtrlData();
nItem= dwData>>16;
nSub = dwData&0x0000ffff;
sRet = sRet >>15;
int nItemCount = CListCtrl::GetItemCount();
if(sRet == 0)
{
}
else
{
nItem = nItem >=nItemCount-1? 0:nItem+=1;
return TRUE;
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
CListCtrlEdit::CListCtrlEdit()
{
}
CListCtrlEdit::~CListCtrlEdit()
{
}
BEGIN_MESSAGE_MAP(CListCtrlEdit, CEdit)
//{{AFX_MSG_MAP(CListCtrlEdit)
ON_WM_KILLFOCUS()
ON_WM_SETFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListCtrlEdit message handlers
void CListCtrlEdit::SetCtrlData(DWORD dwData)
{
m_dwData = dwData;
}
DWORD CListCtrlEdit::GetCtrlData()
{
return m_dwData;
}
void CListCtrlEdit::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);
CWnd* pParent = this->GetParent();
::PostMessage(pParent->GetSafeHwnd(),WM_USER_EDIT_END,m_bExchange,0);
}
BOOL CListCtrlEdit::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam == VK_RETURN)
{
CWnd* pParent = this->GetParent();
m_bExchange = TRUE;
::PostMessage(pParent->GetSafeHwnd(),WM_USER_EDIT_END,m_bExchange,0);
}
else if(pMsg->wParam == VK_ESCAPE)
{
CWnd* pParent = this->GetParent();
m_bExchange = FALSE;
::PostMessage(pParent->GetSafeHwnd(),WM_USER_EDIT_END,m_bExchange,0);
}
}
return CEdit::PreTranslateMessage(pMsg);
}
void CListCtrlEdit::OnSetFocus(CWnd* pOldWnd)
{
CEdit::OnSetFocus(pOldWnd);
m_bExchange = TRUE;
}
izardMan
2010-10-29
打赏
举报
回复
#if !defined(AFX_EDITLISTCTRL_H__B26FE6EC_7377_4DA6_BEC1_E3C656DACFB8__INCLUDED_)
#define AFX_EDITLISTCTRL_H__B26FE6EC_7377_4DA6_BEC1_E3C656DACFB8__INCLUDED_
//
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// EditListCtrl.h : header file
//
#define WM_USER_EDIT_END WM_USER+1001
class CListCtrlEdit : public CEdit
{
// Construction
public:
CListCtrlEdit();
// Attributes
public:
void SetCtrlData(DWORD dwData);
DWORD GetCtrlData();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CListCtrlEdit)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CListCtrlEdit();
// Generated message map functions
protected:
//{{AFX_MSG(CListCtrlEdit)
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnSetFocus(CWnd* pOldWnd);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
DWORD m_dwData;
BOOL m_bExchange;
};
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class CEditListCtrl : public CListCtrl
{
// Construction
public:
CEditListCtrl();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CEditListCtrl)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CEditListCtrl();
// Generated message map functions
protected:
//{{AFX_MSG(CEditListCtrl)
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnParentNotify(UINT message, LPARAM lParam);
//}}AFX_MSG
afx_msg void OnEditEnd(WPARAM ,LPARAM lParam = FALSE);
DECLARE_MESSAGE_MAP()
private:
void ShowEdit(BOOL bShow,int nItem,int nIndex,CRect rc = CRect(0,0,0,0));
CListCtrlEdit m_edit;
int m_nItem;
int m_nSub;
BOOL Key_Shift(int& nItem,int& nSub);
BOOL Key_Ctrl(int& nItem,int &nSub);
};
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_EDITLISTCTRL_H__B26FE6EC_7377_4DA6_BEC1_E3C656DACFB8__INCLUDED_)
izardMan
2010-10-29
打赏
举报
回复
派生下listctrl或者用griddata
zzz_zou
2010-10-29
打赏
举报
回复
listctrl
深入解析CGridCtrl:打造可
编辑
高性能的
MFC
表格
控件
表格
控件
在桌面UI开发中承担数据展示与交互的核心职能,其底层实现直接影响产品体验与开发效率。CGridCtrl作为一套基于CWnd自绘的
MFC
网格组件,通过内置单元格状态管理和消息反射机制,实现了类似Excel的
编辑
、排序与虚拟化能力。围绕
控件
与数据同步模型,使用SetItemText完成基础数据填充,借助SetVirtualMode应对十万级数据行,再配合性能基准测试与故障速查,可有效规避自绘与消息处理中的典型陷阱。无论你是维护传统C++桌面程序,还是计划重构列表视图,这套从demo调试到工程落地的实践思
做一个可
编辑
的
表格
控件
【实现内容】做一个可
编辑
的
表格
控件
。【使用
控件
】一个MSFLEXGRID
表格
控件
,一个文本
控件
,一个下拉列表
控件
。【实现原理】我喜欢把这个方法称为视觉假象。由于MSFLEXGRID
控件
本身是不支持直接
编辑
的。所以需要结合文本
控件
或者下拉列表
控件
,使
表格
控件
的运行效果如同可以直接
编辑
一样。【实现步骤】1. 当鼠标点击
表格
控件
的某一格时,首先判断该列的属性,是直接
编辑
呢,还是用下拉列表进行选择。
【
MFC
笔记】GridCtrl
表格
控件
的使用
1、新建一个对话框形式的
MFC
程序,将百度网盘保存的“GridCtrl”文件保存到源代码目录下。 网址https://www.codeproject.com/Articles/8/
MFC
-Grid-control 2、将整个文件夹放到工程目录所在的文件夹下,所有内容添加到资源管理器。在对话框XXX.h文件中添加头文件 3、从工具箱拉一个Custom Control
控件
,确定位置。 ...
MFC
实战:CListCtrl
表格
可
编辑
完整实现与踩坑指南
表格
控件
是桌面应用开发中不可或缺的交互组件,
MFC
中的CListCtrl虽然功能丰富,但默认不支持单元格内容
编辑
,常需开发者自行实现就地
编辑
能力。其核心原理是子类化列表
控件
,在双击单元格时临时创建CEdit
编辑
框覆盖于目标区域,通过消息映射处理回车、失焦等事件,最终将文本写回
表格
。这种方案无需引入第三方库,代码可控性强,可灵活扩展下拉框、日期
控件
等。广泛应用于工具软件配置界面、数据管理窗口等场景,能显著提升数据录入效率。本文基于实际项目经验,完整解析实现步骤与常见问题,帮助开发者快速落地。
园区如何精准服务企业创新需求提升招商效率?.docx
园区如何精准服务企业创新需求提升招商效率?
界面
15,976
社区成员
115,866
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章