问题解决——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 ...
随机推荐
- 用jsonp实现搜索框功能
用jsonp实现搜索框功能 前面的话: 在上周本来想发一篇模仿必应搜索的界面.但是在准备写文章之前突然想到前面学习了ajax技术,在这里我也让我的页面有一种不需要手动刷新就能获取到数据.但是发现用前面 ...
- 无聊的人用JS实现了一个简单的打地鼠游戏
直入正题,用JS实现一个简单的打地鼠游戏 因为功能比较简单就直接裸奔JS了,先看看效果图,或者 在线玩玩 吧 如果点击颜色比较深的那个(俗称坏老鼠),将扣分50:如果点击颜色比较浅的那个(俗称好老鼠) ...
- 自己实现简单的AOP(四)自动初始化代理对象
前面三篇随笔,已经完成了AOP的核心功能,但 代理对象的初始化还是有些麻烦,本文将解决该问题. Demo 片段如下: public class HomeController : Controller ...
- 异步编程系列第04章 编写Async方法
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- SQL Server中的GUID
GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值. GUID ...
- 初识Mybatis框架,实现增删改查等操作(动态拼接和动态修改)
此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...
- js自动切换图片
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Python中三目计算符的正确用法及短路逻辑
今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘. 短路逻辑 Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接 ...
- (Spring4 json入门)Spring4+SpringMVC+页面数据发送与接收(json格式)
jar包(Maven仓库): Spring4 jar包(Maven仓库): 在测试过程中我查看了网上的一些教程,但是那些教程都是在Spring3环境下的,Spring3和Spring4解析json需要 ...
- 【JAVA并发编程实战】4、CountDownLatch
这是一个计数锁,说白了,就是当你上锁的时候,只有计数减少到0的时候,才会释放锁 package cn.xf.cp.ch05; public class TaskRunable implements R ...