x.闷

MFC-ListCtrl 可编辑重写

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

MFC-ListCtrl 可编辑重写 - ″x.闷、 - 半边天

 

但是有个不大不小的问题是,当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类,并重载它的鼠标点击事件处理函数,以便判断用户需要修改的单元格,并动态显示或隐藏一个文本框,用来表示需要编译的单元格~

首先创建自己的类:

 

Code

 其中需要重载或定义的关键的几个成员:

 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);

virtual BOOL PreTranslateMessage(MSG* pMsg);

m_EditItem是用来做编辑动作的文本框;

m_Row和m_Col用来标识需要编辑的单元格,以便在不同的成员函数之间传递;

OnLButtonDown用来处理鼠标左键单击事件;

OnLButtonDblClk用来处理鼠标左键双击事件;

PreTrahslateMessage函数用来截获按键事件,主要用来截获回车和ESC键,表示在编辑过程中确认修改或者取消修改

 

在鼠标左键双击事件中,主要的任务是需要判断被双击的单元格,如果单元格有效,则需要进入编辑模式,并显示文本框用来响应用户的输入,代码如下:

 

Code

 

在鼠标单击事件中,我们需要判断用户单击的是不是其他的单元格,如果是,表示用户希望退出编辑模式了,此时,需要保存编辑之后的文本:

Code

在PreTranslateMessage函数中,需要截获按键时间中的回车键和ESC键,并保存或取消编辑:

Code

OK,一个可以支持编辑的List Control控件就制作完成了,试试吧 :-)

posted on 2009-08-20 12:28  x.闷  阅读(5953)  评论(1编辑  收藏  举报