问题解决——CVSListBox的使用
=================================版权声明=================================
版权声明:本文为博主原创文章 未经许可不得转载
请通过右侧公告中的“联系邮箱(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
这里只贴头文件吧。
=======================================================================
头文件:
- #pragma once
- // VSListBoxWLS.h : 定义文件
- #include"afxvslistbox.h"
- //////////////////////////////////////////////////////////////////////////
- // CVSListBoxWLS
- //by wls
- //The memory leaks is made by MFC,not me,for the little buttons in CVSListBox called CMFCToolTipCtrl or something named XXXButton.
- //If you change the Appearance of CVSListBox to false,it will work with no memory leaks.
- //That means HEHE.
- typedef BOOL (*FUNCDOSOMETHING)(LPVOID /*lpRawData*/,LPVOID /*lpNewData*/,CObject* /*pObj*/);//by wls You know that
- BOOL FuncDoNothing(LPVOID,LPVOID,CObject*);//by wls An idle function to do nothing
- class CVSListBoxWLS : public CVSListBox
- {
- DECLARE_DYNAMIC(CVSListBoxWLS)
- public:
- CVSListBoxWLS();
- virtual ~CVSListBoxWLS();
- private:
- BOOL m_bEnableRepeatText;////by wls True for enable to insert repeat text,false for disable.
- 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
- BOOL m_bDoAfterRenameWhenever;////by wls The usage like above
- BOOL m_bAddItem;
- BOOL m_bCheckTextLen;
- BOOL m_nTextLen;
- CString m_strWhenSelecting;//by wls The raw string
- CString m_strAfterOp;//by wls The new string
- CObject* m_pObjforOperatingFunc;
- FUNCDOSOMETHING m_fdsBeforeRemoveItem;
- FUNCDOSOMETHING m_fdsAfterAddItemNoRepeat;
- FUNCDOSOMETHING m_fdsAfterAddItemWhenever;
- FUNCDOSOMETHING m_fdsAfterRenameItemNoRepeat;
- FUNCDOSOMETHING m_fdsAfterRenameItemWhenever;
- private:
- BOOL IsExistText(CString strText);
- void GetItemTextAfterOp(int nItem);
- public:
- CString GetTextWhenSelecting();
- void EnableRepeatText(BOOL bRepeat=FALSE);//by wls It depends the client code in where you save all the data to the very end.
- void EnableDoAfterAddItemWhenever(BOOL bRepeat=FALSE);
- void EnableDoAfterRenameWhenever(BOOL bRepeat=FALSE);
- void EnableCheckTextLen(BOOL bChk=FALSE);
- void SetTextLegalLength(int nLen=);
- void SetObjforOperation(CObject* obj=NULL);
- void SetOperationBeforeRemoveItem(FUNCDOSOMETHING fds);
- void SetOperationAfterAddItemNoRepeat(FUNCDOSOMETHING fds);
- void SetOperationAfterAddItemWhenever(FUNCDOSOMETHING fds);
- void SetOperationAfterRenameItemNoRepeat(FUNCDOSOMETHING fds);
- void SetOperationAfterRenameItemWhenever(FUNCDOSOMETHING fds);
- public:
- void SetItemText(int nIndex, const CString& strText);
- BOOL OnBeforeRemoveItem(int iItem);
- void OnAfterAddItem(int nItem);
- void OnAfterRenameItem(int nItem);
- void OnSelectionChanged();
- protected:
- DECLARE_MESSAGE_MAP()
- };
=======================================================================
一定会有人吐槽我不写详细注释,不解释了。
=======================================================================
使用起来很简单。
Enable开头的函数设置功能开关,默认关闭状态。
SetOp开头的函数设置类似回调函数的功能,默认执行空操作。
SetObj开头的函数设置类似回调函数中执行功能时可能用到的外部类变量。
Get和Set不解释。
On开头的函数是重写了基类的响应函数。
=======================================================================
任何个人开发人员都能使用我的这个类创建自己的免费或付费应用。
请勿用于公司企业的商业用途。
=======================================================================
20170326 00:28
贴上cpp文件
- // VSListBoxWLS.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "VSListBoxWLS.h"
- BOOL FuncDoNothing(LPVOID,LPVOID,CObject*){return TRUE;}
- // CVSListBoxWLS
- IMPLEMENT_DYNAMIC(CVSListBoxWLS, CVSListBox)
- CVSListBoxWLS::CVSListBoxWLS()
- {
- m_bEnableRepeatText=FALSE;
- m_bDoAfterAddItemWhenever=FALSE;
- m_bDoAfterRenameWhenever=FALSE;
- m_bAddItem=FALSE;
- m_bCheckTextLen=FALSE;
- m_nTextLen=;
- m_fdsBeforeRemoveItem=FuncDoNothing;
- m_fdsAfterAddItemNoRepeat=FuncDoNothing;
- m_fdsAfterAddItemWhenever=FuncDoNothing;
- m_fdsAfterRenameItemNoRepeat=FuncDoNothing;
- m_fdsAfterRenameItemWhenever=FuncDoNothing;
- m_strWhenSelecting=TEXT("");
- m_strAfterOp=TEXT("");
- m_pObjforOperatingFunc=NULL;
- }
- CVSListBoxWLS::~CVSListBoxWLS()
- {
- }
- BEGIN_MESSAGE_MAP(CVSListBoxWLS, CVSListBox)
- END_MESSAGE_MAP()
- void CVSListBoxWLS::SetTextLegalLength(int nLen/*=10*/)
- {
- m_nTextLen=nLen;
- }
- void CVSListBoxWLS::EnableDoAfterRenameWhenever(BOOL bRename)
- {
- m_bDoAfterRenameWhenever=bRename;
- }
- void CVSListBoxWLS::EnableRepeatText(BOOL bRepeat)
- {
- m_bEnableRepeatText=bRepeat;
- }
- void CVSListBoxWLS::EnableDoAfterAddItemWhenever(BOOL bRepeat)
- {
- m_bDoAfterAddItemWhenever=bRepeat;
- }
- void CVSListBoxWLS::EnableCheckTextLen(BOOL bChk/*=FALSE*/)
- {
- m_bCheckTextLen=bChk;
- }
- void CVSListBoxWLS::OnSelectionChanged()
- {
- m_strWhenSelecting=GetItemText(GetSelItem());
- OutputDebugString(TEXT("[")+m_strWhenSelecting+TEXT("]\n"));
- }
- void CVSListBoxWLS::SetItemText(int nIndex, const CString& strText)
- {
- CString strPrompt;
- if (m_bEnableRepeatText==FALSE && IsExistText(strText))
- {
- strPrompt.Format(TEXT("【%s】已存在"),strText);
- MessageBox(strPrompt,TEXT("提示"),MB_ICONINFORMATION|MB_OK);
- m_bAddItem=FALSE;
- return;
- }
- if (strText==TEXT(""))
- {
- strPrompt.Format(TEXT("未输入内容"),strText);
- MessageBox(strPrompt,TEXT("提示"),MB_ICONINFORMATION|MB_OK);
- m_bAddItem=FALSE;
- }
- if (m_bCheckTextLen==TRUE && strText.GetLength()>m_nTextLen)
- {
- strPrompt.Format(TEXT("请输入%d个以内的字符"),m_nTextLen);
- MessageBox(strPrompt,TEXT("提示"),MB_ICONINFORMATION|MB_OK);
- m_bAddItem=FALSE;
- return;
- }
- m_bAddItem=TRUE;
- CVSListBox::SetItemText(nIndex,strText);
- }
- BOOL CVSListBoxWLS::OnBeforeRemoveItem(int nItem)
- {
- GetItemTextAfterOp(nItem);
- CString strPrompt;
- strPrompt.Format(TEXT("确定删除【%s】吗?"),m_strAfterOp);
- if (MessageBox(strPrompt,TEXT("提示"),MB_ICONQUESTION|MB_OKCANCEL)==IDOK)
- {
- //by wls op
- m_fdsBeforeRemoveItem((LPVOID)&m_strWhenSelecting,(LPVOID)&m_strAfterOp,m_pObjforOperatingFunc);
- return TRUE;
- }
- return FALSE;
- }
- CString CVSListBoxWLS::GetTextWhenSelecting()
- {
- return m_strWhenSelecting;
- }
- void CVSListBoxWLS::GetItemTextAfterOp(int nItem)
- {
- m_strAfterOp=GetItemText(nItem);
- }
- void CVSListBoxWLS::OnAfterAddItem(int nItem)
- {
- GetItemTextAfterOp(nItem);
- if (m_bDoAfterAddItemWhenever==FALSE && m_bAddItem==TRUE)
- {
- OutputDebugString(TEXT("不重复 成功\n"));
- //by wls op
- m_fdsAfterAddItemNoRepeat((LPVOID)&m_strWhenSelecting,(LPVOID)&m_strAfterOp,m_pObjforOperatingFunc);
- return;
- }
- else
- if (m_bDoAfterAddItemWhenever==TRUE /*&& m_bAddItem==TRUE*/)
- {
- OutputDebugString(TEXT("重复+不重复 成功\n"));
- //by wls op
- m_fdsAfterAddItemWhenever((LPVOID)&m_strWhenSelecting,(LPVOID)&m_strAfterOp,m_pObjforOperatingFunc);
- }
- if (m_strAfterOp==TEXT(""))
- {
- RemoveItem(nItem);//by wls Remove the item with no text
- }
- }
- void CVSListBoxWLS::OnAfterRenameItem(int nItem)
- {
- GetItemTextAfterOp(nItem);
- if (m_bDoAfterRenameWhenever==FALSE && m_bAddItem==TRUE)
- {
- OutputDebugString(TEXT("重命 不重复 值\n"));
- //by wls op
- m_fdsAfterRenameItemNoRepeat((LPVOID)&m_strWhenSelecting,(LPVOID)&m_strAfterOp,m_pObjforOperatingFunc);
- return;
- }
- else
- if (m_bDoAfterAddItemWhenever==TRUE)
- {
- //by wls op
- m_fdsAfterRenameItemWhenever((LPVOID)&m_strWhenSelecting,(LPVOID)&m_strAfterOp,m_pObjforOperatingFunc);
- }
- }
- BOOL CVSListBoxWLS::IsExistText(CString strText)
- {
- for (int i=;i<GetCount();i++)
- {
- if (strText==GetItemText(i))
- {
- return TRUE;
- }
- }
- return FALSE;
- }
- void CVSListBoxWLS::SetObjforOperation(CObject* obj)
- {
- m_pObjforOperatingFunc=obj;
- }
- void CVSListBoxWLS::SetOperationBeforeRemoveItem(FUNCDOSOMETHING fds)
- {
- m_fdsBeforeRemoveItem=fds;
- }
- void CVSListBoxWLS::SetOperationAfterAddItemNoRepeat(FUNCDOSOMETHING fds)
- {
- m_fdsAfterAddItemNoRepeat=fds;
- }
- void CVSListBoxWLS::SetOperationAfterAddItemWhenever(FUNCDOSOMETHING fds)
- {
- m_fdsAfterAddItemWhenever=fds;
- }
- void CVSListBoxWLS::SetOperationAfterRenameItemNoRepeat(FUNCDOSOMETHING fds)
- {
- m_fdsAfterRenameItemNoRepeat=fds;
- }
- void CVSListBoxWLS::SetOperationAfterRenameItemWhenever(FUNCDOSOMETHING fds)
- {
- m_fdsAfterRenameItemWhenever=fds;
- }
问题解决——CVSListBox的使用的更多相关文章
- mysql 7下载安装及问题解决
mysql 7安装及问题解决 一.mysql下载 下载地址:https://www.mysql.com/downloads/ Community (GPL) Downloads MySQL Commu ...
- Microsoft Visual Studio 2015 下载、注册、安装过程、功能列表、问题解决
PS:请看看回复.可能会有文章里没有提到的问题.也许会对你有帮助哦~ 先上一张最终的截图吧: VS2015正式版出了,虽然没有Ultimate旗舰版,不过也是好激动的说.哈哈.可能有的小伙伴,由于工作 ...
- Spark Shuffle原理、Shuffle操作问题解决和参数调优
摘要: 1 shuffle原理 1.1 mapreduce的shuffle原理 1.1.1 map task端操作 1.1.2 reduce task端操作 1.2 spark现在的SortShuff ...
- python scikit-learn 环境搭建问题解决记录
之前一直用pycharm 里内置的pip进行python 包的安装,今天装scikit-learn时没报错,但是报scipy包不识别,pip下载也报错下载anaconda 集成插件,最终问题解决:参考 ...
- springmvc环境搭建以及常见问题解决
1.新建maven工程 a) 打开eclipse,file->new->project->Maven->Maven Project b) 下一步 c) 选择创建的工程为 ...
- 【转】zigbee终端无法重连的问题解决
zigbee终端无法重连的问题解决 1.zigbee重连的原因 (1)zigbee由于各种原因的干扰导致信号太差而掉线. (2)协调器重启. 2.zigbee终端重连的处理 (1)zigbee掉线后会 ...
- mysql数据库乱码的问题解决
排查原因:打断点,查看到底是在执行存数据库操作之前就已经乱码了,还是存数据库操作后乱码的. 1.前者解决方案: 在web.xml里面加上: <filter> <filter-name ...
- ubuntu安装navicat及常见问题解决
1.安装navicat Step1: 下载Navicat ,网址:http://www.navicat.com/en/download/download.html Step2:进入下载目录,解压压缩包 ...
- 完整部署CentOS7.2+OpenStack+kvm 云平台环境(5)--问题解决
一.[root@openstack-server ~]# nova listERROR (CommandError): You must provide a username or user id v ...
随机推荐
- Myeclipse无法开启Servers视图解决办法
IDE报错如下: 解决办法:1.首先关闭MyEclipse工作空间. 2.然后删除工作空间下的 “/.metadata/.plugins/org.eclipse.core.runtime/.sett ...
- Android 源码下载方法(Git 方式clone)
Android源码对于Android开发者来说,迟早有一天你会用到的,所以就记录一下,分享给读者,希望对读者有用 这里需要使用到Git相关知识,不清楚的可以先阅读,了解的可以跳过 Git-Tortoi ...
- SpringMVC 实现POI读取Excle文件中数据导入数据库(上传)、导出数据库中数据到Excle文件中(下载)
读取Excale表返回一个集合: package com.shiliu.game.utils; import java.io.File; import java.io.FileInputStream; ...
- [Excel] WorkBook.SaveAs
ExcelApplication.WorkBook.SaveAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommend ...
- svn忽略某个文件提交
svn忽略配置文件提交:TortoiseSVN->Unversion and add to ignore_list (config.php(recursiverly)) 正如官方指南所言:Tor ...
- 解决使用Skia图形库时遇到的几个问题
Skia是一个开源的2D图形库,提供通用的API,适用于工作中遇到的各种硬件和软件平台.这是谷歌浏览器Chrome OS,Android的图形引擎,Mozilla Firefox浏览器和Firefox ...
- token详解(转载)
简介 在Web领域基于Token的身份验证随处可见.在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式. 以下几点特性会让你在程序中使用基于Token的身份验证 1. ...
- mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化
先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...
- lua-resty-websocket安装和测试
作者:杨鑫奇 关注Openresty很久了,期待支持websocket终于出来了,看到Aapo Talvensaari同学写的文章https://medium.com/p/1778601c9e05,兴 ...
- 设置Hyper-V下Linux机器的网卡(转载)
今天需要再安装一台CentOS虚拟机,一时心血来潮,选择了一个basic server而不是之前选择的Desktop.安装之后依旧没有网卡,意料之中,呵呵.没有network,没有ifcfg-eth0 ...