Clean小程序(控件消息)
一 . 准备工作
创建一个基于对话框的MFC项目
删除对话框上的工具
二 . 实现将seven图片贴到上面,按一下则换一张图片
1.在资源视图中添加位图资源,通过属性修改图片ID
2.将对话框拉长,防止图片变形
3.在工具栏里添加pictrue Control,修改此工具的ID,Type,Image,!!!notify改为true
4.在Dlg头文件中添加成员变量
CStatic picture; // 图片控件的对象
bool m_nChangeBmp; // 切换位图
HBITMAP m_hBmp7;
HBITMAP m_hBmp8;
5.绑定CCleanDlg::DoDataExchange()函数中调用
DDX_Control(pDX,IDC_PICTURE,picture);//(pDX,资源视图添加控件的ID,类中定义的变量)
6.初始化,CMyCleanDlg::OnInitDialog
m_hBmp7 = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP7));
m_hBmp8 = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP8));
m_nChangeBmp = false;//初始化为false
7.资源 添加消息处理函数
void CMyCleanDlg::OnStnClickedPictrue()
{
if(m_nChangeBmp == false)
picture.SetBitmap(m_hBmp8);
else
picture.SetBitmap(m_hBmp7);
m_nChangeBmp = !m_nChangeBmp;
}
三 . 添加下面的Tab Control 工具
1.在资源视图上添加Tab Control 工具并调整大小
2.在类视图中添加类MyTabCtrl,基类为CTabCtrl
3.在Dlg.h中定义对象:MyTabCtrl m_tab;
3.在CMyCleanDlg::OnInitDialog中初始化
m_tab.InsertItem(0,L"清扫目录");//(新标签从0开始的索引)
m_tab.InsertItem(1,L"显示目录");
m_tab.InsertItem(2,L"设置目录");
m_tab.InsertItem(3,L"扫描删除");
CSize size(0,30);
m_tab.SetItemSize(size);//设置工具框大小
4.绑定
DDX_Control(pDX,IDC_TAB1,m_tab);
5.将汉字,例如“清扫目录”等加载进资源
解决方案资源管理器 - >clean.rc右键查看代码->在STRINGTABLE处添加
在resource.h中进行宏定义
6.新建初始化函数void Init() 作为MyTabCtrl的成员函数,将步骤3删除,在CMyCleanDlg::OnInitDialog()函数中调用m_tab.Init()
void MyTabCtrl::Init()
{
CString str[];
for(int i = ; i < ; i++ )
str[i].LoadString(IDS_AAAAA + i); for(int i = ; i < ; i++)
this->InsertItem(i,str[i]); CSize size(,);
this->SetItemSize(size);
}
三.添加目录下对话框
1.添加清除目录下的对话框
资源视图中添加Dialog资源,更改ID,对话框右键添加类,在MyTabCtrl中添加头文件,定义对象
属性,将Border选为NULL(去掉边框),Style选为Child(将对话框放入TabCtrl中)
ShowDlg覆盖了原来的上边的目录项(清扫目录等)(对话框的父类为CWnd)
初始化:MyTableCtrl::Init()
show_dlg.Create(IDD_DIALOG1,this);//创建模态对话框 RECT rect;
this->GetClientRect(&rect);//??从零开始
rect.bottom += ;
rect.top += ;
show_dlg.MoveWindow(&rect); show_dlg.ShowWindow(SW_SHOW);//创建模态对话框
2.同理添加设置目录对话框,在Init()函数中添加必要语句
set_dlg.Create(IDD_SET_DLG,this);
set_dlg.MoveWindow(&rect);
set_dlg.ShowWindow(SW_HIDE);//隐藏
3.点击显示目录,显示结果
在资源视图中添加ListControl,Group(搜索结果),在TabCtrl中添加成员变量m_bMaxMinflag,功能为控制放大和缩小,并在Init函数中初始化为false
在Dlg类中定义bool m_Chang_Size; 控制进行初始化,为false ;
在OnPaint()中进行初始化,
if(m_Chang_Size == false)
{
m_Chang_Size = true;
RECT rec;
this->GetWindowRect(&rec);
rec.bottom -= ;
this->MoveWindow(&rec);
}
4.实现“清扫”,“删除” 等按钮
在TabCtrl类中,类视图->TabCtrl->属性->NM_CLICK
void MyTabCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
int index = this->GetCurSel();
if(index != -)
{
switch(index)
{
case :
show_dlg.ShowWindow(SW_SHOW);
set_dlg.ShowWindow(SW_HIDE);
break;
case :
{
RECT rect;
AfxGetMainWnd()->GetWindowRect(&rect);
if(m_bMaxMinflag == false)//放大
rect.bottom += ;
else
rect.bottom -= ;
m_bMaxMinflag = !m_bMaxMinflag;
AfxGetMainWnd()->MoveWindow(&rect);
}
break;
case :
show_dlg.ShowWindow(SW_HIDE);
set_dlg.ShowWindow(SW_SHOW);
break;
case : break;
}
}
*pResult = ;
}
四 . 实现各目录下的功能
1.清扫目录下的“添加目录”,“删除目录”,“清空目录”
(1)在Clean类中添加静态函数(原因:所有类中都含Clean头文件,可以通过作用域和函数名调用)
static CString ShowBrowseForFolder();
并实现
CString CCleanApp::ShowBrow(CWnd* pWnd)
{
wchar_t szFileName[MAX_PATH] = {}; //接收选择的文件夹的名字
wchar_t szFilePath[MAX_PATH] = {}; BROWSEINFOW info;
info.hwndOwner = pWnd->m_hWnd; //对话框所在的窗口
info.pidlRoot = NULL; //根目录,空就是从桌面开始
info.pszDisplayName = szFileName; //选择的文件夹名字
info.lpszTitle = L"请选择一个路径"; //对话框标题
info.ulFlags = BIF_EDITBOX; //添加其他的控件,此处为路径框
info.lpfn = ;
info.iImage = ;
info.lParam = ;
//------------------------------结构体赋值------------------------------- PIDLIST_ABSOLUTE pi = :: SHBrowseForFolder(&info); //显示浏览文件夹的对话框
if(pi != NULL) //判断是否点击确定
{
if(SHGetPathFromIDList(pi,szFilePath) == TRUE) //成功获取路径
{
return szFilePath;
}
}
return L"";
}
过程:需要函数SHBrowseForFolder(),在帮助文档中查看
(2)在资源视图,“添加目录”按钮,更改ID,添加事件处理(双击即可),则生成函数void CShowDlg::OnBnClickedAdd()
直接调用即可CCleanApp::ShowBrow(this);
(3)添加列表控件类CShowPathListCtrl,基类为CListCtrl
(4)在Show对话框类中定义对象showpath
(5)绑定,快捷方式:在Show对话框上右键添加变量,变量即为刚添加的类CShowPathListCtrl(但不建议使用)
(6)将路径名插入到ListCtrl中,在函数void CShowDlg::OnBnClickedAdd()中添加,(将ListControl的属性View改为List)
void CShowDlg::OnBnClickedAdd()
{
CString str = CCleanApp::ShowBrow(this);
if(str != L"")
{
ShowMyListCtrl.InsertItem(ShowMyListCtrl.GetItemCount(),str);//在尾部添加
}
}
(6)添加复选框
在类视图ShowDlg类中右键属性->重写->OnInitDialog
BOOL CShowDlg::OnInitDialog()
{
CDialogEx::OnInitDialog(); ShowMyListCtrl.SetExtendedStyle(LVS_EX_CHECKBOXES); return TRUE; // return TRUE unless you set the focus to a control }
(7)“”删除目录”:
for(int i=;i<ShowMyListCtrl.GetItemCount();i++)
{
if(ShowMyListCtrl.GetCheck(i) == TRUE)
{
ShowMyListCtrl.DeleteItem(i);
i--;//删除一个后,索引会都改变
}
}
(8)“清空目录”:用对象showpath.DeleteAllItems();
2.实现右键菜单功能
(1)在资源视图中新建一个Menu资源
(2)在CShowPathListCtrl类中,声明对象,在类视图中右键属性添加消息,NM_RCLICK,
void CShowMyListCtrl::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); POINT point;
GetCursorPos(&point); menu.GetSubMenu()->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_LEFTBUTTON,point.x,point.y,this);
//获取菜单中第一个索引
*pResult = ;
}
(3)在初始化函数中,加载菜单LoadMenu(IDR_Menu);
(4)在资源视图菜单中,在每一个选项,右键->添加事件处理函数->在CShowPathListCtrl类中
3.设置目录的功能
(1)在类视图SetDlg中右键属性,重写OnInitDialog()
(2)在资源视图中右键添加变量,类型为ComboBox
(3)在OnInitDialog()函数中
BOOL CSetDlg::OnInitDialog()
{
CDialogEx::OnInitDialog(); comboBox.AddString(L"默认目录");
comboBox.AddString(L"请输入目录");
comboBox.SelectString(-,L"默认目录"); return TRUE; }
(4)使框内只能选择不能编辑,则属性 Type改为DropList
(5)当点击“请输入目录时”,显示选择对话框
ComboBox没有类,资源添加事件处理
void CSetDlg::OnCbnCloseupCombo1()
{
int index = comboBox.GetCurSel();// 获取选中的项
if(index == comboBox.GetCount() - )// 判断 是不是 选择了 “请选择目录” 那一项
{
CString path = CCleanApp::ShowBrow(this);// 弹出一个浏览文件夹的对话框
if(path != L"")// 获取路径 在CComboBox 添加
{
comboBox.AddString(path);
comboBox.SelectString(-,path);// 从第一个查找字符串 放到编辑框里????
}
else
{
comboBox.SelectString(-,L"默认目录");
}
}
}
(6)类视图添加类TreeCtrlExName,在SetDlg中定义对象并绑定(资源视图中右键添加变量)
(7)在TreeCtrl类中,添加函数,在SetDlg中调用 ,功能为:添加一层
void CTreeCtrlExName::InsertOnePage(HTREEITEM hItem,CString strPath)
{
if(hItem == NULL || strPath == L"")
return ; CFileFind file;
BOOL bFlag = file.FindFile(strPath + "\\*.*"); // *.* 所有类型的所有文件 while(bFlag)
{
// 继续查找
bFlag = file.FindNextFile(); if(file.IsDots() == TRUE) // 是不是 . 或 ..
continue; // 获取文本,
CString strFileName = file.GetFileName();
// 插入到 m_tree 控件
this->InsertItem(strFileName,hItem);
}
}
(8)添加SetDlg中组合框中按键的事件处理,将comboBox中的目录插入到TreeCtrl中
以下为确定键的功能函数:
void CSetDlg::OnBnClickedButton1()
{
// 清空 CTreeCtrl 上的所有项
m_tree.DeleteAllItems(); // 1.获取 CComboBox 编辑框里文本
CString strPath;
m_comboBox.GetWindowText(strPath); if(strPath == L"默认目录")
strPath = L"C:\\"; // 插入到 CTreeCtrl
HTREEITEM hRootItem = m_tree.InsertItem(strPath);
m_tree.InsertOnePage(hRootItem,strPath); // 插入第一层
}
(9)TreeCtrlExName的自定义函数GetExpandItemPath(),功能为:获取当前路径
CString CTreeCtrlExName::GetExpandItemPath(HTREEITEM hItem)
{
CString strPath = L""; while(hItem) // 不停的 拿父亲项
{
CString strItemText = this->GetItemText(hItem); // 获取当前这个项的文本
strPath = strItemText+"\\"+strPath; // 拼接
hItem = this->GetParentItem(hItem);
} return strPath;
}
(10)类视图TreeCtrlExName,右键属性,添加消息 TvnItemexpanding
void CTreeCtrlExName::OnTvnItemexpanding(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// ------------- 插入相对于展开这一项的 第3层 -----------------------
// 0. 拿到展开这一项的句柄
HTREEITEM hItem = pNMTreeView->itemNew.hItem; // 1. 获取展开这一项的系统路径
CString strPath = this->GetExpandItemPath(hItem); // 2. 分别和展开这一项的每一个子项的名字 拼接
if(strPath != L"")
{
// 遍历 hItem 所有子项
HTREEITEM hChildItem = this->GetChildItem(hItem);
while(hChildItem)
{
//----------------------------------------------
// 获取子项的文本
CString strText = this->GetItemText(hChildItem); if(this->GetChildItem(hChildItem) == NULL) // 没有第3层的 插入
this->InsertOnePage(hChildItem,strPath+"\\"+strText); //----------------------------------------------
hChildItem = this->GetNextSiblingItem(hChildItem);
}
} *pResult = ;
}
(11)将在树状图中点击的项的句柄用set存入,在TreeCtrlExName类中声明:set<HTREEITEM> m_stTreeItem;
类视图TreeCtrlExName,右键属性,添加消息NMCLICK
void CTreeCtrlExName::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
// 拿到点击的这一项的 句柄
CPoint point;
::GetCursorPos(&point); // 获取坐标
this->ScreenToClient(&point); // 屏幕转换成客户区的坐标
HTREEITEM hItem = this->HitTest(point); // 保存起来
m_stTreeItem.insert(hItem); *pResult = ;
}
(12) SetDlg中添加,完成按钮的功能函数;在SetDlg.h中声明:set<CString> m_stExName; // 保存 后缀名的 集合
void CSetDlg::OnBnClickedButton2()
{
m_stExName.clear(); // 删除 之前设置的 // 在树中的那个集合里遍历 找到选中的那些项
set<HTREEITEM>::iterator ite = m_tree.m_stTreeItem.begin();
while(ite != m_tree.m_stTreeItem.end())
{
//-------------------------------------------
// 判断这一项是不是选中
if(m_tree.GetCheck(*ite) == TRUE)
{
// 拿到 这一项的 文本
CString str = m_tree.GetItemText(*ite);
// 截取后缀
int index = str.ReverseFind('.');
if(index != -)
{
CString strExName = str.Right(str.GetLength()-index);
// 保存到 集合里
m_stExName.insert(strExName);
}
}
//-------------------------------------------
ite = m_tree.m_stTreeItem.erase(ite);//删除的为点击的文件名
} if(m_stExName.size() > )
{
MessageBox(L"设置成功");
((CCleanDlg*)AfxGetMainWnd())->m_Tab.SetCurSel(0);
((CCleanDlg*)AfxGetMainWnd())->m_Tab.CSdlg.ShowWindow(SW_SHOW);
((CCleanDlg*)AfxGetMainWnd())->m_Tab.m_SetDlg.ShowWindow(SW_HIDE);//跳转到清扫目录
}
else
MessageBox(L"设置失败");
}
5.显示目录的功能
(1)第一个按键“搜索”的功能函数
void CCleanDlg::OnBnClickedButton1()
{
queue<CString> qu; // 队列 装文件夹的路径
// 取得 CShowDlg 上 列表的选中的路径 做为起始查找的路径
for(int i=;i<m_tab.m_dlgShow.m_listctrlShowPath.GetItemCount();i++)
{
if(m_tab.m_dlgShow.m_listctrlShowPath.GetCheck(i) == TRUE)
{
// 拿到这个项的文本
CString strPath = m_tab.m_dlgShow.m_listctrlShowPath.GetItemText(i,);
qu.push(strPath);
}
} // 不停的在队列里 取文件夹的路径
while(qu.empty() == false)
{
// 拿一个节点
CString strPath = qu.front();
qu.pop(); // 在strPath 路径下 搜索
CFileFind file;
BOOL bFlag = file.FindFile(strPath+"\\*.*");
while(bFlag)
{
bFlag = file.FindNextFile();
// 获取 名字
CString strFileName = file.GetFileName(); if(file.IsDots() == TRUE) // 过滤 .和.. 文件
continue; if(file.IsDirectory() == TRUE) // 文件夹
{
// 和 路径拼接 放回到队列
qu.push(strPath+"\\"+strFileName);
}
else // 文件
{
// 截取后缀
int index = strFileName.ReverseFind('.');
if(index != -)
{
CString strExName = strFileName.Right(strFileName.GetLength()-index);
// 和 CSetDlg 装 设置的后缀名哪个集合匹配
if(m_tab.m_dlgSet.m_stExName.count(strExName) == )
{
// 在m_listctrlDelPath 列表中添加
m_listctrlDelPath.InsertItem(m_listctrlDelPath.GetItemCount(),strPath+"\\"+strFileName);
}
}
}
}
}
}
(2)添加第二个按键“删除”的功能
void CCleanDlg::OnBnClickedButton2()
{
// 遍历m_listctrlDelPath 列表
for(int i=;i<m_listctrlDelPath.GetItemCount();i++)
{
// 判断是不是选中的
if(m_listctrlDelPath.GetCheck(i) == TRUE)
{
// 拿到这一项的文本(对应的文件路径)
CString strDelPath = m_listctrlDelPath.GetItemText(i,);
::DeleteFile(strDelPath);
m_listctrlDelPath.DeleteItem(i); i--;
}
}
}
Clean小程序(控件消息)的更多相关文章
- 微信小程序控件 横/纵向排列
控件(按钮)横向排列 wxss .view_class { display: flex; flex-direction: row; justify-content: center; } 控件(按钮)纵 ...
- 微信小程序控件
1 scrollview 窗口view的滑动 <scroll-view scroll-y class='scroll-view-y' bindscrolltoupper="uppe ...
- 微信小程序客服消息使用指南
客服消息使用指南 为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息能力,以便小程序用户可以方便快捷地与小程序服务提供方进行沟通. 功能介绍 用户可使用小程序客服消息功能,与小程序的客服人 ...
- DuiLib(三)——控件消息
上一篇讲了控件创建,这篇说说控件消息.directui的中心思想是在真实窗口之上画出所有控件,那这些控件是如何获取各自消息的? 通过第一篇的示例可以看到窗口消息的传递过程: CWindowWnd::_ ...
- 微信小程序开发模板消息的时候 出现 errcode: 41028, errmsg: "invalid form id hint:
小程序开发模板消息的时候 出现 errcode: 41028, errmsg: "invalid form id hint: 我是使用的微信支付发送模板消息,提示的formid无效的 大家 ...
- 微信小程序客服消息开发实战:实时在手机上接收小程序客服消息通知,以及在手机上回复
在微信小程序开发中,可以非常方便的集成客服功能,只需要一行代码便可以将用户引导至客服会话界面.这行代码就是: <button open-type="contact" bind ...
- 微信小程序客服消息实时通知之最佳实践
我们做微信小程序开发的都知道,只要在小程序页面中添加如下代码即可进入小程序的客服会话界面: <button open-type="contact" >联系我们</ ...
- 微信小程序客服消息使用
客服消息使用 为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息能力,以便小程序用户可以方便快捷地与小程序服务提供方进行沟通. xiaokefu.com.cn 功能介绍 用户可使用小程序客 ...
- 微信小程序发送模板消息
微信小程序发送模板消息 标签(空格分隔): php 看小程序文档 [模板消息文档总览]:https://developers.weixin.qq.com/miniprogram/dev/framewo ...
- 微信小程序新服务消息推送 —— 订阅消息
微信团队前不久公测了「订阅消息」,原有的小程序模板消息接口将于 2020 年 1 月 10 日下线,届时将无法发送模板消息.「订阅消息」将完全替代「模板消息」,这两天得空测试了一波. 1.下发权限机制 ...
随机推荐
- Java Thread类的yield()和join()的区别和用法
yield: 解释它之前,先简述下,多线程的执行流程:多个线程并发请求执行时,由cpu决定优先执行哪一个,即使通过thread.setPriority(),设置了 线程的优先级,也不一定就是每次都先执 ...
- 限流之令牌桶算法——RateLimiter官方文档
原文链接 作者:Dimitris Andreou 译者:魏嘉鹏 校对:方腾飞 RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可证.如果必要的话,每个acquire() 会阻 ...
- vue动态 设置类名
<div class="tab"> <navigator :class="currentTab=='mzfw'?'nav active': 'nav'& ...
- 数据库模式显示的Swing表格
http://code.google.com/p/simpleframework/ 是一个国内开源的JavaWeb框架,但其net.simpleframework.swing包里面提供了一个超强的Sw ...
- 【经典】Noip贪心
一.经典例题 例一:排队接水 题意:n个人到r个水龙头接水,装满水桶的时间分别是t1,t2,t3.... 接水时间是整数且互不相等,怎样安排顺序使每个人等待的 时间和最小. 题解:排队越靠前计算次数越 ...
- Log4net系列一:Log4net搭建之文本格式输出【转】
前言 项目开发中,记录项目日志是必须的,如果非要说日志的重要性(日志可看做,飞机的黑匣子,或者汽车的行车记录仪),根据等级进行记录,方便我们排查相关问题,以后项目运维中,也方便很多.基本上我们进入一家 ...
- windows下通过Git Bash使用Git常用命令
Git跟SVN最大不同的地方就是分布式.SVN的集中式与Git的分布式决定各自的业务场景.既然是分布式的,那么大部分操作就是本地操作.一般Git操作都是通过IDE,比如Eclipse,如果装了Git ...
- GX 编译器 的搭建
1.交叉编译器 /etc/profile export JAVA_HOME=/opt/jdk1.6.0_45PATH=/opt/gx/csky-elf/bin:/opt/gx/arm-elf/bin: ...
- 在ERP软件行业项目应该怎么做?
本人进入软件行业已经有5个年头了,主导实施和参与过的大大小小的项目有20余个.其中有些项目做的非常好,提升了客户企业的管理水平,也规范了企业的业务操作水平,优化了企业的流程,客户非常认同我们实施的价值 ...
- AD芯片的基准参考电压问题
基准参考电压的精度一般非常高的! AD芯片 : AD9226的基准参考电压 误差一般是 千分之一! 我之前用万用表测量AD9226的参考电压大概是1.89V(这款AD的正确参考电压应该是2V),所 ...