一 . 准备工作

创建一个基于对话框的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()

  1. void MyTabCtrl::Init()
  2. {
  3. CString str[];
  4. for(int i = ; i < ; i++ )
  5. str[i].LoadString(IDS_AAAAA + i);
  6.  
  7. for(int i = ; i < ; i++)
  8. this->InsertItem(i,str[i]);
  9.  
  10. CSize size(,);
  11. this->SetItemSize(size);
  12. }

三.添加目录下对话框

1.添加清除目录下的对话框

资源视图中添加Dialog资源,更改ID,对话框右键添加类,在MyTabCtrl中添加头文件,定义对象

属性,将Border选为NULL(去掉边框),Style选为Child(将对话框放入TabCtrl中)

ShowDlg覆盖了原来的上边的目录项(清扫目录等)(对话框的父类为CWnd)

初始化:MyTableCtrl::Init()

  1. show_dlg.Create(IDD_DIALOG1,this);//创建模态对话框
  2.  
  3. RECT rect;
  4. this->GetClientRect(&rect);//??从零开始
  5. rect.bottom += ;
  6. rect.top += ;
  7. show_dlg.MoveWindow(&rect);
  8.  
  9. show_dlg.ShowWindow(SW_SHOW);//创建模态对话框

2.同理添加设置目录对话框,在Init()函数中添加必要语句

  1. set_dlg.Create(IDD_SET_DLG,this);
  2. set_dlg.MoveWindow(&rect);
  3. set_dlg.ShowWindow(SW_HIDE);//隐藏

3.点击显示目录,显示结果

在资源视图中添加ListControl,Group(搜索结果),在TabCtrl中添加成员变量m_bMaxMinflag,功能为控制放大和缩小,并在Init函数中初始化为false

在Dlg类中定义bool m_Chang_Size; 控制进行初始化,为false ;

在OnPaint()中进行初始化,

  1. if(m_Chang_Size == false)
  2. {
  3. m_Chang_Size = true;
  4. RECT rec;
  5. this->GetWindowRect(&rec);
  6. rec.bottom -= ;
  7. this->MoveWindow(&rec);
  8. }

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

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

  1. void MyTabCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3. int index = this->GetCurSel();
  4. if(index != -)
  5. {
  6. switch(index)
  7. {
  8. case :
  9. show_dlg.ShowWindow(SW_SHOW);
  10. set_dlg.ShowWindow(SW_HIDE);
  11. break;
  12. case :
  13. {
  14. RECT rect;
  15. AfxGetMainWnd()->GetWindowRect(&rect);
  16. if(m_bMaxMinflag == false)//放大
  17. rect.bottom += ;
  18. else
  19. rect.bottom -= ;
  20. m_bMaxMinflag = !m_bMaxMinflag;
  21. AfxGetMainWnd()->MoveWindow(&rect);
  22. }
  23. break;
  24. case :
  25. show_dlg.ShowWindow(SW_HIDE);
  26. set_dlg.ShowWindow(SW_SHOW);
  27. break;
  28. case :
  29.  
  30. break;
  31. }
  32. }
  33. *pResult = ;
  34. }

四  . 实现各目录下的功能

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

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

  static CString ShowBrowseForFolder();

并实现

  1. CString CCleanApp::ShowBrow(CWnd* pWnd)
  2. {
  3. wchar_t szFileName[MAX_PATH] = {}; //接收选择的文件夹的名字
  4. wchar_t szFilePath[MAX_PATH] = {};
  5.  
  6. BROWSEINFOW info;
  7. info.hwndOwner = pWnd->m_hWnd; //对话框所在的窗口
  8. info.pidlRoot = NULL; //根目录,空就是从桌面开始
  9. info.pszDisplayName = szFileName; //选择的文件夹名字
  10. info.lpszTitle = L"请选择一个路径"; //对话框标题
  11. info.ulFlags = BIF_EDITBOX; //添加其他的控件,此处为路径框
  12. info.lpfn = ;
  13. info.iImage = ;
  14. info.lParam = ;
  15. //------------------------------结构体赋值-------------------------------
  16.  
  17. PIDLIST_ABSOLUTE pi = :: SHBrowseForFolder(&info); //显示浏览文件夹的对话框
  18. if(pi != NULL) //判断是否点击确定
  19. {
  20. if(SHGetPathFromIDList(pi,szFilePath) == TRUE) //成功获取路径
  21. {
  22. return szFilePath;
  23. }
  24. }
  25. return L"";
  26. }

过程:需要函数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)

  1. void CShowDlg::OnBnClickedAdd()
  2. {
  3. CString str = CCleanApp::ShowBrow(this);
  4. if(str != L"")
  5. {
  6. ShowMyListCtrl.InsertItem(ShowMyListCtrl.GetItemCount(),str);//在尾部添加
  7. }
  8. }

(6)添加复选框

在类视图ShowDlg类中右键属性->重写->OnInitDialog

  1. BOOL CShowDlg::OnInitDialog()
  2. {
  3. CDialogEx::OnInitDialog();
  4.  
  5. ShowMyListCtrl.SetExtendedStyle(LVS_EX_CHECKBOXES);
  6.  
  7. return TRUE; // return TRUE unless you set the focus to a control
  8.  
  9. }

(7)“”删除目录”:

  1. for(int i=;i<ShowMyListCtrl.GetItemCount();i++)
  2. {
  3. if(ShowMyListCtrl.GetCheck(i) == TRUE)
  4. {
  5. ShowMyListCtrl.DeleteItem(i);
  6. i--;//删除一个后,索引会都改变
  7. }
  8. }

(8)“清空目录”:用对象showpath.DeleteAllItems();

2.实现右键菜单功能

(1)在资源视图中新建一个Menu资源

(2)在CShowPathListCtrl类中,声明对象,在类视图中右键属性添加消息,NM_RCLICK,

  1. void CShowMyListCtrl::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3. LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  4.  
  5. POINT point;
  6. GetCursorPos(&point);
  7.  
  8. menu.GetSubMenu()->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_LEFTBUTTON,point.x,point.y,this);
  9.     //获取菜单中第一个索引
  10. *pResult = ;
  11. }

(3)在初始化函数中,加载菜单LoadMenu(IDR_Menu);

(4)在资源视图菜单中,在每一个选项,右键->添加事件处理函数->在CShowPathListCtrl类中

3.设置目录的功能

(1)在类视图SetDlg中右键属性,重写OnInitDialog()

(2)在资源视图中右键添加变量,类型为ComboBox

(3)在OnInitDialog()函数中

  1. BOOL CSetDlg::OnInitDialog()
  2. {
  3. CDialogEx::OnInitDialog();
  4.  
  5. comboBox.AddString(L"默认目录");
  6. comboBox.AddString(L"请输入目录");
  7. comboBox.SelectString(-,L"默认目录");
  8.  
  9. return TRUE;
  10.  
  11. }

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

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

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

  1. void CSetDlg::OnCbnCloseupCombo1()
  2. {
  3. int index = comboBox.GetCurSel();//  获取选中的项
  4. if(index == comboBox.GetCount() - )//  判断  是不是 选择了 “请选择目录” 那一项
  5. {
  6. CString path = CCleanApp::ShowBrow(this);//  弹出一个浏览文件夹的对话框
  7. if(path != L"")//  获取路径  在CComboBox 添加
  8. {
  9. comboBox.AddString(path);
  10. comboBox.SelectString(-,path);//  从第一个查找字符串  放到编辑框里????
  11. }
  12. else
  13. {
  14. comboBox.SelectString(-,L"默认目录");
  15. }
  16. }
  17. }

(6)类视图添加类TreeCtrlExName,在SetDlg中定义对象并绑定(资源视图中右键添加变量)

(7)在TreeCtrl类中,添加函数,在SetDlg中调用 ,功能为:添加一层

  1. void CTreeCtrlExName::InsertOnePage(HTREEITEM hItem,CString strPath)
  2. {
  3. if(hItem == NULL || strPath == L"")
  4. return ;
  5.  
  6. CFileFind file;
  7. BOOL bFlag = file.FindFile(strPath + "\\*.*"); // *.* 所有类型的所有文件
  8.  
  9. while(bFlag)
  10. {
  11. // 继续查找
  12. bFlag = file.FindNextFile();
  13.  
  14. if(file.IsDots() == TRUE) // 是不是 . 或 ..
  15. continue;
  16.  
  17. // 获取文本,
  18. CString strFileName = file.GetFileName();
  19. // 插入到 m_tree 控件
  20. this->InsertItem(strFileName,hItem);
  21. }
  22. }

(8)添加SetDlg中组合框中按键的事件处理,将comboBox中的目录插入到TreeCtrl中

以下为确定键的功能函数:

  1. void CSetDlg::OnBnClickedButton1()
  2. {
  3. // 清空 CTreeCtrl 上的所有项
  4. m_tree.DeleteAllItems();
  5.  
  6. // 1.获取 CComboBox 编辑框里文本
  7. CString strPath;
  8. m_comboBox.GetWindowText(strPath);
  9.  
  10. if(strPath == L"默认目录")
  11. strPath = L"C:\\";
  12.  
  13. // 插入到 CTreeCtrl
  14. HTREEITEM hRootItem = m_tree.InsertItem(strPath);
  15. m_tree.InsertOnePage(hRootItem,strPath); // 插入第一层
  16. }

(9)TreeCtrlExName的自定义函数GetExpandItemPath(),功能为:获取当前路径

  1. CString CTreeCtrlExName::GetExpandItemPath(HTREEITEM hItem)
  2. {
  3. CString strPath = L"";
  4.  
  5. while(hItem) // 不停的 拿父亲项
  6. {
  7. CString strItemText = this->GetItemText(hItem); // 获取当前这个项的文本
  8. strPath = strItemText+"\\"+strPath; // 拼接
  9. hItem = this->GetParentItem(hItem);
  10. }
  11.  
  12. return strPath;
  13. }

(10)类视图TreeCtrlExName,右键属性,添加消息 TvnItemexpanding

  1. void CTreeCtrlExName::OnTvnItemexpanding(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3. LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
  4. // ------------- 插入相对于展开这一项的 第3层 -----------------------
  5. // 0. 拿到展开这一项的句柄
  6. HTREEITEM hItem = pNMTreeView->itemNew.hItem;
  7.  
  8. // 1. 获取展开这一项的系统路径
  9. CString strPath = this->GetExpandItemPath(hItem);
  10.  
  11. // 2. 分别和展开这一项的每一个子项的名字 拼接
  12. if(strPath != L"")
  13. {
  14. // 遍历 hItem 所有子项
  15. HTREEITEM hChildItem = this->GetChildItem(hItem);
  16. while(hChildItem)
  17. {
  18. //----------------------------------------------
  19. // 获取子项的文本
  20. CString strText = this->GetItemText(hChildItem);
  21.  
  22. if(this->GetChildItem(hChildItem) == NULL) // 没有第3层的 插入
  23. this->InsertOnePage(hChildItem,strPath+"\\"+strText);
  24.  
  25. //----------------------------------------------
  26. hChildItem = this->GetNextSiblingItem(hChildItem);
  27. }
  28. }
  29.  
  30. *pResult = ;
  31. }

(11)将在树状图中点击的项的句柄用set存入,在TreeCtrlExName类中声明:set<HTREEITEM> m_stTreeItem;

类视图TreeCtrlExName,右键属性,添加消息NMCLICK

  1. void CTreeCtrlExName::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3. // 拿到点击的这一项的 句柄
  4. CPoint point;
  5. ::GetCursorPos(&point); // 获取坐标
  6. this->ScreenToClient(&point); // 屏幕转换成客户区的坐标
  7. HTREEITEM hItem = this->HitTest(point);
  8.  
  9. // 保存起来
  10. m_stTreeItem.insert(hItem);
  11.  
  12. *pResult = ;
  13. }

(12) SetDlg中添加,完成按钮的功能函数;在SetDlg.h中声明:set<CString> m_stExName;  //  保存 后缀名的 集合

  1. void CSetDlg::OnBnClickedButton2()
  2. {
  3. m_stExName.clear(); // 删除 之前设置的
  4.  
  5. // 在树中的那个集合里遍历 找到选中的那些项
  6. set<HTREEITEM>::iterator ite = m_tree.m_stTreeItem.begin();
  7. while(ite != m_tree.m_stTreeItem.end())
  8. {
  9. //-------------------------------------------
  10. // 判断这一项是不是选中
  11. if(m_tree.GetCheck(*ite) == TRUE)
  12. {
  13. // 拿到 这一项的 文本
  14. CString str = m_tree.GetItemText(*ite);
  15. // 截取后缀
  16. int index = str.ReverseFind('.');
  17. if(index != -)
  18. {
  19. CString strExName = str.Right(str.GetLength()-index);
  20. // 保存到 集合里
  21. m_stExName.insert(strExName);
  22. }
  23. }
  24. //-------------------------------------------
  25. ite = m_tree.m_stTreeItem.erase(ite);//删除的为点击的文件名
  26. }
  27.  
  28. if(m_stExName.size() > )
  29. {
          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)第一个按键“搜索”的功能函数

  1. void CCleanDlg::OnBnClickedButton1()
  2. {
  3. queue<CString> qu; // 队列 装文件夹的路径
  4. // 取得 CShowDlg 上 列表的选中的路径 做为起始查找的路径
  5. for(int i=;i<m_tab.m_dlgShow.m_listctrlShowPath.GetItemCount();i++)
  6. {
  7. if(m_tab.m_dlgShow.m_listctrlShowPath.GetCheck(i) == TRUE)
  8. {
  9. // 拿到这个项的文本
  10. CString strPath = m_tab.m_dlgShow.m_listctrlShowPath.GetItemText(i,);
  11. qu.push(strPath);
  12. }
  13. }
  14.  
  15. // 不停的在队列里 取文件夹的路径
  16. while(qu.empty() == false)
  17. {
  18. // 拿一个节点
  19. CString strPath = qu.front();
  20. qu.pop();
  21.  
  22. // 在strPath 路径下 搜索
  23. CFileFind file;
  24. BOOL bFlag = file.FindFile(strPath+"\\*.*");
  25. while(bFlag)
  26. {
  27. bFlag = file.FindNextFile();
  28. // 获取 名字
  29. CString strFileName = file.GetFileName();
  30.  
  31. if(file.IsDots() == TRUE) // 过滤 .和.. 文件
  32. continue;
  33.  
  34. if(file.IsDirectory() == TRUE) // 文件夹
  35. {
  36. // 和 路径拼接 放回到队列
  37. qu.push(strPath+"\\"+strFileName);
  38. }
  39. else // 文件
  40. {
  41. // 截取后缀
  42. int index = strFileName.ReverseFind('.');
  43. if(index != -)
  44. {
  45. CString strExName = strFileName.Right(strFileName.GetLength()-index);
  46. // 和 CSetDlg 装 设置的后缀名哪个集合匹配
  47. if(m_tab.m_dlgSet.m_stExName.count(strExName) == )
  48. {
  49. // 在m_listctrlDelPath 列表中添加
  50. m_listctrlDelPath.InsertItem(m_listctrlDelPath.GetItemCount(),strPath+"\\"+strFileName);
  51. }
  52. }
  53. }
  54. }
  55. }
  56. }

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

  1. void CCleanDlg::OnBnClickedButton2()
  2. {
  3. // 遍历m_listctrlDelPath 列表
  4. for(int i=;i<m_listctrlDelPath.GetItemCount();i++)
  5. {
  6. // 判断是不是选中的
  7. if(m_listctrlDelPath.GetCheck(i) == TRUE)
  8. {
  9. // 拿到这一项的文本(对应的文件路径)
  10. CString strDelPath = m_listctrlDelPath.GetItemText(i,);
  11. ::DeleteFile(strDelPath);
  12. m_listctrlDelPath.DeleteItem(i);
  13.  
  14. i--;
  15. }
  16. }
  17. }

Clean小程序(控件消息)的更多相关文章

  1. 微信小程序控件 横/纵向排列

    控件(按钮)横向排列 wxss .view_class { display: flex; flex-direction: row; justify-content: center; } 控件(按钮)纵 ...

  2. 微信小程序控件

    1   scrollview 窗口view的滑动 <scroll-view scroll-y class='scroll-view-y' bindscrolltoupper="uppe ...

  3. 微信小程序客服消息使用指南

    客服消息使用指南 为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息能力,以便小程序用户可以方便快捷地与小程序服务提供方进行沟通. 功能介绍 用户可使用小程序客服消息功能,与小程序的客服人 ...

  4. DuiLib(三)——控件消息

    上一篇讲了控件创建,这篇说说控件消息.directui的中心思想是在真实窗口之上画出所有控件,那这些控件是如何获取各自消息的? 通过第一篇的示例可以看到窗口消息的传递过程: CWindowWnd::_ ...

  5. 微信小程序开发模板消息的时候 出现 errcode: 41028, errmsg: "invalid form id hint:

    小程序开发模板消息的时候  出现 errcode: 41028, errmsg: "invalid form id hint: 我是使用的微信支付发送模板消息,提示的formid无效的 大家 ...

  6. 微信小程序客服消息开发实战:实时在手机上接收小程序客服消息通知,以及在手机上回复

    在微信小程序开发中,可以非常方便的集成客服功能,只需要一行代码便可以将用户引导至客服会话界面.这行代码就是: <button open-type="contact" bind ...

  7. 微信小程序客服消息实时通知之最佳实践

    我们做微信小程序开发的都知道,只要在小程序页面中添加如下代码即可进入小程序的客服会话界面: <button open-type="contact" >联系我们</ ...

  8. 微信小程序客服消息使用

    客服消息使用 为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息能力,以便小程序用户可以方便快捷地与小程序服务提供方进行沟通. xiaokefu.com.cn 功能介绍 用户可使用小程序客 ...

  9. 微信小程序发送模板消息

    微信小程序发送模板消息 标签(空格分隔): php 看小程序文档 [模板消息文档总览]:https://developers.weixin.qq.com/miniprogram/dev/framewo ...

  10. 微信小程序新服务消息推送 —— 订阅消息

    微信团队前不久公测了「订阅消息」,原有的小程序模板消息接口将于 2020 年 1 月 10 日下线,届时将无法发送模板消息.「订阅消息」将完全替代「模板消息」,这两天得空测试了一波. 1.下发权限机制 ...

随机推荐

  1. 【python】windows下安装xgboost的python库

    傻瓜教程 主要参考了https://www.hongweipeng.com/index.php/archives/826/  和 https://github.com/dmlc/xgboost/iss ...

  2. Android 反编译 -smali语法

    前言 前面我们有说过android反编译的工具,如何进行反编译.反编译后可以得到jar或者得到smali文件.Android采用的是java语言 进行开发,但是Android系统有自己的虚拟机Dalv ...

  3. jsp转发和重定向

    response应答 a) Response.sendRedirect(路径); //重定向 b) Response.getRequestDispatcher(路径).forward(request, ...

  4. Java进阶知识点5:服务端高并发的基石 - NIO与Reactor模式以及AIO与Proactor模式

    一.背景 要提升服务器的并发处理能力,通常有两大方向的思路. 1.系统架构层面.比如负载均衡.多级缓存.单元化部署等等. 2.单节点优化层面.比如修复代码级别的性能Bug.JVM参数调优.IO优化等等 ...

  5. easyui1.4 汉化出问题

    easyui 1.4 的textbox 验证汉化不了,需要在easyui-lang-zh_CN.js 加入 if ($.fn.textbox){ $.fn.textbox.defaults.missi ...

  6. [BZOJ5133][CodePlus2017年12月]白金元首与独舞

    bzoj luogu 题意 给你一个\(n*m\)的网格,每个位置上有一个箭头指向上或下或左或右.有些位置上还没有箭头,现在要求你在这些没有箭头的位置上填入箭头,使得从网格的任意一个位置开始,都可以沿 ...

  7. UVA11174 Stand in a Line

    题意 PDF 分析 \[ f(i)=f(c_1)f(c_2)\dots\times(s(i)-1)!/(s(c_1)!s(c_2)! \dots s(c_k)! )\\ f(root)=(s(root ...

  8. 洛谷 P2945 [USACO09MAR]沙堡Sand Castle

    传送门 题目大意: ai,ai+1,ai+2... 变成 bi,bi+1,bi+2.. 不计顺序,增加和减少a数组均有代价. 题解:贪心+排序 小的对应小的 代码: #include<iostr ...

  9. Spring aop 简单示例

    简单的记录一下spring aop的一个示例 基于两种配置方式: 基于xml配置 基于注解配置 这个例子是模拟对数据库的更改操作添加事物 其实并没有添加,只是简单的输出了一下记录 首先看下整个例子的目 ...

  10. Maven打包同一个jar有不同的:版本+时间戳(解决思路)

    在我们的开发过程中,目前流行的版本控制工具maven,在项目开发阶段,大家都是通过发布SNAPSHOT快照版进行相互模块之间的依赖开发, 这个时候就会有一个问题,要是一天构建多次的快照版,会发现在项目 ...