SOUI官方论坛

 找回密码
 立即注册
查看: 10080|回复: 16

小白入门教程(四)

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

    [LV.10]以坛为家III

    580

    主题

    1340

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28797
    发表于 2019-8-2 16:22:15 | 显示全部楼层 |阅读模式
        上节我们使用SOUIEditor完成了软件界面的设计,本节继续完成功能代码。本软件的功能是将指定目录下所有TXT文件合并为一个TXT且不能出现乱码。
        在使用SOUIEditor时我们不需要打开VS,编辑好界面后,我们保存好并关闭SOUIEditor。打开VS,编译,当前界面如下:
        5.jpg
        目前软件还没有添加功能,点击按钮和填写路径都是没有反应的。
        在MainDlg.h中添加按钮响应事件,格式如下:
        在EVENT_MAP_BEGIN()和EVENT_MAP_END()之间,添加EVENT_NAME_COMMAND(L"btn_select", OnBtnSelect),并添加OnBtnSelect过程。其中btn_select即为“选择目录”按钮的name属性值,OnBtnSelect为此按钮点击时关联的过程,在此过程中可以添加一些功能性代码。在本例中,点击此按钮会打开一个对话框,用于选择TXT文件的目录。
        6.jpg
       然后添加OnBtnSelect的代码。
    1. void CMainDlg::OnBtnSelect()
    2. {
    3.         WCHAR szFile[MAX_PATH + 1] = { 0 };
    4.         WCHAR szTitle[MAX_PATH] = L"请选择保存文件夹";
    5.         BROWSEINFO bsf;
    6.         ZeroMemory(&bsf, sizeof(BROWSEINFO));
    7.         bsf.hwndOwner = m_hWnd;
    8.         bsf.pszDisplayName = szFile;
    9.         bsf.lpszTitle = szTitle;
    10.         bsf.ulFlags = BIF_RETURNONLYFSDIRS;

    11.         PIDLIST_ABSOLUTE pListABS = SHBrowseForFolder(&bsf);
    12.         if (NULL == pListABS)
    13.         {
    14.                 return;
    15.         }

    16.         if (!SHGetPathFromIDList(pListABS, szFile))
    17.         {
    18.                 return;
    19.         }

    20.         //添加选定目录到编辑框
    21.         SEdit *pEdit = FindChildByName2<SEdit>(L"path");
    22.         if(pEdit)
    23.         {
    24.                 pEdit->SetWindowText(szFile);
    25.         }
    26. }
    复制代码
    编译运行,可实现将选择的目录显示在编辑框中。      9.jpg

        下面继续编辑OnBtnSelect过程,当选定目录后,要遍历目录下的TXT文件,并将TXT文件的文件名显示在listctrl中。如何使用listctrl,我们还是先看看demo中是如何使用的吧。为便于理解,删除了代码中无关的部分,只保存listctrl部分。
    1. void CMainDlg::InitListCtrl()
    2. {
    3.     //找到列表控件
    4.     SListCtrl *pList=FindChildByName2<SListCtrl>(L"lc_test");
    5.     if(pList)
    6.     {
    7.         //列表控件的唯一子控件即为表头控件
    8.         SWindow *pHeader=pList->GetWindow(GSW_FIRSTCHILD);
    9.         //向表头控件订阅表明点击事件,并把它和OnListHeaderClick函数相连。
    10.         pHeader->GetEventSet()->subscribeEvent(EVT_HEADER_CLICK,Subscriber(&CMainDlg::OnListHeaderClick,this));

    11.         TCHAR sz***[][5]={_T("男"),_T("女"),_T("人妖")};
    12.         for(int i=0;i<100;i++)
    13.         {
    14.             student *pst=new student;
    15.             _stprintf(pst->szName,_T("学生_%d"),i+1);
    16.             _tcscpy(pst->sz***,sz***[rand()%3]);
    17.             pst->age=rand()%30;
    18.             pst->score=rand()%60+40;

    19.             int iItem=pList->InsertItem(i,pst->szName);
    20.             pList->SetItemData(iItem,(LPARAM)pst);
    21.             pList->SetSubItemText(iItem,1,pst->sz***);
    22.             TCHAR szBuf[10];
    23.             _stprintf(szBuf,_T("%d"),pst->age);
    24.             pList->SetSubItemText(iItem,2,szBuf);
    25.             _stprintf(szBuf,_T("%d"),pst->score);
    26.             pList->SetSubItemText(iItem,3,szBuf);
    27.         }
    28.     }
    29. }
    复制代码
       listctrl中数据是自己持有的,不像其它的表格,还要Adapter。    关于文件的相关***作,我这里就不造***子,在SOUI的第三方demo中(SoTool项目),有好用的***CFileHelp,我们直接拿来使用。(这里为方便讲解,对内容进行了删减)。这个类包含以下几个函数,足够使用了。
    1. #pragma once
    2. #include "stdafx.h"
    3. #include <vector>
    4. using namespace std;

    5. class CFileHelp
    6. {
    7. public:
    8.         CFileHelp(void);
    9.         ~CFileHelp(void);
    10. public:
    11.         
    12.         
    13.         //打开对话框 lpstrFilter:过滤字符串   hwndOwner:父窗口  fileNames:完整文件路径
    14.         static BOOL OpenFile(LPCWSTR lpstrFilter, HWND hwndOwner, vector<SStringT> &fileNames, bool IsMulti = true);
    15.         //把一个绝对路径拆分成,文件名、扩展名
    16.         static void SplitPathFileName(SStringT fileName, SStringT &szName, SStringT &szExt);
    17.         // 浏览文件夹 path:路径  hwndOwner : 父窗口  tile : 窗口标题
    18.         static BOOL BrowseDir(SStringT &path, HWND hwndOwner, SStringT title);
    19.         // 检查文件后缀名 pstrPath:文件路径 pstrExtFilter:过滤列表
    20.         static bool FindFileExt(LPCTSTR pstrPath, LPCTSTR pstrExtFilter);
    21.         //递归遍历当前目录内文件文件
    22.         static void EnumerateFiles(vector<SStringT> &vctString, LPCTSTR p_strExtFilter);
    23.         //得到文件的大小
    24.         static DWORD GetFileSize(LPCTSTR fileName);

    25.         //文件大小转换为字符换: xx.xxM
    26.         static LPCTSTR FileSizeToString(DWORD dwSize);

    27.         //文件总时间04:00
    28.         static SStringT TimeToToleString(int time);
    29.         //检查文件是否存在
    30.         static BOOL CheckFileExist(SStringT pathFileName);
    31. };
    复制代码

    OnBtnSelect添加代码后如下:
    1. void CMainDlg::OnBtnSelect()
    2. {
    3.         WCHAR szFile[MAX_PATH + 1] = { 0 };
    4.         WCHAR szTitle[MAX_PATH] = L"请选择保存文件夹";
    5.         BROWSEINFO bsf;
    6.         ZeroMemory(&bsf, sizeof(BROWSEINFO));
    7.         bsf.hwndOwner = m_hWnd;
    8.         bsf.pszDisplayName = szFile;
    9.         bsf.lpszTitle = szTitle;
    10.         bsf.ulFlags = BIF_RETURNONLYFSDIRS;

    11.         PIDLIST_ABSOLUTE pListABS = SHBrowseForFolder(&bsf);
    12.         if (NULL == pListABS)
    13.         {
    14.                 return;
    15.         }

    16.         if (!SHGetPathFromIDList(pListABS, szFile))
    17.         {
    18.                 return;
    19.         }

    20.         //添加选定目录到编辑框
    21.         SEdit *pEdit = FindChildByName2<SEdit>(L"path");
    22.         if(pEdit)
    23.         {
    24.                 pEdit->SetWindowText(szFile);
    25.         }

    26.         //遍历指定目录下的TXT文件,添加文件名到listctrl中
    27.         std::vector<SStringT> vctString;
    28.         ::SetCurrentDirectory(szFile);
    29.         CFileHelp::EnumerateFiles(vctString,L".txt;");
    30.         //找到列表控件
    31.         SListCtrl *pList=FindChildByName2<SListCtrl>(L"filelist");
    32.         if(pList)
    33.         {
    34.                 for(int i=0;i<(int)vctString.size();i++)
    35.                 {
    36.                         int iItem=pList->InsertItem(i,vctString.at(i));
    37.                 }
    38.         }
    39. }
    复制代码
      目前界面效果如下:
        10.jpg



  • TA的每日心情
    奋斗
    2022-7-4 09:45
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    59

    主题

    588

    帖子

    5481

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5481

    突出贡献优秀版主

    发表于 2019-8-2 21:46:42 | 显示全部楼层
    :P:P:P
    回复

    使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 942 天

    [LV.10]以坛为家III

    580

    主题

    1340

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28797
     楼主| 发表于 2019-8-2 22:07:21 | 显示全部楼层

    看看有没有错误、内存泄漏什么的
  • TA的每日心情
    开心
    2021-3-5 11:17
  • 签到天数: 1 天

    [LV.1]初来乍到

    5

    主题

    41

    帖子

    228

    积分

    02:00元婴期

    Rank: 3Rank: 3

    积分
    228
    发表于 2019-8-26 10:52:26 | 显示全部楼层
    这教程好!适合我等小白。
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 942 天

    [LV.10]以坛为家III

    580

    主题

    1340

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28797
     楼主| 发表于 2019-8-26 11:31:13 | 显示全部楼层
    guanhuaming 发表于 2019-8-26 10:52
    这教程好!适合我等小白。

    觉得有用的话我会继续往下写,有空我会写一个QQ垃圾表情清理的,用实例项目练手
  • TA的每日心情
    奋斗
    2024-3-15 15:43
  • 签到天数: 104 天

    [LV.6]常住居民II

    5

    主题

    47

    帖子

    950

    积分

    04:00化神期

    Rank: 4

    积分
    950
    发表于 2019-12-3 14:57:36 | 显示全部楼层
    CFileHelp,这个文件在哪找的到。
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 942 天

    [LV.10]以坛为家III

    580

    主题

    1340

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28797
     楼主| 发表于 2019-12-3 15:29:50 | 显示全部楼层
    caryone 发表于 2019-12-3 14:57
    CFileHelp,这个文件在哪找的到。

    SOUI目录中,你搜索就能找到
  • TA的每日心情
    奋斗
    2024-3-15 15:43
  • 签到天数: 104 天

    [LV.6]常住居民II

    5

    主题

    47

    帖子

    950

    积分

    04:00化神期

    Rank: 4

    积分
    950
    发表于 2019-12-3 17:21:32 | 显示全部楼层
    教程还会持续更新嘛?
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 942 天

    [LV.10]以坛为家III

    580

    主题

    1340

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28797
     楼主| 发表于 2019-12-3 17:28:15 | 显示全部楼层
    caryone 发表于 2019-12-3 17:21
    教程还会持续更新嘛?

    有什么不明白的请留言,根据反馈再更新后续教程
  • TA的每日心情
    开心
    2020-3-1 10:09
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    1

    主题

    14

    帖子

    127

    积分

    24:00金丹期

    Rank: 2

    积分
    127
    发表于 2020-1-16 11:52:07 | 显示全部楼层
    admin 发表于 2019-12-3 15:29
    SOUI目录中,你搜索就能找到

    具体在哪个文件呢,我没搜索到,感谢
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-4 05:55

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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