MFC下,提供了List Control控件,当选择Report模式时,可以方便的做数据报表之类的应用。类似下图:

但是有个不大不小的问题是,当List Control选择可编辑模式时,只有每一行的第一列的单元格才能编辑,而且在默认情况下,当选中的时候,也只有被选中的这一行的第一个单元格才会反色显示~~这未免太BT了~
在网上找了一些相关的帖子,解决整行选中的问题可以采用为List Control控件增加LVS_EX_FULLROWSELECT样式的方法来实现:
m_Result.SetExtendedStyle(m_Result.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_TWOCLICKACTIVATE);
上面的代码中,LVS_EX_GRIDLINES是希望显示网格;LVS_EX_FULLROWSELECT是希望被选中时整行反色显 示;LVS_EX_HEADERDRAGDROP是让其支持点击表头排序;LVS_EX_TWOCLICKACTIVATE是希望有鼠标在未被选中的行上 移动的时候有一些效果~
整行选中的效果算是搞定了,接下来做任意单元格的编辑~
MFC的List Control控件本身是没有办法达到这个目的了,那怎么办呢?一个比较简单的方法是:虚拟出来一个编辑框,覆盖到被编辑的单元格上 :-)
所以,接下来的工作就是,基于CListCtrl类创建一个自己的ListCtrl类,并重载它的鼠标点击事件处理函数,以便判断用户需要修改的单元格,并动态显示或隐藏一个文本框,用来表示需要编译的单元格~
首先创建自己的类:
|
1 #if !defined(AFX_MYLISTCTRL_H__7FDA9396_E298_4F10_B778_EB8ADFD82F9A__INCLUDED_)2 #define AFX_MYLISTCTRL_H__7FDA9396_E298_4F10_B778_EB8ADFD82F9A__INCLUDED_3 ![]() 4 #if _MSC_VER > 10005 #pragma once6 #endif // _MSC_VER > 10007 // MyListCtrl.h : header file8 //9 #define IDC_MY_LIST_EDITBOX 0xffff10 ![]() 11 #define MLSM_ITEMCHANGED (WM_USER + 200)12 ![]() /**//////////////////////////////////////////////////////////////////////////////13 // CMyListCtrl window14 ![]() 15 class CMyListCtrl : public CListCtrl16 ![]() ![]() {
17 // Construction18 public:19 CMyListCtrl();20 ![]() 21 // Attributes22 public:23 // Operations24 public:25 ![]() 26 // Overrides27 // ClassWizard&nbs
|

本文介绍如何在MFC的List Control中实现可编辑的任意单元格功能。通过添加LVS_EX_FULLROWSELECT样式实现整行选中,然后通过重载CListCtrl类的鼠标点击事件,动态显示编辑框覆盖在被编辑单元格上,从而达到编辑效果。详细讲述了OnLButtonDown、OnLButtonDblClk和PreTranslateMessage等关键函数的实现。
#if !defined(AFX_MYLISTCTRL_H__7FDA9396_E298_4F10_B778_EB8ADFD82F9A__INCLUDED_)


// Construction
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



