=================================版权声明=================================

版权声明:本文为博主原创文章 未经许可不得转载 

请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我

未经作者授权勿用于学术性引用。

未经作者授权勿用于商业出版、商业印刷、商业引用以及其他商业用途。                

本文不定期修正完善,为保证内容正确,建议移步原文处阅读。                                                               <--------总有一天我要自己做一个模板干掉这只土豆

本文链接:http://www.cnblogs.com/wlsandwho/p/4736907.html

耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html

=======================================================================

我用的是VS2010,并没有打SP1包。

=======================================================================

MFC中CVSListBox看起来很好的样子,其实并不是像看起来那样。这个控件封装的很严密,在向导里并不能添加消息响应事件之类的东西。

微软MSDN上也没有什么有用的信息,只说了句类似“要文档没有,爱用用、不用Gun,想用自己看源文件”的话。

幸好略微提供了一个源码,说了怎样写派生类。

网址(https://msdn.microsoft.com/en-us/library/bb984191.aspx)中的New Controls给了一个简单的示例。

既然如此,那我就自己写一个吧。

=======================================================================

我知道并没有人想知道怎样实现的,我也没做过开源,可是,可是这次我就github了一次。

https://github.com/Simon-Wong/CVSListBoxWLS

这里只贴头文件吧。

=======================================================================

头文件:

  1. #pragma once
  2. // VSListBoxWLS.h : 定义文件
  3. #include"afxvslistbox.h"
  4. //////////////////////////////////////////////////////////////////////////
  5. // CVSListBoxWLS
  6. //by wls
  7. //The memory leaks is made by MFC,not me,for the little buttons in CVSListBox called CMFCToolTipCtrl or something named XXXButton.
  8. //If you change the Appearance of CVSListBox to false,it will work with no memory leaks.
  9. //That means HEHE.
  10.  
  11. typedef BOOL (*FUNCDOSOMETHING)(LPVOID /*lpRawData*/,LPVOID /*lpNewData*/,CObject* /*pObj*/);//by wls You know that
  12.  
  13. BOOL FuncDoNothing(LPVOID,LPVOID,CObject*);//by wls An idle function to do nothing
  14.  
  15. class CVSListBoxWLS : public CVSListBox
  16. {
  17. DECLARE_DYNAMIC(CVSListBoxWLS)
  18.  
  19. public:
  20. CVSListBoxWLS();
  21. virtual ~CVSListBoxWLS();
  22.  
  23. private:
  24. BOOL m_bEnableRepeatText;////by wls True for enable to insert repeat text,false for disable.
  25. BOOL m_bDoAfterAddItemWhenever;////by wls True for enable to do something whenever really insert text or not due to m_bEnableRepeatText,false for only really inserting text
  26. BOOL m_bDoAfterRenameWhenever;////by wls The usage like above
  27. BOOL m_bAddItem;
  28. BOOL m_bCheckTextLen;
  29. BOOL m_nTextLen;
  30.  
  31. CString m_strWhenSelecting;//by wls The raw string
  32. CString m_strAfterOp;//by wls The new string
  33. CObject* m_pObjforOperatingFunc;
  34.  
  35. FUNCDOSOMETHING m_fdsBeforeRemoveItem;
  36. FUNCDOSOMETHING m_fdsAfterAddItemNoRepeat;
  37. FUNCDOSOMETHING m_fdsAfterAddItemWhenever;
  38. FUNCDOSOMETHING m_fdsAfterRenameItemNoRepeat;
  39. FUNCDOSOMETHING m_fdsAfterRenameItemWhenever;
  40.  
  41. private:
  42. BOOL IsExistText(CString strText);
  43. void GetItemTextAfterOp(int nItem);
  44.  
  45. public:
  46. CString GetTextWhenSelecting();
  47.  
  48. void EnableRepeatText(BOOL bRepeat=FALSE);//by wls It depends the client code in where you save all the data to the very end.
  49. void EnableDoAfterAddItemWhenever(BOOL bRepeat=FALSE);
  50. void EnableDoAfterRenameWhenever(BOOL bRepeat=FALSE);
  51.  
  52. void EnableCheckTextLen(BOOL bChk=FALSE);
  53. void SetTextLegalLength(int nLen=);
  54.  
  55. void SetObjforOperation(CObject* obj=NULL);
  56.  
  57. void SetOperationBeforeRemoveItem(FUNCDOSOMETHING fds);
  58. void SetOperationAfterAddItemNoRepeat(FUNCDOSOMETHING fds);
  59. void SetOperationAfterAddItemWhenever(FUNCDOSOMETHING fds);
  60. void SetOperationAfterRenameItemNoRepeat(FUNCDOSOMETHING fds);
  61. void SetOperationAfterRenameItemWhenever(FUNCDOSOMETHING fds);
  62.  
  63. public:
  64. void SetItemText(int nIndex, const CString& strText);
  65.  
  66. BOOL OnBeforeRemoveItem(int iItem);
  67. void OnAfterAddItem(int nItem);
  68. void OnAfterRenameItem(int nItem);
  69. void OnSelectionChanged();
  70.  
  71. protected:
  72. DECLARE_MESSAGE_MAP()
  73. };

=======================================================================

一定会有人吐槽我不写详细注释,不解释了。

=======================================================================

使用起来很简单。

Enable开头的函数设置功能开关,默认关闭状态。

SetOp开头的函数设置类似回调函数的功能,默认执行空操作。

SetObj开头的函数设置类似回调函数中执行功能时可能用到的外部类变量。

Get和Set不解释。

On开头的函数是重写了基类的响应函数。

=======================================================================

任何个人开发人员都能使用我的这个类创建自己的免费或付费应用。

请勿用于公司企业的商业用途。

=======================================================================

20170326 00:28

贴上cpp文件

  1. // VSListBoxWLS.cpp : 实现文件
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "VSListBoxWLS.h"
  6.  
  7. BOOL FuncDoNothing(LPVOID,LPVOID,CObject*){return TRUE;}
  8. // CVSListBoxWLS
  9.  
  10. IMPLEMENT_DYNAMIC(CVSListBoxWLS, CVSListBox)
  11.  
  12. CVSListBoxWLS::CVSListBoxWLS()
  13. {
  14. m_bEnableRepeatText=FALSE;
  15. m_bDoAfterAddItemWhenever=FALSE;
  16. m_bDoAfterRenameWhenever=FALSE;
  17. m_bAddItem=FALSE;
  18.  
  19. m_bCheckTextLen=FALSE;
  20. m_nTextLen=;
  21.  
  22. m_fdsBeforeRemoveItem=FuncDoNothing;
  23. m_fdsAfterAddItemNoRepeat=FuncDoNothing;
  24. m_fdsAfterAddItemWhenever=FuncDoNothing;
  25. m_fdsAfterRenameItemNoRepeat=FuncDoNothing;
  26. m_fdsAfterRenameItemWhenever=FuncDoNothing;
  27.  
  28. m_strWhenSelecting=TEXT("");
  29. m_strAfterOp=TEXT("");
  30.  
  31. m_pObjforOperatingFunc=NULL;
  32. }
  33.  
  34. CVSListBoxWLS::~CVSListBoxWLS()
  35. {
  36. }
  37.  
  38. BEGIN_MESSAGE_MAP(CVSListBoxWLS, CVSListBox)
  39. END_MESSAGE_MAP()
  40.  
  41. void CVSListBoxWLS::SetTextLegalLength(int nLen/*=10*/)
  42. {
  43. m_nTextLen=nLen;
  44. }
  45.  
  46. void CVSListBoxWLS::EnableDoAfterRenameWhenever(BOOL bRename)
  47. {
  48. m_bDoAfterRenameWhenever=bRename;
  49. }
  50.  
  51. void CVSListBoxWLS::EnableRepeatText(BOOL bRepeat)
  52. {
  53. m_bEnableRepeatText=bRepeat;
  54. }
  55.  
  56. void CVSListBoxWLS::EnableDoAfterAddItemWhenever(BOOL bRepeat)
  57. {
  58. m_bDoAfterAddItemWhenever=bRepeat;
  59. }
  60.  
  61. void CVSListBoxWLS::EnableCheckTextLen(BOOL bChk/*=FALSE*/)
  62. {
  63. m_bCheckTextLen=bChk;
  64. }
  65.  
  66. void CVSListBoxWLS::OnSelectionChanged()
  67. {
  68. m_strWhenSelecting=GetItemText(GetSelItem());
  69. OutputDebugString(TEXT("[")+m_strWhenSelecting+TEXT("]\n"));
  70. }
  71.  
  72. void CVSListBoxWLS::SetItemText(int nIndex, const CString& strText)
  73. {
  74. CString strPrompt;
  75. if (m_bEnableRepeatText==FALSE && IsExistText(strText))
  76. {
  77. strPrompt.Format(TEXT("【%s】已存在"),strText);
  78. MessageBox(strPrompt,TEXT("提示"),MB_ICONINFORMATION|MB_OK);
  79.  
  80. m_bAddItem=FALSE;
  81.  
  82. return;
  83. }
  84.  
  85. if (strText==TEXT(""))
  86. {
  87. strPrompt.Format(TEXT("未输入内容"),strText);
  88. MessageBox(strPrompt,TEXT("提示"),MB_ICONINFORMATION|MB_OK);
  89.  
  90. m_bAddItem=FALSE;
  91. }
  92.  
  93. if (m_bCheckTextLen==TRUE && strText.GetLength()>m_nTextLen)
  94. {
  95. strPrompt.Format(TEXT("请输入%d个以内的字符"),m_nTextLen);
  96. MessageBox(strPrompt,TEXT("提示"),MB_ICONINFORMATION|MB_OK);
  97.  
  98. m_bAddItem=FALSE;
  99.  
  100. return;
  101. }
  102.  
  103. m_bAddItem=TRUE;
  104.  
  105. CVSListBox::SetItemText(nIndex,strText);
  106. }
  107.  
  108. BOOL CVSListBoxWLS::OnBeforeRemoveItem(int nItem)
  109. {
  110. GetItemTextAfterOp(nItem);
  111.  
  112. CString strPrompt;
  113. strPrompt.Format(TEXT("确定删除【%s】吗?"),m_strAfterOp);
  114. if (MessageBox(strPrompt,TEXT("提示"),MB_ICONQUESTION|MB_OKCANCEL)==IDOK)
  115. {
  116. //by wls op
  117. m_fdsBeforeRemoveItem((LPVOID)&m_strWhenSelecting,(LPVOID)&m_strAfterOp,m_pObjforOperatingFunc);
  118.  
  119. return TRUE;
  120. }
  121.  
  122. return FALSE;
  123. }
  124.  
  125. CString CVSListBoxWLS::GetTextWhenSelecting()
  126. {
  127. return m_strWhenSelecting;
  128. }
  129.  
  130. void CVSListBoxWLS::GetItemTextAfterOp(int nItem)
  131. {
  132. m_strAfterOp=GetItemText(nItem);
  133. }
  134.  
  135. void CVSListBoxWLS::OnAfterAddItem(int nItem)
  136. {
  137. GetItemTextAfterOp(nItem);
  138.  
  139. if (m_bDoAfterAddItemWhenever==FALSE && m_bAddItem==TRUE)
  140. {
  141. OutputDebugString(TEXT("不重复 成功\n"));
  142. //by wls op
  143. m_fdsAfterAddItemNoRepeat((LPVOID)&m_strWhenSelecting,(LPVOID)&m_strAfterOp,m_pObjforOperatingFunc);
  144.  
  145. return;
  146. }
  147. else
  148. if (m_bDoAfterAddItemWhenever==TRUE /*&& m_bAddItem==TRUE*/)
  149. {
  150. OutputDebugString(TEXT("重复+不重复 成功\n"));
  151. //by wls op
  152. m_fdsAfterAddItemWhenever((LPVOID)&m_strWhenSelecting,(LPVOID)&m_strAfterOp,m_pObjforOperatingFunc);
  153. }
  154.  
  155. if (m_strAfterOp==TEXT(""))
  156. {
  157. RemoveItem(nItem);//by wls Remove the item with no text
  158. }
  159. }
  160.  
  161. void CVSListBoxWLS::OnAfterRenameItem(int nItem)
  162. {
  163. GetItemTextAfterOp(nItem);
  164.  
  165. if (m_bDoAfterRenameWhenever==FALSE && m_bAddItem==TRUE)
  166. {
  167. OutputDebugString(TEXT("重命 不重复 值\n"));
  168. //by wls op
  169. m_fdsAfterRenameItemNoRepeat((LPVOID)&m_strWhenSelecting,(LPVOID)&m_strAfterOp,m_pObjforOperatingFunc);
  170.  
  171. return;
  172. }
  173. else
  174. if (m_bDoAfterAddItemWhenever==TRUE)
  175. {
  176. //by wls op
  177. m_fdsAfterRenameItemWhenever((LPVOID)&m_strWhenSelecting,(LPVOID)&m_strAfterOp,m_pObjforOperatingFunc);
  178. }
  179. }
  180.  
  181. BOOL CVSListBoxWLS::IsExistText(CString strText)
  182. {
  183. for (int i=;i<GetCount();i++)
  184. {
  185. if (strText==GetItemText(i))
  186. {
  187. return TRUE;
  188. }
  189. }
  190.  
  191. return FALSE;
  192. }
  193.  
  194. void CVSListBoxWLS::SetObjforOperation(CObject* obj)
  195. {
  196. m_pObjforOperatingFunc=obj;
  197. }
  198.  
  199. void CVSListBoxWLS::SetOperationBeforeRemoveItem(FUNCDOSOMETHING fds)
  200. {
  201. m_fdsBeforeRemoveItem=fds;
  202. }
  203. void CVSListBoxWLS::SetOperationAfterAddItemNoRepeat(FUNCDOSOMETHING fds)
  204. {
  205. m_fdsAfterAddItemNoRepeat=fds;
  206. }
  207. void CVSListBoxWLS::SetOperationAfterAddItemWhenever(FUNCDOSOMETHING fds)
  208. {
  209. m_fdsAfterAddItemWhenever=fds;
  210. }
  211. void CVSListBoxWLS::SetOperationAfterRenameItemNoRepeat(FUNCDOSOMETHING fds)
  212. {
  213. m_fdsAfterRenameItemNoRepeat=fds;
  214. }
  215. void CVSListBoxWLS::SetOperationAfterRenameItemWhenever(FUNCDOSOMETHING fds)
  216. {
  217. m_fdsAfterRenameItemWhenever=fds;
  218. }

问题解决——CVSListBox的使用的更多相关文章

  1. mysql 7下载安装及问题解决

    mysql 7安装及问题解决 一.mysql下载 下载地址:https://www.mysql.com/downloads/ Community (GPL) Downloads MySQL Commu ...

  2. Microsoft Visual Studio 2015 下载、注册、安装过程、功能列表、问题解决

    PS:请看看回复.可能会有文章里没有提到的问题.也许会对你有帮助哦~ 先上一张最终的截图吧: VS2015正式版出了,虽然没有Ultimate旗舰版,不过也是好激动的说.哈哈.可能有的小伙伴,由于工作 ...

  3. Spark Shuffle原理、Shuffle操作问题解决和参数调优

    摘要: 1 shuffle原理 1.1 mapreduce的shuffle原理 1.1.1 map task端操作 1.1.2 reduce task端操作 1.2 spark现在的SortShuff ...

  4. python scikit-learn 环境搭建问题解决记录

    之前一直用pycharm 里内置的pip进行python 包的安装,今天装scikit-learn时没报错,但是报scipy包不识别,pip下载也报错下载anaconda 集成插件,最终问题解决:参考 ...

  5. springmvc环境搭建以及常见问题解决

    1.新建maven工程 a)  打开eclipse,file->new->project->Maven->Maven Project b)  下一步 c)   选择创建的工程为 ...

  6. 【转】zigbee终端无法重连的问题解决

    zigbee终端无法重连的问题解决 1.zigbee重连的原因 (1)zigbee由于各种原因的干扰导致信号太差而掉线. (2)协调器重启. 2.zigbee终端重连的处理 (1)zigbee掉线后会 ...

  7. mysql数据库乱码的问题解决

    排查原因:打断点,查看到底是在执行存数据库操作之前就已经乱码了,还是存数据库操作后乱码的. 1.前者解决方案: 在web.xml里面加上: <filter> <filter-name ...

  8. ubuntu安装navicat及常见问题解决

    1.安装navicat Step1: 下载Navicat ,网址:http://www.navicat.com/en/download/download.html Step2:进入下载目录,解压压缩包 ...

  9. 完整部署CentOS7.2+OpenStack+kvm 云平台环境(5)--问题解决

    一.[root@openstack-server ~]# nova listERROR (CommandError): You must provide a username or user id v ...

随机推荐

  1. Myeclipse无法开启Servers视图解决办法

    IDE报错如下:  解决办法:1.首先关闭MyEclipse工作空间. 2.然后删除工作空间下的 “/.metadata/.plugins/org.eclipse.core.runtime/.sett ...

  2. Android 源码下载方法(Git 方式clone)

    Android源码对于Android开发者来说,迟早有一天你会用到的,所以就记录一下,分享给读者,希望对读者有用 这里需要使用到Git相关知识,不清楚的可以先阅读,了解的可以跳过 Git-Tortoi ...

  3. SpringMVC 实现POI读取Excle文件中数据导入数据库(上传)、导出数据库中数据到Excle文件中(下载)

    读取Excale表返回一个集合: package com.shiliu.game.utils; import java.io.File; import java.io.FileInputStream; ...

  4. [Excel] WorkBook.SaveAs

    ExcelApplication.WorkBook.SaveAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommend ...

  5. svn忽略某个文件提交

    svn忽略配置文件提交:TortoiseSVN->Unversion and add to ignore_list (config.php(recursiverly)) 正如官方指南所言:Tor ...

  6. 解决使用Skia图形库时遇到的几个问题

    Skia是一个开源的2D图形库,提供通用的API,适用于工作中遇到的各种硬件和软件平台.这是谷歌浏览器Chrome OS,Android的图形引擎,Mozilla Firefox浏览器和Firefox ...

  7. token详解(转载)

    简介 在Web领域基于Token的身份验证随处可见.在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式. 以下几点特性会让你在程序中使用基于Token的身份验证 1. ...

  8. mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化

    先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...

  9. lua-resty-websocket安装和测试

    作者:杨鑫奇 关注Openresty很久了,期待支持websocket终于出来了,看到Aapo Talvensaari同学写的文章https://medium.com/p/1778601c9e05,兴 ...

  10. 设置Hyper-V下Linux机器的网卡(转载)

    今天需要再安装一台CentOS虚拟机,一时心血来潮,选择了一个basic server而不是之前选择的Desktop.安装之后依旧没有网卡,意料之中,呵呵.没有network,没有ifcfg-eth0 ...