C++学习 2019-1-20
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相关推荐
- 18天精读掌握《费曼物理学讲义卷一》 第7天 2019.6.20
18天精读掌握<费曼物理学讲义卷一> 第7天 2019.6.20 1. 18日掌握<费曼物理学讲义>卷一计划概览 2. 今日学习成 3. 今日时间表 4.Atimelogger ...
- 2019/4/20华为西安研究所研发面试 面经
2019/4/20号面试 24号收到正式offer 一面 半个小时 面试官年纪比较大了,可能是下午,也不太想理我. 自我介绍? 讲第一个项目?他根本不看也不怎么听 讲完说你这个哪里哪里不对,哪里 ...
- 【深度学习】Github 最受欢迎的深度学习项目 TOP 20
必须做好一些是LINUX平台,甚至没有教材根本需要摸索学习的准备,如果有那个变成为在线服务的请第一时间通知我们 截止到 2017年 5月14日,Github 最受欢迎的深度学习项目 TOP 20 是哪 ...
- 深度学习笔记(20) 端到端学习
深度学习笔记(20) 端到端学习 1. 端到端的深度学习概念 2. 语音识别的端到端学习 3. 人脸识别的端到端学习 4. 机器翻译的端到端学习 5. 非端到端 6. 端到端的优缺点 7. 端到端的关 ...
- 【2019.08.20】 python 下载wallhaven壁纸原图, 分别使用同步、异步方式(aiohttp_requests,aiofiles),对比下载速度
本次主要是研究分别使用同步异步的方式下载壁纸原图 'https://alpha.wallhaven.cc/latest'在速度方面的差异 在解析网页时发现原图url不在图片列表页显示,只显示了小图,在 ...
- 《游戏设计艺术(第2版)》——学习笔记(20)第20章 世界中的角色
<游戏设计艺术(第2版)>学习笔记(20) 第20章 世界中的角色 游戏角色的本质 小说角色 电影角色 游戏角色 化身 理想型 白板 创造令人信服的游戏角色 角色窍门1:列出角色的功能 角 ...
- 小猪的Python学习之旅 —— 20.抓取Gank.io所有数据存储到MySQL中
小猪的Python学习之旅 -- 20.抓取Gank.io所有数据存储到MySQL中 标签:Python 一句话概括本文: 内容较多,建议先mark后看,讲解了一波MySQL安装,基本操作,语法速成, ...
- 深度学习中的20种卷积
1. 引言 卷积,是卷积神经网络中最重要的组件之一.不同的卷积结构有着不一样的功能,但本质上都是用于提取特征.比如,在传统图像处理中,人们通过设定不同的算子来提取诸如边缘.水平.垂直等固定的特征.而在 ...
- 一文看尽深度学习中的20种卷积(附源码整理和论文解读)
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 引言 卷积,是卷积神经网络中最重要的组件之一.不同的卷积结构有着不一样的功能,但本质上都是用于提取特征 ...
- Java基础学习总结(20)——基础语法
2019独角兽企业重金招聘Python工程师标准>>> 一.标识符 二.关键字 三.JAVA基础数据类型 3.1. java常量 3.2. java变量 从本质上来讲,变量其实是内存 ...
最新文章
- 【基础不牢地动山摇】一遍记住 Java 面试中常用的八种排序算法与代码实现!...
- R语言常用线性模型特征筛选(feature selection)技术实战:基于前列腺特异性抗原(PSA)数据
- 古巴雪茄高希霸世纪1.2.3.4.5.6.半世纪7款雪茄的区别?
- 提高vb -》excel数据的导入速度
- 卷积神经网络结构_卷积神经网络
- Linux shell脚本中如何读取跟shell脚本同一目录下的配置文件
- 【语音隐藏】基于matlab LSB语音信息隐藏【含Matlab源码 577期】
- jmp怎么做合并的箱线图_基于JMP 15的箱线图(Box Plot)的着色
- 服务器上运行python
- mysql 查询重复数据并删除
- Springboot集成Mybatis怎么在控制台打印sql语句
- 电感的饱和电流 均方值电流 额定电流的认识
- 百色职称计算机,百色报考职称高级
- 浅析安全架构中遇到的问题
- ubuntu中安装软件的方法
- 基于java+jsp+ssm工程车辆租赁系统
- linux 命令安装 wine,Wine安装使用(适用Linux Mint 19与Ubuntu 18.04下)
- 能力态度必不可少,能力大于态度
- 手机网络抓包 转载记录http://blog.csdn.net/skylin19840101/article/details/43485911
- 如何用SPSS分析调查问卷和撰写调查报告?【SPSS 064期】