1.继续完成Clean项目

1.1 我们给第三个标签 “设置目录” 添加一个新的对话框

1.新建一个对话框,给对话框添加树形控件 Tree Control 、选择控件 Combo-box Control 、以及三个按钮 Button ;
2.更改新建对话框的属性: Border 改为 None ,Style 改为 Child ,ID 改为 IDD_SETDLG ;
3.给新建对话框添加一个类,右键添加类: CSetDlg ;
4.在 CTabCtrl 类中添加 CSetDlg 对象,并在 CMyTabCtrl::InitTabCtrl 函数中初始化对话框;

void CMyTabCtrl::InitTabCtrl()
{//this->InsertItem(0, L"清扫目录");//this->InsertItem(1, L"显示目录");//this->InsertItem(2, L"设置目录");//this->InsertItem(3, L"删除目录");// 将上述代码写为一个循环for(int i=0; i<4; i++){CString str;str.LoadString(IDS_CLRDIR+i);this->InsertItem(i, str);}// 改变tab的大小CSize size(0, 20);this->SetItemSize(size);// ======================添加一个show对话框,非模态对话框======================m_showdlg.Create(IDD_SHOWDLG, this);m_showdlg.ShowWindow(SW_SHOW);// ======================把show对话框向下移动================================RECT rect;this->GetClientRect(&rect);rect.top += 22;rect.bottom += 22;m_showdlg.MoveWindow(&rect);// =====================设置目录对话框===============================m_setdlg.Create(IDD_SETDLG, this);m_setdlg.ShowWindow(SW_HIDE);m_setdlg.MoveWindow(&rect);
}

5.程序运行后发现只能显示一个对话框,即 SetDlg 和 ShowDlg 之间只能显示一个,移动鼠标经过控件时才显现控件,因此我们需要解决这个问题;
6.对于上述问题,我们需要给 CMyTabCtrl 类添加一个点击的消息: OnNMClick 消息;
7.在 CMyTabCtrl::OnNMClick 消息处理函数中我们首先判断点击的是第几个标签,再进行变换 ShowWindow 的参数即可完成切换;

void CMyTabCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{// 判断点击第几个标签项int index = this->GetCurSel();if(index != -1){switch (index){case 0:{m_showdlg.ShowWindow(SW_SHOW);m_setdlg.ShowWindow(SW_HIDE);}break;case 1:{}break;case 2:{m_showdlg.ShowWindow(SW_HIDE);m_setdlg.ShowWindow(SW_SHOW);}break;case 3:break;default:break;}}*pResult = 0;
}

1.2 给主对话框继续添加控件

1.首先将主对话框拉长,并在拉长出来的部分添加一个 Listbox Control 、两个按钮 Button ;
2.此时运行程序,将显示我们拉长之后的对话框,现在我们意图不显示下面一半,只显示主对话框的上面一半;
3.我们需要在 CCleanDlg::OnPaint 函数中来设置,因为若在 CCleanDlg::OnInitDialog 函数中进行设置,我们获取的坐标是错误的,因此我们需要在 CCleanDlg::OnPaint 中进行设置;
4.由于我们并不是一直只想显示一半,因此需要一个 bool 型变量来进行记录: bool m_is_change_main_wnd ;并在构造函数中给 m_is_change_main_wnd 一个默认值 false ;
5.在 CCleanDlg::OnPaint 函数中,我们首先判断是否要进行显示,由于我们希望对话框一出来只显示一半,因此我们判断 m_is_change_main_wnd 是否是 false ,是则只显示一半;
6.首先获取对话框相对于系统的坐标: RECT rect ; this->GetWindowRect(&rect) ;
7.将矩形的下部坐标减小: rect.bottom -= 200 ;
8.裁剪对话框: this->MoveWindow(&rect) ;

void CCleanDlg::OnPaint()
{// =================================只显示一半主窗口==============================if(m_is_change_main_wnd == false){RECT rect;this->GetWindowRect(&rect);rect.bottom -= 200;this->MoveWindow(&rect);m_is_change_main_wnd = true;}// =================================只显示一半主窗口==============================... ...
}

1.3 现在我们想当我们点击第二个标签时进行对话框的放大缩小

1.首先设置一个 bool 变量来进行记录放大还是缩小: bool m_is_change_wnd_size ;
2.在 CMyTabCtrl 类中的 CMyTabCtrl::OnNMClick 点击函数中若点击第二个标签,则我们进行切换对话框大小;
3.首先需要获取主对话框的矩形坐标(需要的是主对话框的句柄而不是 Tab 的句柄): RECT rect ; AfxGetMainWnd()->GetWindowRect(&rect) ;
4.若要变大,则将矩形底部增大: rect.bottom += 200 ;
5.若要变小,则将矩形底部减小: rect.bottom -= 200 ;
6.裁剪对话框并更改记录变量: m_is_change_wnd_size = !m_is_change_wnd_size ; AfxGetMainWnd()->MoveWindow(&rect) ;

void CMyTabCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{// 判断点击第几个标签项int index = this->GetCurSel();if(index != -1){switch (index){case 0:{m_showdlg.ShowWindow(SW_SHOW);m_setdlg.ShowWindow(SW_HIDE);}break;case 1:{RECT rect;AfxGetMainWnd()->GetWindowRect(&rect);if (m_is_change_wnd_size == false)           // 变大{rect.bottom += 200;}else{rect.bottom -= 200;}m_is_change_wnd_size = !m_is_change_wnd_size;AfxGetMainWnd()->MoveWindow(&rect);}break;case 2:{m_showdlg.ShowWindow(SW_HIDE);m_setdlg.ShowWindow(SW_SHOW);}break;case 3:break;default:break;}}*pResult = 0;
}

接下来完成每个小对话框的功能。

1.4 每个小对话框我们都需要能够将文件夹的路径显示出来,因此我们将获取文件夹路径的函数写到 CleanApp 类中

1.在 CleanApp 类中定义一个函数: static CString GetBrowseFolderPath(CWnd *pWnd) ;
2.使用 ::SHBrowseForFolder(&bi) 函数弹出一个文件夹选择对话框,参数类型为 BROWSEINFO ,是一个结构体,需要自己定义;

CString CCleanApp::GetBrowseFolderPath(CWnd *pWnd)
{wchar_t wszFolderName[MAX_PATH] = {0};            // 接收文件夹的名字BROWSEINFO bi;bi.hwndOwner = pWnd->m_hWnd;                   // 哪个窗口拥有这个对话框bi.pidlRoot = 0;                             // 0表示从桌面开始浏览(桌面为根目录)bi.pszDisplayName = wszFolderName;                // 接收文件夹的名字bi.lpszTitle = L"来选一个吧~";                 // 标题bi.ulFlags = 0;                                   // 是否添加其他控件bi.iImage = 0;bi.lpfn = 0;bi.lParam = 0;              PCIDLIST_ABSOLUTE pa = ::SHBrowseForFolder(&bi);       // 显示一个浏览文件夹对话框return L"";
}

3.给 ShowDlg 对话框的三个按钮添加点击消息,双击每个按钮即可添加消息;
4.在第一个按钮的处理消息 CShowDlg::OnBnClickedButton1 中,调用上述静态函数 CString strPath = CCleanApp::GetBrowseFolderPath(this) ;
5.此时获取的 wszFolderName 中就存有选中的文件夹的名字;
6.我们不只想获取文件夹名,还想获取文件夹的路径,因此我们需要另一个函数 ::SHGetPathFromIDList 来获取文件夹路径的字符串;

CString CCleanApp::GetBrowseFolderPath(CWnd *pWnd)
{wchar_t wszFolderName[MAX_PATH] = {0};            // 接收文件夹的名字wchar_t wszFolderPath[MAX_PATH] = {0};          // 接收文件夹路径的名字BROWSEINFO bi;bi.hwndOwner = pWnd->m_hWnd;                 // 哪个窗口拥有这个对话框bi.pidlRoot = 0;                             // 从桌面开始浏览bi.pszDisplayName = wszFolderName;               // 接收文件夹的名字bi.lpszTitle = L"来选一个吧~";                 // 标题bi.ulFlags = 0;                                   // 是否添加其他控件bi.iImage = 0;bi.lpfn = 0;                                 // 处理函数bi.lParam = 0;              PCIDLIST_ABSOLUTE pa = ::SHBrowseForFolder(&bi);       // 显示一个浏览文件夹对话框if(NULL != pa){// 获取路径if(::SHGetPathFromIDList(pa, wszFolderPath) == TRUE){// 返回路径return wszFolderPath;}}return L"";
}

1.5 为了将路径文本添加到对话框的控件上,我们需要给控件 List Control 添加一个类

1.在类视图中右键添加MFC类,继承 CListCtrl 类: CListCtrlShowPath ;
2.在 ShowDlg 对话框中的 List Control 控件上右键选择添加变量,变量类型是 CListCtrlShowPath ,名字为 m_lcShowPath ;已经自动绑定好了控件与变量,为了保险起见自己查看一下是否绑定成功,否则需要自己手动绑定;
3.在 ShowDlg 对话框的 CShowDlg::OnBnClickedButton1 函数中去插入选中的文件夹路径;获取插入的位置我们使用 CListCtrl 类的成员函数 GetItemCount ;

void CShowDlg::OnBnClickedButton1()
{// 调用显示文件夹的函数CString strPath = CCleanApp::GetBrowseFolderPath(this);if(strPath != L""){// 在列表插入路径m_lcShowPath.InsertItem(m_lcShowPath.GetItemCount(), strPath);}
}

4.我们发现插入的路径文本显示是一块一块的,因此需要修改一下 List Control 的属性: View 改为 List ;

1.6 我们现在想给我们添加的路径前加上一个小方框,点击则出现对勾

1.这其实就是列表的风格,将列表的风格更改为复选风格即可;
2.给 ShowDlg 类添加一个 virtual BOOL OnInitDialog() 函数用来对列表的风格进行改变,我们通过选择 类视图->ShowDlg属性->重写(在消息旁边)->OnInitDialog ;

BOOL CShowDlg::OnInitDialog()
{CDialogEx::OnInitDialog();m_lcShowPath.SetExtendedStyle(LVS_EX_CHECKBOXES);return TRUE;
}

1.7 给 ShowDlg 对话框上的第二个按钮“删除目录”进行完成

1.对于“删除目录”,我们需要判断哪些目录是我们选中的,因此首先需要进行遍历列表;
2.在遍历列表的过程中判断是否被选中(即有对勾),被选中则删除,但是需要注意,在删除index为1的目录之后,原index为2的目录就会减小一个变为1,因此我们需要将判断计数进行–才正确;

void CShowDlg::OnBnClickedButton2()
{// 删除选中的文件夹for(int i=0; i<m_lcShowPath.GetItemCount(); i++){// 判断i这一项是不是被选中if(m_lcShowPath.GetCheck(i) == TRUE){m_lcShowPath.DeleteItem(i);i--;}}
}

1.8 给 ShowDlg 对话框上的第二个按钮“清空目录”进行完成

1.就是将列表上的元素全部删除

void CShowDlg::OnBnClickedButton3()
{// 删除所有m_lcShowPath.DeleteAllItems();
}

C++学习 2019-1-20相关推荐

  1. 18天精读掌握《费曼物理学讲义卷一》 第7天 2019.6.20

    18天精读掌握<费曼物理学讲义卷一> 第7天 2019.6.20 1. 18日掌握<费曼物理学讲义>卷一计划概览 2. 今日学习成 3. 今日时间表 4.Atimelogger ...

  2. 2019/4/20华为西安研究所研发面试 面经

    2019/4/20号面试    24号收到正式offer 一面 半个小时 面试官年纪比较大了,可能是下午,也不太想理我. 自我介绍? 讲第一个项目?他根本不看也不怎么听 讲完说你这个哪里哪里不对,哪里 ...

  3. 【深度学习】Github 最受欢迎的深度学习项目 TOP 20

    必须做好一些是LINUX平台,甚至没有教材根本需要摸索学习的准备,如果有那个变成为在线服务的请第一时间通知我们 截止到 2017年 5月14日,Github 最受欢迎的深度学习项目 TOP 20 是哪 ...

  4. 深度学习笔记(20) 端到端学习

    深度学习笔记(20) 端到端学习 1. 端到端的深度学习概念 2. 语音识别的端到端学习 3. 人脸识别的端到端学习 4. 机器翻译的端到端学习 5. 非端到端 6. 端到端的优缺点 7. 端到端的关 ...

  5. 【2019.08.20】 python 下载wallhaven壁纸原图, 分别使用同步、异步方式(aiohttp_requests,aiofiles),对比下载速度

    本次主要是研究分别使用同步异步的方式下载壁纸原图 'https://alpha.wallhaven.cc/latest'在速度方面的差异 在解析网页时发现原图url不在图片列表页显示,只显示了小图,在 ...

  6. 《游戏设计艺术(第2版)》——学习笔记(20)第20章 世界中的角色

    <游戏设计艺术(第2版)>学习笔记(20) 第20章 世界中的角色 游戏角色的本质 小说角色 电影角色 游戏角色 化身 理想型 白板 创造令人信服的游戏角色 角色窍门1:列出角色的功能 角 ...

  7. 小猪的Python学习之旅 —— 20.抓取Gank.io所有数据存储到MySQL中

    小猪的Python学习之旅 -- 20.抓取Gank.io所有数据存储到MySQL中 标签:Python 一句话概括本文: 内容较多,建议先mark后看,讲解了一波MySQL安装,基本操作,语法速成, ...

  8. 深度学习中的20种卷积

    1. 引言 卷积,是卷积神经网络中最重要的组件之一.不同的卷积结构有着不一样的功能,但本质上都是用于提取特征.比如,在传统图像处理中,人们通过设定不同的算子来提取诸如边缘.水平.垂直等固定的特征.而在 ...

  9. 一文看尽深度学习中的20种卷积(附源码整理和论文解读)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 引言 卷积,是卷积神经网络中最重要的组件之一.不同的卷积结构有着不一样的功能,但本质上都是用于提取特征 ...

  10. Java基础学习总结(20)——基础语法

    2019独角兽企业重金招聘Python工程师标准>>> 一.标识符 二.关键字 三.JAVA基础数据类型 3.1. java常量 3.2. java变量 从本质上来讲,变量其实是内存 ...

最新文章

  1. 【基础不牢地动山摇】一遍记住 Java 面试中常用的八种排序算法与代码实现!...
  2. R语言常用线性模型特征筛选(feature selection)技术实战:基于前列腺特异性抗原(PSA)数据
  3. 古巴雪茄高希霸世纪1.2.3.4.5.6.半世纪7款雪茄的区别?
  4. 提高vb -》excel数据的导入速度
  5. 卷积神经网络结构_卷积神经网络
  6. Linux shell脚本中如何读取跟shell脚本同一目录下的配置文件
  7. 【语音隐藏】基于matlab LSB语音信息隐藏【含Matlab源码 577期】
  8. jmp怎么做合并的箱线图_基于JMP 15的箱线图(Box Plot)的着色
  9. 服务器上运行python
  10. mysql 查询重复数据并删除
  11. Springboot集成Mybatis怎么在控制台打印sql语句
  12. 电感的饱和电流 均方值电流 额定电流的认识
  13. 百色职称计算机,百色报考职称高级
  14. 浅析安全架构中遇到的问题
  15. ubuntu中安装软件的方法
  16. 基于java+jsp+ssm工程车辆租赁系统
  17. linux 命令安装 wine,Wine安装使用(适用Linux Mint 19与Ubuntu 18.04下)
  18. 能力态度必不可少,能力大于态度
  19. 手机网络抓包 转载记录http://blog.csdn.net/skylin19840101/article/details/43485911
  20. 如何用SPSS分析调查问卷和撰写调查报告?【SPSS 064期】

热门文章

  1. 天刀服务器的位置2018,2018年天涯明月刀开服 | 手游网游页游攻略大全
  2. 数据库:函数依赖的公理系统
  3. 视觉融合里程计SLAM算法SE2Lam解析-论文篇
  4. 票务管理系统项目(part1)
  5. udb和udbx的区别_DB2 UDB,WebSphere和iBATIS
  6. python的一些奇淫巧技
  7. windows 设置全局快捷键;
  8. 用嘉立创画pcb布局布线技巧
  9. 易语言linux计时器,易语言编写linux程序
  10. JS引起内存泄漏的情况