List Control是MFC中经常用到的控件,但是可惜该控件并不支持键盘输入、添加各种控件(Button、ComboBox...)等功能,说白了基本功能就是一个用于显示数据的表格性质控件。那么,对于键盘输入的支持以及控件的添加等功能具体如何实现,在下文中一一详述。

一、基本的使用

1.初始化风格

对于style的(报表风格、单选模式等)设置;对于ExtendedStyle(网格添加、item前添加check box等)的设置;例:

对于一个关联变量为m_Errorlist的List Control初始化:

        LONG lStyle;lStyle = GetWindowLong(m_Errorlist.m_hWnd, GWL_STYLE);//获取当前窗口stylelStyle &= ~LVS_TYPEMASK; //清除显示方式位lStyle |= LVS_REPORT; //设置stylelStyle |= LVS_SINGLESEL;//单选模式SetWindowLong(m_Errorlist.m_hWnd, GWL_STYLE, lStyle);//设置styleDWORD dwStyle = m_Errorlist.GetExtendedStyle();dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件m_Errorlist.SetExtendedStyle(dwStyle); //设置扩展风格

2.插入列、行

插入列:参数分别为(列位置0、列标题为Amp Enable、位置居中、列宽度、列索引号0)

m_ErrorList.InsertColumn(0, "Amp Enable", LVCFMT_CENTER, EnableListCtrlRect.Width() * 1 / 1, 0);

插入行:参数分别为(行索引0、行标题)

m_Errorlist.InsertItem(0, "caption");

3.插入子项:参数分别为(行索引号、列索引号、子项内容)

m_ListCtr.SetItemText(0,1,"content");

以上,基本功能结束。

二、Edit Control的添加(键盘输入的支持)

完成效果:双击List Control的子项,会在子项处出现编辑框;输入焦点消失后,将编辑后的内容更新到子项处。实现List Control的可编辑功能。

1.在List Control所在对话框内添加一个编辑框控件,并设为不可见;

2.对List Control添加控件的双击事件NM_DBLCLK,在触发函数内写:

void CAboutListControlDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知处理程序代码NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;CRect rc;m_Row = pNMListView->iItem;//获得选中的行  m_Col = pNMListView->iSubItem;//获得选中列  if (pNMListView->iSubItem != 0) //如果选择的是子项;  {m_ListControl.GetSubItemRect(m_Row, m_Col, LVIR_LABEL, rc);//获得子项的RECT;  m_edit.SetParent(&m_ListControl);//转换坐标为列表框中的坐标  m_edit.MoveWindow(rc);//移动Edit到RECT坐在的位置;  m_edit.SetWindowText(m_ListControl.GetItemText(m_Row, m_Col));//将该子项中的值放在Edit控件中;  m_edit.ShowWindow(SW_SHOW);//显示Edit控件;  m_edit.SetFocus();//设置Edit焦点  m_edit.ShowCaret();//显示光标  m_edit.SetSel(-1);//将光标移动到最后  }*pResult = 0;
}

以上完成了双击显示编辑框控件,并将原子项内容更新到编辑框内;那么接下来要是实现,输入焦点消失后,编辑框的内容更新到子项内,并隐藏编辑框等待下一次双击动作。

3.给Edit Control添加KillFocus事件,并在触发函数内写:

void CAboutListControlDlg::OnEnKillfocusEdit1()
{// TODO: 在此添加控件通知处理程序代码CString tem;m_edit.GetWindowText(tem);    //得到用户输入的新的内容  m_ListControl.SetItemText(m_Row, m_Col, tem);   //设置编辑框的新内容  m_edit.ShowWindow(SW_HIDE);                //应藏编辑框
}

以上,List Control的可编辑功能完成!

三、List Control对于任意控件添加的支持(重点来了!)

以CButton类控件的添加为例!

基本思路:1.生成控件(静态/动态)2.将控件贴到List Control的指定位置 3.如有滚动条,跟随滚动条实现位置更新,且不屏闪(很重要)

1.生成控件:动态控件的生成在下一篇博客:MFC---动态生成任意数量的控件并添加消息响应  会具体介绍;

2.贴控件到指定位置处:(两种方式)

第一种:(只针对动态生成)生成时,将父窗口指针定义为ListControl且Rect为目标处的位置;

CButton *btn = new CButton();
btn->Create(str, bn_dwStyle, Rect, GetDlgItem(IDC_LIST1), IDC_Dynamic_Button0 + ButtonNum);

第二种:(动态/静态都可)控件生成后,这里 rect1同上;

btn->SetParent(&m_ListCtr);//将button设为list ctr的子窗口,即转换为list ctr的坐标!
btn->MoveWindow(rect1);//将button移动到对应位置处

3.List Control存在滚动条情况下,保证贴上去的控件位置跟随滚动条刷新,且防止屏闪

位置刷新:试了很多方法,但其实最简单实用的就是开一个Timer,在OnTimer()中对所贴上去的所有控件,调用 MoveWindow()+Invalidate()函数即可实时重绘/更新窗口;

防屏闪:为了防止重绘一直在进行,导致屏幕的闪烁,最好的办法就是在合适的条件下开启和关闭位置刷新的Timer;

展开来说就是:对ListControl添加触发函数(LVN_BEGINSCROLL),在函数体内Set上述的位置刷新Timer;也即只有在拖动滚动条时才会触发位置刷新,这是在合适的时候开启Timer;

再开一个一直在工作的Timer,在此Timer内不停获取滚动条(水平/垂直)的位置,并不断判断本次触发与上次触发时滚动条位置的变化;如果没有产生变化,则意味着滚动条的拖动停止,此时Kill位置刷新的Timer即可,这是在合适的时间关闭Timer。

附上获取滚动条位置的函数:

m_ListCtr.GetScrollPos(SB_HORZ)//水平滚动条
m_ListCtr.GetScrollPos(SB_VERT)//垂直滚动条

当然,贴上去的控件还得添加消息响应,这部分工作才算完成,见下一篇博客:MFC---动态生成任意数量的控件并添加消息响应 。

以上。

MFC---List Control的用法总结相关推荐

  1. MFC总结之CListCtrl用法及技巧(二)

    续第一篇:MFC总结之CListCtrl用法及技巧(一) http://blog.csdn.net/zwgdft/article/details/7560592 本篇重点介绍:禁止拖动表头.让第一列居 ...

  2. 将MFC Grid Control封装为DLL的做法及其在DLL中的使用方法

    将MFC Grid Control封装为DLL的做法及其在DLL中的使用方法 MFCGrid control是一款非常优秀的网格控件,支持非常丰富的界面元素,如下图: 因而在数据库程序及报表程序应用较 ...

  3. control的用法及短语_有关control的短语

    1. control短语,句子 to have control of or over 控制 to take control of 管理 in control of 控制着 to be/get out ...

  4. MFC Edit control用法

    MFC里面的EDIT Control控件的用法是怎么样的,1.怎么样才能赋值给EDIT Control控件并在EDIT Control控件显示出来;2.怎么取得EDIT Control控件的值并传递给 ...

  5. mfc中picture control的用法_可能是最被误用的 HTTP 响应头之一 Cache-Control: must-revalidate

    在 HTTP 客户端(浏览器或者缓存服务器)上,如果某个 URL 对应的缓存过期了,客户端会再次向该 URL 发送一个条件请求(带有If-Modified-Since/If-None-Match请求头 ...

  6. MFC开发-MFC Edit Control 捕捉回车用法

    头文件添加 virtual BOOL PreTranslateMessage(MSG* pMsg); 这个函数是捕获到所有Edit Control回车的消息. BOOL Ctext1Dlg::PreT ...

  7. MFC多线程各种线程用法 .

    一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为 IDC_SLEEP_SI ...

  8. MFC List Control 控件添加单元格编辑,实现可编辑重写

    在实现随机生成四则运算的个人项目中,目前已经完成基本功能,想要把程序变成一个Windows界面的程序.原本以为学习过MFC,应该很快就能完成.但是由于以前用的都是VC6.0,这次用了VS2010,稍微 ...

  9. MFC中CString.format用法

    MFC中CString.Format的详细用法 收藏  在MFC程序中,使用CString来处理字符串是一个很不错的选择. CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的 ...

  10. control的用法及短语_九上U5(control)微课详解与精练

    ◆◆视频讲解◆◆ (译林牛津 | 九上U5重点词汇 control) ◆◆例题解析◆◆1. 单选题: The business is said to be          of a director ...

最新文章

  1. 2022-2028年中国LCD光刻胶行业市场深度分析及发展规模预测报告
  2. 【Python进阶】实战Python图形文件操作基本编程
  3. 文件名不能为null_色即是空,空即是色---java有关null的几件小事
  4. BugKuCTF 杂项 啊哒
  5. HDU - 3338 Kakuro Extension(最大流+思维建边)
  6. GPU迎来投资热潮 退潮后谁在裸泳
  7. JDK1.8源码下载及获取、导入IDEA阅读、配置JDK源码
  8. 混合模型简介与高斯混合模型
  9. 如何让HTML在手机上实现直接拨打电话以及发送短信?
  10. target ajax,jQuery target - jquery事件
  11. php处理文件属性函数,文件属性 · PHP文件系统操作常用函数整理 · 看云
  12. Excel Cookbook by Eric
  13. sonarqube配置全指南,集成阿里巴巴p3c规范
  14. pandas填充空数组_pandas | DataFrame基础运算以及空值填充
  15. matlab中abs函数,matlababs是什么意思 是是是什么意思
  16. 网络安全-使用PGP实现电子邮件安全
  17. 证件照蓝底变白底的方法
  18. 借贷记账法--借贷记账法 (Debit and Credit)
  19. Excel 宏 将工作表中的数据按照顺序分拆到 本工作簿 的其他工作表
  20. 吐槽微信公众号技术团队的故障处理效率

热门文章

  1. 外网访问家庭局域网方案,解决运营商100.x.x.x内网IP问题
  2. 微信小程序 使用cookie
  3. dojo 框架实战笔记
  4. 趋势科技专访:让员工选我所爱,爱我所选
  5. []趋势科技2015校园招聘
  6. 虚无缥缈的自信,一落千丈的打击
  7. Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (10061),错误代码2003
  8. 安装极狐GitLab(ubuntu)----写给不爱看官方文档的人
  9. Filebeat日志采集
  10. python modbus_tk模块学习笔记(rtu slaver例程)