TA的每日心情 | 开心 前天 22:51 |
---|
签到天数: 946 天 [LV.10]以坛为家III
管理员
- 积分
- 28876
|
小白入门教程(四)中对TXT合并软件写了一个开头,后续也有一段时间没有再更新教程了,今天写五就不准备继续写这个软件了,毕竟应用范围不广,这个坑就不填。今天新开一贴,来写一个QQ表情清理的软件,主要是这些年来QQ的聊天记录都保留着,导致很多重复的、无意义的QQ表情(gif文件)占用较大的空间,就想着拿SOUI练练手,顺便做一下QQ表情清理。
首先使用VS2010创建一个SOUI项目,创建一个QQCleaner项目,默认的Win32项目就不改了,适应性广,不必专门搞X64项目。
项目创建后(默认配置)直接改为release,编译,肯定是成功运行的。我们先去设计一下界面。
目前设计的界面如上。左侧为黑名单文件浏览及预览(使用的是tileview),右侧为查找到的黑名单表情(使用了mclistview)。实际上这两个控件我都没有使用过,顺带练手了。
先实现选择黑名单的功能,点击btn找到选择目录。
EVENT_NAME_COMMAND(L"btn_select", OnSelect);
- void CMainDlg::OnSelect()
- {
- LPITEMIDLIST pil = NULL;
- INITCOMMONCONTROL*** InitCtrls = {0};
- TCHAR szBuf[4096] = {0};
- BROWSEINFO bi = {0};
- bi.hwndOwner = NULL;
- bi.iImage = 0;
- bi.lParam = NULL;
- bi.lpfn = NULL;
- bi.lpszTitle = _T("请选择文件路径");
- bi.pszDisplayName = szBuf;
- bi.ulFlags = BIF_BROWSEINCLUDEFILES;
- InitCommonControl***(&InitCtrls);//在调用函数SHBrowseForFolder之前需要调用该函数初始化相关环境
- pil = SHBrowseForFolder(&bi);
- if (NULL != pil)//若函数执行成功,并且用户选择问件路径并点击确定
- {
- SHGetPathFromIDList(pil, szBuf);//获取用户选择的文件路径
- wprintf_s(_T("%s"), szBuf);
- pPath->SetWindowText(szBuf);
- }
- //————————————————
- //版权声明:本文为CSDN博主「aluluka」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
- //原文链接:https://blog.csdn.net/lanuage/article/details/50382023
- }
复制代码 编译后,测试,可实现选择路径。
下面获取指定目录下,所有子目录下所有文件的预览(若为为图片,则使用默认图片,这样清理垃圾文件就不局限于图片文件了)。
定义变量std::vector<SStringT> FileNamevec;用于存储文件名表,使用EnumFiles(SOUI::SStringT strPath)递归来遍历子文件夹的文件。
下面将获取到的文件,在tileview中生成预览图,SOUI中控件(listveiw,mclistview,treeview)的数据是由开发者自己维护的,这里创建一个类,继承自 SAdapterBase。
- #include <helper/SAdapterBase.h>
- #include "stdafx.h"
- typedef struct _tagImgInfo
- {
- bool isChcek;
- SStringT filePath;
- }ImgInfo,*LPImgInfo;
- typedef std::vector<ImgInfo> ImgInfoList;
- class CQQGifAdapter :public SAdapterBase
- {
- public:
- CQQGifAdapter(void)
- {
- }
- virtual int getCount()
- {
- return m_ImgInfoList.size();;
- }
- virtual void getView(int position, SWindow *pItem, pugi::xml_node xmlTemplate)
- {
- if (pItem->GetChildrenCount() == 0)
- {
- pItem->InitFromXml(xmlTemplate);
- }
- SCheckBox *pCheck = pItem->FindChildByName2<SCheckBox>(L"check_test");
- pCheck->SetCheck(m_ImgInfoList.at(position).isChcek);
- SImageWnd *pImg = pItem->FindChildByName2<SImageWnd>(L"img_file_icon");
- if (pImg)
- {
- IBitmap* bitmap = SApplication::getSingleton().LoadImage(_T("file"),m_ImgInfoList.at(position).filePath);
- if (bitmap)
- {
- pImg->SetImage(bitmap);
- pImg->Invalidate();
- bitmap->Release();
- }
- }
- }
- public:
- ImgInfoList m_ImgInfoList;
- };
复制代码 以上代码大部分从demo中抄来,结果能用就成。添加Adapter,调试运行后,结果如下图。
- if(m_ImgInfoList.size()>0)
- {
- CQQGifAdapter *pAdapter = new CQQGifAdapter;
- pAdapter->m_ImgInfoList = m_ImgInfoList;
- pTileViw->SetAdapter(pAdapter);
- pAdapter->Release();
- }
复制代码
感觉那个checkbox多余,去掉。
从SoTool可复制MD5的类,添加相应的代码,实现对黑名单内的文件进行MD5计算
然后再创建一个计算QQ内表情的,两个for循环+if判断,是的话就删除,不是的话继续。
目前TileView的功能已经实现,mclistview的我就不写了,我只加了一个text来显示进度,自己用就这样吧。demo功用完成但界面交互不完整。教程太初级,没人看,就这样吧
QQCleaner.rar
(37.96 KB, 下载次数: 1, 售价: 1 SOUI币)
|
|