SOUI官方论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 168|回复: 3

小白入门教程(五)QQ表情清理器

[复制链接]

206

主题

465

帖子

4749

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4749
发表于 2019-9-2 10:36:52 | 显示全部楼层 |阅读模式
    小白入门教程(四)中对TXT合并软件写了一个开头,后续也有一段时间没有再更新教程了,今天写五就不准备继续写这个软件了,毕竟应用范围不广,这个坑就不填。今天新开一贴,来写一个QQ表情清理的软件,主要是这些年来QQ的聊天记录都保留着,导致很多重复的、无意义的QQ表情(gif文件)占用较大的空间,就想着拿SOUI练练手,顺便做一下QQ表情清理。
    首先使用VS2010创建一个SOUI项目,创建一个QQCleaner项目,默认的Win32项目就不改了,适应性广,不必专门搞X64项目。
    项目创建后(默认配置)直接改为release,编译,肯定是成功运行的。我们先去设计一下界面。
   
    目前设计的界面如上。左侧为黑名单文件浏览及预览(使用的是tileview),右侧为查找到的黑名单表情(使用了mclistview)。实际上这两个控件我都没有使用过,顺带练手了。
    先实现选择黑名单的功能,点击btn找到选择目录。
    EVENT_NAME_COMMAND(L"btn_select", OnSelect);

  1. void CMainDlg::OnSelect()
  2. {
  3.         LPITEMIDLIST pil = NULL;
  4.         INITCOMMONCONTROL*** InitCtrls = {0};
  5.         TCHAR szBuf[4096] = {0};
  6.         BROWSEINFO bi = {0};
  7.         bi.hwndOwner = NULL;
  8.         bi.iImage = 0;
  9.         bi.lParam = NULL;
  10.         bi.lpfn = NULL;
  11.         bi.lpszTitle = _T("请选择文件路径");
  12.         bi.pszDisplayName =  szBuf;
  13.         bi.ulFlags = BIF_BROWSEINCLUDEFILES;

  14.         InitCommonControl***(&InitCtrls);//在调用函数SHBrowseForFolder之前需要调用该函数初始化相关环境
  15.         pil = SHBrowseForFolder(&bi);
  16.         if (NULL != pil)//若函数执行成功,并且用户选择问件路径并点击确定
  17.         {
  18.                 SHGetPathFromIDList(pil, szBuf);//获取用户选择的文件路径
  19.                 wprintf_s(_T("%s"), szBuf);

  20.                 pPath->SetWindowText(szBuf);
  21.         }
  22.         //————————————————
  23.         //版权声明:本文为CSDN博主「aluluka」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
  24.         //原文链接:https://blog.csdn.net/lanuage/article/details/50382023
  25. }
复制代码
    编译后,测试,可实现选择路径。     


     下面获取指定目录下,所有子目录下所有文件的预览(若为为图片,则使用默认图片,这样清理垃圾文件就不局限于图片文件了)。
      定义变量std::vector<SStringT> FileNamevec;用于存储文件名表,使用EnumFiles(SOUI::SStringT strPath)递归来遍历子文件夹的文件。
    下面将获取到的文件,在tileview中生成预览图,SOUI中控件(listveiw,mclistview,treeview)的数据是由开发者自己维护的,这里创建一个类,继承自 SAdapterBase。
  1. #include <helper/SAdapterBase.h>
  2. #include "stdafx.h"
  3. typedef struct _tagImgInfo
  4. {
  5.         bool isChcek;
  6.         SStringT filePath;
  7. }ImgInfo,*LPImgInfo;
  8. typedef std::vector<ImgInfo> ImgInfoList;

  9. class CQQGifAdapter :public SAdapterBase
  10. {
  11. public:
  12.         CQQGifAdapter(void)
  13.         {

  14.         }
  15.         virtual int getCount()
  16.         {
  17.                 return m_ImgInfoList.size();;
  18.         }

  19.         virtual void getView(int position, SWindow *pItem, pugi::xml_node xmlTemplate)
  20.         {
  21.                 if (pItem->GetChildrenCount() == 0)
  22.                 {
  23.                         pItem->InitFromXml(xmlTemplate);
  24.                 }

  25.                 SCheckBox *pCheck = pItem->FindChildByName2<SCheckBox>(L"check_test");
  26.                 pCheck->SetCheck(m_ImgInfoList.at(position).isChcek);
  27.                 SImageWnd *pImg = pItem->FindChildByName2<SImageWnd>(L"img_file_icon");
  28.                 if (pImg)
  29.                 {
  30.                         IBitmap* bitmap = SApplication::getSingleton().LoadImage(_T("file"),m_ImgInfoList.at(position).filePath);
  31.                         if (bitmap)
  32.                         {
  33.                                 pImg->SetImage(bitmap);
  34.                                 pImg->Invalidate();
  35.                                 bitmap->Release();
  36.                         }
  37.                 }
  38.         }
  39. public:
  40.         ImgInfoList m_ImgInfoList;
  41. };
复制代码
  以上代码大部分从demo中抄来,结果能用就成。添加Adapter,调试运行后,结果如下图。
  1. if(m_ImgInfoList.size()>0)
  2.                 {
  3.                         CQQGifAdapter *pAdapter = new CQQGifAdapter;
  4.                         pAdapter->m_ImgInfoList = m_ImgInfoList;
  5.                         pTileViw->SetAdapter(pAdapter);
  6.                         pAdapter->Release();
  7.                 }
复制代码

感觉那个checkbox多余,去掉。
    从SoTool可复制MD5的类,添加相应的代码,实现对黑名单内的文件进行MD5计算
   
   然后再创建一个计算QQ内表情的,两个for循环+if判断,是的话就删除,不是的话继续。
   目前TileView的功能已经实现,mclistview的我就不写了,我只加了一个text来显示进度,自己用就这样吧。demo功用完成但界面交互不完整。教程太初级,没人看,就这样吧
   


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

12

主题

89

帖子

1154

积分

06:00合体期

Rank: 6Rank: 6

积分
1154
发表于 2019-9-3 13:56:53 | 显示全部楼层
写教程类的排版挺累 不错了

206

主题

465

帖子

4749

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4749
 楼主| 发表于 2019-9-3 14:12:33 | 显示全部楼层
xiaoke 发表于 2019-9-3 13:56
写教程类的排版挺累 不错了

是的,格式不那么好,特别是论坛的插入代码及代码高亮功能不行

0

主题

1

帖子

21

积分

22:00筑基期

Rank: 1

积分
21
发表于 2019-10-4 23:28:37 | 显示全部楼层
祝愿SOUI发展的越来越好!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|SOUI官方论坛 ( 粤ICP备18103663号-2 )

GMT+8, 2019-10-17 03:28

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表