zoukankan      html  css  js  c++  java
  • 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[5];
        for(int i = 0; i < 4; i++ )
            str[i].LoadString(IDS_AAAAA + i);
    
        for(int i = 0; i < 4; i++)
            this->InsertItem(i,str[i]);
    
        CSize size(0,30);
        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 += 30;
        rect.top += 30;
        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 -= 230;
            this->MoveWindow(&rec);
        }

    4.实现“清扫”,“删除” 等按钮

    在TabCtrl类中,类视图->TabCtrl->属性->NM_CLICK

    void MyTabCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
    {
        int index = this->GetCurSel();
        if(index != -1)
        {
            switch(index)
            {
            case 0:
                show_dlg.ShowWindow(SW_SHOW);
                set_dlg.ShowWindow(SW_HIDE);
                break;
            case 1:
                {
                    RECT rect;
                    AfxGetMainWnd()->GetWindowRect(&rect);
                    if(m_bMaxMinflag == false)//放大
                        rect.bottom += 230;
                    else
                        rect.bottom -= 230;
                    m_bMaxMinflag = !m_bMaxMinflag;
                    AfxGetMainWnd()->MoveWindow(&rect);
                }
                break;
            case 2:
                    show_dlg.ShowWindow(SW_HIDE);
                    set_dlg.ShowWindow(SW_SHOW);
                break;
            case 3:
    
                break;
            }
        }
        *pResult = 0;
    }

    四  . 实现各目录下的功能

    1.清扫目录下的“添加目录”,“删除目录”,“清空目录”

    (1)在Clean类中添加静态函数(原因:所有类中都含Clean头文件,可以通过作用域和函数名调用)

      static CString ShowBrowseForFolder();

    并实现

    CString CCleanApp::ShowBrow(CWnd* pWnd)
    {
        wchar_t szFileName[MAX_PATH] = {0};                            //接收选择的文件夹的名字
        wchar_t szFilePath[MAX_PATH] = {0};
    
        BROWSEINFOW info;
        info.hwndOwner = pWnd->m_hWnd;                                //对话框所在的窗口
        info.pidlRoot = NULL;                                        //根目录,空就是从桌面开始
        info.pszDisplayName = szFileName;                            //选择的文件夹名字
        info.lpszTitle = L"请选择一个路径";                            //对话框标题
        info.ulFlags = BIF_EDITBOX;                                    //添加其他的控件,此处为路径框
        info.lpfn = 0;
        info.iImage = 0;
        info.lParam = 0;
    //------------------------------结构体赋值-------------------------------
        
        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=0;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(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_LEFTBUTTON,point.x,point.y,this);
        //获取菜单中第一个索引
        *pResult = 0;
    }

    (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(-1,L"默认目录");
    
        return TRUE;  
    
    }

    (4)使框内只能选择不能编辑,则属性 Type改为DropList

    (5)当点击“请输入目录时”,显示选择对话框

    ComboBox没有类,资源添加事件处理

    void CSetDlg::OnCbnCloseupCombo1()
    {
        int index = comboBox.GetCurSel();//  获取选中的项
        if(index == comboBox.GetCount() - 1)//  判断  是不是 选择了 “请选择目录” 那一项
        {
            CString path = CCleanApp::ShowBrow(this);//  弹出一个浏览文件夹的对话框
            if(path != L"")//  获取路径  在CComboBox 添加
            {
                comboBox.AddString(path);
                comboBox.SelectString(-1,path);//  从第一个查找字符串  放到编辑框里????
            }
            else
            {
                comboBox.SelectString(-1,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 = 0;
    }

     (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 = 0;
    }

    (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 != -1)
                {
                    CString strExName = str.Right(str.GetLength()-index);
                    // 保存到 集合里
                    m_stExName.insert(strExName);
                }
            }
            //-------------------------------------------
            ite = m_tree.m_stTreeItem.erase(ite);//删除的为点击的文件名
        }
    
        if(m_stExName.size() > 0)
           { 
          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=0;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,0);
                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 != -1)
                    {
                        CString strExName = strFileName.Right(strFileName.GetLength()-index);
                        //   和 CSetDlg 装 设置的后缀名哪个集合匹配
                        if(m_tab.m_dlgSet.m_stExName.count(strExName) == 1)
                        {
                            //  在m_listctrlDelPath 列表中添加
                            m_listctrlDelPath.InsertItem(m_listctrlDelPath.GetItemCount(),strPath+"\"+strFileName);
                        }
                    }
                }
            }
        }
    }

    (2)添加第二个按键“删除”的功能

    void CCleanDlg::OnBnClickedButton2()
    {
        //  遍历m_listctrlDelPath 列表  
        for(int i=0;i<m_listctrlDelPath.GetItemCount();i++)
        {
            // 判断是不是选中的
            if(m_listctrlDelPath.GetCheck(i) == TRUE)
            {
                //  拿到这一项的文本(对应的文件路径)
                CString strDelPath = m_listctrlDelPath.GetItemText(i,0);
                ::DeleteFile(strDelPath);
                m_listctrlDelPath.DeleteItem(i);
    
                i--;
            }
        }
    }
  • 相关阅读:
    iOS开发之--隐藏状态栏
    iOS开发之--iPhone X 适配:MJRefresh上拉加载适配
    iOS开发之--为UITextField监听数值变化的三种方法
    ios开发之--为父view上的子view添加阴影
    iOS开发之--在UIWindow上展示/移除一个View
    iOS开发之--Masonry多个平均布局
    CocoaPods更新过程中出现的坑及解决方法
    那些已成定局的人和事
    两个陌生人的对话
    好好写代码吧,没事别瞎B去创业!
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/8337012.html
Copyright © 2011-2022 走看看