MFC 的List Control控件实现可编辑

所谓 List Contro l,就是用来做LIist的,至于编辑,估计MS也没提供这个功能。比较诡异的是在给 List Control 设置属性的时候居然看到 Edit Label ,处于好奇点了点,发现只能修改第一列,改了之后失去焦点又变 回原来的文本。没有深入试下去,我估计可以修改第一列的数据。
其实要实现编辑功能,只要做一个 Edit Control 就可以了,当需要编辑的时候,把这个 Edit Control 动态显示到需要显示的地方。看效果图:
双击输入框:


输入完成,点击空白处:

在这里,响应List Control的双击事件:

代码
1  void  CAddInstanceDlg::OnNMDblclkList3(NMHDR  * pNMHDR, LRESULT  * pResult)
 2  {
 3      LPNMITEMACTIVATE pNMItemActivate  =  reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR);
 4  
 5      LVHITTESTINFO info;
 6      info.pt  =  pNMItemActivate -> ptAction;
 7  
 8       if (listControl.SubItemHitTest( & info)  !=   - 1  )
 9      {
10          hitRow  =  info.iItem;
11          hitCol  =  info.iSubItem; 

12           if (editItem.m_hWnd  ==  NULL) // editItem为一输入框控件, 
13          {
14              RECT rect;
15              rect.left  =   0 ;
16              rect.top  =   0 ;
17              rect.bottom  =   15 ;
18              rect.right  =   200 ;
19              editItem .Create(WS_CHILD  |  ES_LEFT  |  WS_BORDER  |  ES_AUTOHSCROLL  |  ES_WANTRETURN  |  ES_MULTILINE, rect,  this ,  101 );
20              editItem.SetFont( this -> GetFont(), FALSE);
21          }
22          CRect rect;
23          listControl.GetSubItemRect(info.iItem, info.iSubItem, LVIR_BOUNDS, rect);
24          rect.top  +=   12 ;
25          rect.left  +=   13 ;
26          rect.right  +=   13 ;
27          rect.bottom  +=   12 ;
28  
29          editItem.SetWindowText(listControl.GetItemText( info .iItem,  info .iSubItem));
30          editItem.MoveWindow( & rect, TRUE);
31          editItem.ShowWindow( 1 );
32          editItem.SetFocus();
33      }
34       * pResult  =   0 ;
35  } 

这里比较诡异的是我用Visual Studio 2008自动生成的事件响应函数的第一行居然出错,google之后第一个就是微软关于这个自动生成代码错误的修正。
在这个代码里面先得到鼠标双击的位置,判断是否击中了单元格,击中就调用 Edit Control ,大小就是选中的单元 格, 至于为什么rect要+12啊+13什么的,那是因为他出来的输入框跟单元格没对齐,导致很丑,这里可以根据自己的界面进行调整。最后再给这个 Edit Control 一 个焦点,就可以直接输入了。
另外,为了能使输入之后有所反应,我们还要做一个鼠标的单击事件响应函数。
 
 void  CAddInstanceDlg::OnNMClickList3(NMHDR  * pNMHDR, LRESULT  * pResult)
 2  {
 3      LPNMITEMACTIVATE pNMItemActivate  =  reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR);
 4  
 5       if (editItem.m_hWnd  !=  NULL)
 6      {
 7          editItem.ShowWindow( 0 );
 8           if (hitRow  !=   - 1 )
 9          {
10              CString text;
11              editItem.GetWindowText(text);
12              listControl.SetItemText(hitRow, hitCol, text);
13          }
14      }
15       hitCol  =  hitRow  =   - 1 ;
16       * pResult  =   0 ;
17  } 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC ListControl控件的颜色可以通过以下方法进行设置: 1. 设置整个ListControl的背景颜色: 可以使用CListCtrl类的SetBkColor()函数来设置ListControl的背景颜色,例如: m_ListCtrl.SetBkColor(RGB(255, 255, 255)); // 设置背景颜色为白色 2. 设置ListControl某一行或某一的颜色: 可以使用CListCtrl类的SetItem()函数来设置ListControl某一行或某一的颜色,例如: m_ListCtrl.SetItem(, , LVIF_TEXT | LVIF_STATE, _T("第一行第一"), , , , , LVIS_SELECTED, LVIS_SELECTED); // 设置第一行第一的文本和选状态 m_ListCtrl.SetItemText(, 1, _T("第一行第二")); // 设置第一行第二的文本 m_ListCtrl.SetItemState(, LVIS_SELECTED, LVIS_SELECTED); // 设置第一行选状态 m_ListCtrl.SetItemData(, (DWORD_PTR)&m_Data); // 设置第一行的数据 可以在SetItem()函数设置LVITEM结构体的iItem、iSubItem、pszText、state、stateMask等参数来设置行或的颜色和状态。 3. 设置ListControl某一单元格的颜色: 可以使用CListCtrl类的SetCell()函数来设置ListControl某一单元格的颜色,例如: m_ListCtrl.SetCell(, , RGB(255, , ), RGB(255, 255, 255)); // 设置第一行第一的前景色为红色,背景色为白色 可以在SetCell()函数设置行、、前景色和背景色等参数来设置单元格的颜色。 以上是MFC ListControl控件颜色设置的一些方法,希望能对您有所帮助。 ### 回答2: MFC ListControl 控件是非常常用的控件之一,可以用于展示大量数据。在使用 ListControl 控件的过程,我们可能会遇到需要修改控件颜色的需求。下面就来介绍一下 MFC ListControl 控件的颜色设置方法。 MFC ListControl 控件的颜色可以通过属性编辑器或代码进行设置。在属性编辑,我们可以找到相应的属性(如:Background Color、Text Color、Selected Text Color、Selected Background Color 等),并通过改变相应的属性值来修改控件的颜色。同样地,在代码,我们也可以通过修改相应的控件属性值来实现控件颜色的修改。例如: // 获取 ListControl 控件指针 CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_CONTROL); // 设置控件的背景色 pListCtrl->SetBkColor(RGB(255, 0, 0)); // 设置控件文本颜色 pListCtrl->SetTextColor(RGB(0, 255, 0)); // 设置选行的背景色和文本颜色 pListCtrl->SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); pListCtrl->SetSelectionMark(0); pListCtrl->SetItemState(0, LVIS_SELECTED, LVIS_SELECTED); 以上代码,通过调用 SetBkColor() 函数和 SetTextColor() 函数分别对控件的背景色和文本颜色进行设置。同时,代码也演示了如何设置选行的背景色和文本颜色。需要注意的是,当设置控件的颜色时,如果控件已经被创建,需要先调用控件的 RedrawItems() 函数进行重绘操作,否则,新设置的颜色可能不会立即生效。 总之,MFC ListControl 控件是非常强大的控件之一,灵活的颜色设置能够更好地满足各种需求,开发者需要注意控件的颜色设置时需要先重绘才会生效。 ### 回答3: MFC ListControl控件MFC非常常用的控件之一,它可以用于显示表、图形视图等。在使用ListControl控件时,有时候需要对的某些行或进行颜色的设置以达到更好的视觉效果。下面我们来了解一下MFC ListControl控件的颜色设置。 MFC ListControl控件的背景颜色是由ListControl的背景色和父窗口的背景色共同决定的。用户可以在资源编辑或运行时使用CListCtrl类的SetBackgroundColor()函数来设置ListControl的背景颜色。 MFC ListControl控件的前景颜色是由用户在添加数据时指定的。在使用CListCtrl类的InsertItem()函数添加行的时候,可以指定该行的前景颜色和背景颜色;在使用CListCtrl类的SetItemText()函数设置的时候,也可以指定该的前景颜色和背景颜色。 如果需要动态地设置某一行或某一的颜色,可以使用CListCtrl类的SetItem()函数。例如,设置第一行红色,第二行蓝色,可以用以下代码: ``` m_ListCtrl.SetItem(0, 0, LVIF_TEXT | LVIF_STATE, _T("第一行"), 0, LVIS_SELECTED, LVIS_SELECTED, 0); m_ListCtrl.SetItemText(0, 1, _T("第一")); m_ListCtrl.SetItemData(0, 100); m_ListCtrl.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetItemText(1, 0, _T("第二行")); m_ListCtrl.SetItem(1, 0, LVIF_TEXT | LVIF_STATE, _T("第二行"), 0, LVIS_SELECTED, LVIS_SELECTED, 0); m_ListCtrl.SetItemText(1, 1, _T("第二")); m_ListCtrl.SetItemData(1, 200); m_ListCtrl.SetItemState(1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetItemText(2, 0, _T("第三行")); m_ListCtrl.SetItemText(2, 1, _T("第三")); m_ListCtrl.SetItemText(0, 0, _T("第一行")); m_ListCtrl.SetItemText(0, 1, _T("第一")); m_ListCtrl.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetTextColor(0, RGB(255, 0, 0)); // 设置第1行红色 m_ListCtrl.SetItem(1, 0, LVIF_TEXT | LVIF_STATE, _T("第二行"), 0, LVIS_SELECTED, LVIS_SELECTED, 0); m_ListCtrl.SetItemText(1, 1, _T("第二")); m_ListCtrl.SetItemState(1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetTextColor(1, RGB(0, 0, 255)); // 设置第2行蓝色 ``` 除了设置整行或整的颜色,还可以为不同的单元格设置不同的颜色。可以在添加行时使用LVITEM结构体的iItem、iSubItem、mask、pszText等成员,分别指定行号、号、要设置的属性和单元格要显示的文本。在通过CListCtrl类的GetItem()函数获取某一行时,也可以获得单元格的前景色和背景色等属性信息。 通过上述方法,可以实现MFC ListControl控件的颜色自定义设置。至于要如何设置出美观的颜色组合,需要根据实际情况和个人喜好来决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值