TA的每日心情 | 开心 6 天前 |
---|
签到天数: 942 天 [LV.10]以坛为家III
管理员
- 积分
- 28797
|
上节我们使用SOUIEditor完成了软件界面的设计,本节继续完成功能代码。本软件的功能是将指定目录下所有TXT文件合并为一个TXT且不能出现乱码。
在使用SOUIEditor时我们不需要打开VS,编辑好界面后,我们保存好并关闭SOUIEditor。打开VS,编译,当前界面如下:
目前软件还没有添加功能,点击按钮和填写路径都是没有反应的。
在MainDlg.h中添加按钮响应事件,格式如下:
在EVENT_MAP_BEGIN()和EVENT_MAP_END()之间,添加EVENT_NAME_COMMAND(L"btn_select", OnBtnSelect),并添加OnBtnSelect过程。其中btn_select即为“选择目录”按钮的name属性值,OnBtnSelect为此按钮点击时关联的过程,在此过程中可以添加一些功能性代码。在本例中,点击此按钮会打开一个对话框,用于选择TXT文件的目录。
然后添加OnBtnSelect的代码。- void CMainDlg::OnBtnSelect()
- {
- WCHAR szFile[MAX_PATH + 1] = { 0 };
- WCHAR szTitle[MAX_PATH] = L"请选择保存文件夹";
- BROWSEINFO bsf;
- ZeroMemory(&bsf, sizeof(BROWSEINFO));
- bsf.hwndOwner = m_hWnd;
- bsf.pszDisplayName = szFile;
- bsf.lpszTitle = szTitle;
- bsf.ulFlags = BIF_RETURNONLYFSDIRS;
- PIDLIST_ABSOLUTE pListABS = SHBrowseForFolder(&bsf);
- if (NULL == pListABS)
- {
- return;
- }
- if (!SHGetPathFromIDList(pListABS, szFile))
- {
- return;
- }
- //添加选定目录到编辑框
- SEdit *pEdit = FindChildByName2<SEdit>(L"path");
- if(pEdit)
- {
- pEdit->SetWindowText(szFile);
- }
- }
复制代码 编译运行,可实现将选择的目录显示在编辑框中。
下面继续编辑OnBtnSelect过程,当选定目录后,要遍历目录下的TXT文件,并将TXT文件的文件名显示在listctrl中。如何使用listctrl,我们还是先看看demo中是如何使用的吧。为便于理解,删除了代码中无关的部分,只保存listctrl部分。- void CMainDlg::InitListCtrl()
- {
- //找到列表控件
- SListCtrl *pList=FindChildByName2<SListCtrl>(L"lc_test");
- if(pList)
- {
- //列表控件的唯一子控件即为表头控件
- SWindow *pHeader=pList->GetWindow(GSW_FIRSTCHILD);
- //向表头控件订阅表明点击事件,并把它和OnListHeaderClick函数相连。
- pHeader->GetEventSet()->subscribeEvent(EVT_HEADER_CLICK,Subscriber(&CMainDlg::OnListHeaderClick,this));
- TCHAR sz***[][5]={_T("男"),_T("女"),_T("人妖")};
- for(int i=0;i<100;i++)
- {
- student *pst=new student;
- _stprintf(pst->szName,_T("学生_%d"),i+1);
- _tcscpy(pst->sz***,sz***[rand()%3]);
- pst->age=rand()%30;
- pst->score=rand()%60+40;
- int iItem=pList->InsertItem(i,pst->szName);
- pList->SetItemData(iItem,(LPARAM)pst);
- pList->SetSubItemText(iItem,1,pst->sz***);
- TCHAR szBuf[10];
- _stprintf(szBuf,_T("%d"),pst->age);
- pList->SetSubItemText(iItem,2,szBuf);
- _stprintf(szBuf,_T("%d"),pst->score);
- pList->SetSubItemText(iItem,3,szBuf);
- }
- }
- }
复制代码 listctrl中数据是自己持有的,不像其它的表格,还要Adapter。 关于文件的相关***作,我这里就不造***子,在SOUI的第三方demo中(SoTool项目),有好用的***CFileHelp,我们直接拿来使用。(这里为方便讲解,对内容进行了删减)。这个类包含以下几个函数,足够使用了。
- #pragma once
- #include "stdafx.h"
- #include <vector>
- using namespace std;
- class CFileHelp
- {
- public:
- CFileHelp(void);
- ~CFileHelp(void);
- public:
-
-
- //打开对话框 lpstrFilter:过滤字符串 hwndOwner:父窗口 fileNames:完整文件路径
- static BOOL OpenFile(LPCWSTR lpstrFilter, HWND hwndOwner, vector<SStringT> &fileNames, bool IsMulti = true);
- //把一个绝对路径拆分成,文件名、扩展名
- static void SplitPathFileName(SStringT fileName, SStringT &szName, SStringT &szExt);
- // 浏览文件夹 path:路径 hwndOwner : 父窗口 tile : 窗口标题
- static BOOL BrowseDir(SStringT &path, HWND hwndOwner, SStringT title);
- // 检查文件后缀名 pstrPath:文件路径 pstrExtFilter:过滤列表
- static bool FindFileExt(LPCTSTR pstrPath, LPCTSTR pstrExtFilter);
- //递归遍历当前目录内文件文件
- static void EnumerateFiles(vector<SStringT> &vctString, LPCTSTR p_strExtFilter);
- //得到文件的大小
- static DWORD GetFileSize(LPCTSTR fileName);
- //文件大小转换为字符换: xx.xxM
- static LPCTSTR FileSizeToString(DWORD dwSize);
- //文件总时间04:00
- static SStringT TimeToToleString(int time);
- //检查文件是否存在
- static BOOL CheckFileExist(SStringT pathFileName);
- };
复制代码
OnBtnSelect添加代码后如下:- void CMainDlg::OnBtnSelect()
- {
- WCHAR szFile[MAX_PATH + 1] = { 0 };
- WCHAR szTitle[MAX_PATH] = L"请选择保存文件夹";
- BROWSEINFO bsf;
- ZeroMemory(&bsf, sizeof(BROWSEINFO));
- bsf.hwndOwner = m_hWnd;
- bsf.pszDisplayName = szFile;
- bsf.lpszTitle = szTitle;
- bsf.ulFlags = BIF_RETURNONLYFSDIRS;
- PIDLIST_ABSOLUTE pListABS = SHBrowseForFolder(&bsf);
- if (NULL == pListABS)
- {
- return;
- }
- if (!SHGetPathFromIDList(pListABS, szFile))
- {
- return;
- }
- //添加选定目录到编辑框
- SEdit *pEdit = FindChildByName2<SEdit>(L"path");
- if(pEdit)
- {
- pEdit->SetWindowText(szFile);
- }
- //遍历指定目录下的TXT文件,添加文件名到listctrl中
- std::vector<SStringT> vctString;
- ::SetCurrentDirectory(szFile);
- CFileHelp::EnumerateFiles(vctString,L".txt;");
- //找到列表控件
- SListCtrl *pList=FindChildByName2<SListCtrl>(L"filelist");
- if(pList)
- {
- for(int i=0;i<(int)vctString.size();i++)
- {
- int iItem=pList->InsertItem(i,vctString.at(i));
- }
- }
- }
复制代码 目前界面效果如下:
|
|