SOUI官方论坛

 找回密码
 立即注册
查看: 3899|回复: 5

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

[复制链接]
  • TA的每日心情
    开心
    前天 22:51
  • 签到天数: 946 天

    [LV.10]以坛为家III

    581

    主题

    1343

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

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


         下面获取指定目录下,所有子目录下所有文件的预览(若为为图片,则使用默认图片,这样清理垃圾文件就不局限于图片文件了)。
          定义变量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.                 }
    复制代码
    8.png
    感觉那个checkbox多余,去掉。
        从SoTool可复制MD5的类,添加相应的代码,实现对黑名单内的文件进行MD5计算
        9.png
       然后再创建一个计算QQ内表情的,两个for循环+if判断,是的话就删除,不是的话继续。
       目前TileView的功能已经实现,mclistview的我就不写了,我只加了一个text来显示进度,自己用就这样吧。demo功用完成但界面交互不完整。教程太初级,没人看,就这样吧
        QQCleaner.rar (37.96 KB, 下载次数: 1, 售价: 1 SOUI币)


  • TA的每日心情
    慵懒
    2024-1-24 14:08
  • 签到天数: 313 天

    [LV.8]以坛为家I

    13

    主题

    114

    帖子

    6011

    积分

    08:00大乘期

    Rank: 8Rank: 8

    积分
    6011
    发表于 2019-9-3 13:56:53 | 显示全部楼层
    写教程类的排版挺累 不错了
  • TA的每日心情
    开心
    前天 22:51
  • 签到天数: 946 天

    [LV.10]以坛为家III

    581

    主题

    1343

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28876
     楼主| 发表于 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发展的越来越好!
  • TA的每日心情
    开心
    2020-3-1 10:09
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    1

    主题

    14

    帖子

    127

    积分

    24:00金丹期

    Rank: 2

    积分
    127
    发表于 2020-2-6 10:48:42 | 显示全部楼层
    学习了,谢谢

    该用户从未签到

    1

    主题

    35

    帖子

    43

    积分

    22:00筑基期

    Rank: 1

    积分
    43
    发表于 2020-4-16 18:28:40 | 显示全部楼层
    谢谢分享,看看
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛

    GMT+8, 2024-5-18 13:34

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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