123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572 |
- // FileWatcherDlg.cpp : implementation file
- //
- #include "stdafx.h"
- #include "FileWatcher.h"
- #include "FileWatcherDlg.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CAboutDlg dialog used for App About
- class CAboutDlg : public CDialog
- {
- public:
- CAboutDlg();
- // Dialog Data
- //{{AFX_DATA(CAboutDlg)
- enum { IDD = IDD_ABOUTBOX };
- //}}AFX_DATA
- // ClassWizard generated virtual function overrides
- //{{AFX_VIRTUAL(CAboutDlg)
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
- //}}AFX_VIRTUAL
- // Implementation
- protected:
- //{{AFX_MSG(CAboutDlg)
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
- };
- CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
- {
- //{{AFX_DATA_INIT(CAboutDlg)
- //}}AFX_DATA_INIT
- }
- void CAboutDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CAboutDlg)
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
- //{{AFX_MSG_MAP(CAboutDlg)
- // No message handlers
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CFileWatcherDlg dialog
- CFileWatcherDlg::CFileWatcherDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CFileWatcherDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CFileWatcherDlg)
- m_csStrPath = _T("");
- //}}AFX_DATA_INIT
- // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- }
- void CFileWatcherDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CFileWatcherDlg)
- DDX_Control(pDX, IDC_LIST_DATA, m_csListData);
- DDX_Control(pDX, IDC_EDIT_PATH, m_csEdtPath);
- DDX_Control(pDX, IDC_BTN_CTRL, m_csBtnCtrl);
- DDX_Text(pDX, IDC_EDIT_PATH, m_csStrPath);
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CFileWatcherDlg, CDialog)
- //{{AFX_MSG_MAP(CFileWatcherDlg)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- ON_NOTIFY(NM_RCLICK, IDC_LIST_DATA, OnRclickListData)
- ON_COMMAND(IDR_MNU_OPEN, OnMnuOpen)
- ON_COMMAND(IDR_MNU_DELSEL, OnMnuDelsel)
- ON_COMMAND(IDR_MNU_DELALL, OnMnuDelall)
- ON_BN_CLICKED(IDC_BTN_CTRL, OnBtnCtrl)
- ON_WM_SIZE()
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CFileWatcherDlg message handlers
- BOOL CFileWatcherDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // Add "About..." menu item to system menu.
- // IDM_ABOUTBOX must be in the system command range.
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
- CMenu* pSysMenu = GetSystemMenu(FALSE);
- if (pSysMenu != NULL)
- {
- CString strAboutMenu;
- strAboutMenu.LoadString(IDS_ABOUTBOX);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
- }
- // Set the icon for this dialog. The framework does this automatically
- // when the application's main window is not a dialog
- SetIcon(m_hIcon, TRUE); // Set big icon
- SetIcon(m_hIcon, FALSE); // Set small icon
-
- //=======> 初始化标识符
- this->m_bStart = FALSE;
- //======> 初始化视图控件
- this->InitializeListCtrl();
- //======> 创建托盘图标
- this->NotifyTray(TRUE);
- //=====> 窗口置顶
- this->SetWindowPos(&this->wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
-
- return TRUE; // return TRUE unless you set the focus to a control
- }
- void CFileWatcherDlg::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if ((nID & 0xFFF0) == IDM_ABOUTBOX)
- {
- CAboutDlg dlgAbout;
- dlgAbout.DoModal();
- }
- else
- {
- CDialog::OnSysCommand(nID, lParam);
- }
- }
- // If you add a minimize button to your dialog, you will need the code below
- // to draw the icon. For MFC applications using the document/view model,
- // this is automatically done for you by the framework.
- void CFileWatcherDlg::OnPaint()
- {
- if (IsIconic())
- {
- CPaintDC dc(this); // device context for painting
- SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
- // Center icon in client rectangle
- int cxIcon = GetSystemMetrics(SM_CXICON);
- int cyIcon = GetSystemMetrics(SM_CYICON);
- CRect rect;
- GetClientRect(&rect);
- int x = (rect.Width() - cxIcon + 1) / 2;
- int y = (rect.Height() - cyIcon + 1) / 2;
- // Draw the icon
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CDialog::OnPaint();
- }
- }
- // The system calls this to obtain the cursor to display while the user drags
- // the minimized window.
- HCURSOR CFileWatcherDlg::OnQueryDragIcon()
- {
- return (HCURSOR) m_hIcon;
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】初始化视图列表控件
- //【参数】无
- //【描述】创建栏目,设置扩展样式
- void CFileWatcherDlg::InitializeListCtrl()
- {
- this->m_csListData.InsertColumn(0, "时间", LVCFMT_LEFT, 75);
- this->m_csListData.InsertColumn(1, "动作", LVCFMT_LEFT, 50);
- this->m_csListData.InsertColumn(2, "类型", LVCFMT_LEFT, 75);
- this->m_csListData.InsertColumn(3, "信息", LVCFMT_LEFT, 500);
- //========> 设置扩展样式
- this->m_csListData.SetExtendedStyle(
- LVS_EX_GRIDLINES |
- LVS_EX_FULLROWSELECT |
- LVS_EX_FLATSB
- );
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】选择目录路径
- //【参数】无
- //【描述】调用SH函数,弹出目录选择对话框,选择目录
- CString CFileWatcherDlg::SelectPath()
- {
- BROWSEINFO stBrowseInfo;
- ITEMIDLIST *lpstIDLst = NULL;
- char szPath[MAX_PATH] = {0};
-
- //===========> 初始化结构
- stBrowseInfo.hwndOwner = this->m_hWnd;
- stBrowseInfo.pidlRoot = NULL;
- stBrowseInfo.pszDisplayName = NULL;
- stBrowseInfo.lpszTitle = "请选择目录";
- stBrowseInfo.ulFlags = BIF_RETURNONLYFSDIRS;
- stBrowseInfo.lpfn = NULL;
- stBrowseInfo.lParam = 0;
- stBrowseInfo.iImage = 0;
- //=======> 弹出目录选择对话框
- if ((lpstIDLst = ::SHBrowseForFolder(&stBrowseInfo)) == FALSE)
- {
- return "";
- }
- //========> 取得目录路径
- if (::SHGetPathFromIDList(lpstIDLst, szPath) == FALSE)
- {
- return "";
- }
- return szPath;
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】创建程序托盘
- //【参数】bCreate 如果TRUE,创建托盘,反之销毁托盘
- //【描述】为程序创建托盘,显示在任务栏下方
- BOOL CFileWatcherDlg::NotifyTray(BOOL bCreate)
- {
- NOTIFYICONDATA stNotify = {0};
- stNotify.cbSize = sizeof(NOTIFYICONDATA);
- stNotify.hIcon = this->m_hIcon;
- stNotify.hWnd = this->GetSafeHwnd();
- strcpy(stNotify.szTip, "目录监控程序(双击显示窗口)");
- stNotify.uCallbackMessage = WM_MY_NOTIFY;
- stNotify.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
- stNotify.uID = IDR_MAINFRAME;
- if (bCreate == TRUE)
- {
- return ::Shell_NotifyIcon(NIM_ADD, &stNotify);
- }
- return ::Shell_NotifyIcon(NIM_DELETE, &stNotify);
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】视图控件右击过程
- //【参数】略
- //【描述】右击的是否显示弹出菜单
- void CFileWatcherDlg::OnRclickListData(NMHDR* pNMHDR, LRESULT* pResult)
- {
- *pResult = 0;
- CMenu csMenu;
- POINT stPos = {0};
- //======> 取得当前鼠标位置
- ::GetCursorPos(&stPos);
- //====> 加载资源菜单
- csMenu.LoadMenu(IDR_MNU_POP);
- //===========> 判断是否选中有项目
- if (this->m_csListData.GetSelectionMark() == -1)
- {
- csMenu.EnableMenuItem(IDR_MNU_OPEN, MF_GRAYED);
- csMenu.EnableMenuItem(IDR_MNU_DELSEL, MF_GRAYED);
- }
- //==========> 判断是否存在项目
- if (this->m_csListData.GetItemCount() == 0)
- {
- csMenu.EnableMenuItem(IDR_MNU_DELALL, MF_GRAYED);
- }
- //======> 弹出菜单
- csMenu.GetSubMenu(0)->TrackPopupMenu(
- TPM_LEFTALIGN,
- stPos.x,
- stPos.y,
- this);
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】菜单“打开”过程
- //【参数】略
- //【描述】打开视图控件缓冲区中的路径
- void CFileWatcherDlg::OnMnuOpen()
- {
- int nItem = 0;
- DWORD dwAct = 0;
- CString csStrShell, csStrInfo;
- HINSTANCE hInst = NULL;
- this->UpdateData();
- nItem = this->m_csListData.GetSelectionMark();
- dwAct = this->m_csListData.GetItemData(nItem);
- switch (dwAct)
- {
- case CWatcher::actRenameNew:
- {
- //=======> 取得内容
- csStrInfo = this->m_csListData.GetItemText(nItem, 3);
- //======== 计算路径
- csStrShell =
- this->m_csStrPath +
- "\\" +
- csStrInfo.Mid(csStrInfo.Find(" -> ", 0), csStrInfo.GetLength());
- }
- break;
- case CWatcher::actRemote:
- {
- MessageBox("你会数据恢复吗?");
- // 返回
- return;
- }
- break;
- case CWatcher::actCreate:
- case CWatcher::actChange:
- {
- //======> 计算路径
- csStrShell =
- this->m_csStrPath +
- "\\" +
- this->m_csListData.GetItemText(nItem, 3);
- }
- break;
- }
- //======> 打开
- hInst = ::ShellExecute(NULL,
- "open",
- csStrShell,
- NULL,
- NULL,
- SW_SHOWNORMAL);
- if (hInst == NULL)
- {
- MessageBox("你当我是生产队?");
- }
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】菜单“删除选择”过程
- //【参数】略
- //【描述】删除视图控件当前选中的项目
- void CFileWatcherDlg::OnMnuDelsel()
- {
- this->m_csListData.DeleteItem(
- this->m_csListData.GetSelectionMark()
- );
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】菜单“删除所有”过程
- //【参数】略
- //【描述】删除视图控件所有项目
- void CFileWatcherDlg::OnMnuDelall()
- {
- this->m_csListData.DeleteAllItems();
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】开始\结束目录监视
- //【参数】略
- //【描述】调用CWatcher::Create开始创建目录监视
- void CFileWatcherDlg::OnBtnCtrl()
- {
- this->UpdateData();
- if (this->m_bStart == FALSE)
- {
- if (this->m_csWatcher.Create(this->m_csStrPath) == FALSE)
- {
- this->MessageBox("监视目录失败");
- }
- else
- {
- this->m_bStart = TRUE;
- this->m_csEdtPath.EnableWindow(FALSE);
- this->m_csBtnCtrl.SetWindowText("停止");
- }
- }
- else
- {
- this->m_csWatcher.Destroy();
- this->m_bStart = FALSE;
- this->m_csEdtPath.EnableWindow(TRUE);
- this->m_csBtnCtrl.SetWindowText("开始");
- }
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】未转换的消息处理过程
- //【参数】略
- //【描述】继承此虚拟函数来处理,在Edit里面的双击事件
- BOOL CFileWatcherDlg::PreTranslateMessage(MSG* pMsg)
- {
- if (pMsg->message == WM_LBUTTONDBLCLK)
- {
- if (pMsg->hwnd == this->m_csEdtPath.m_hWnd)
- {
- //=========> 判断是否已经开始
- if (this->m_bStart == FALSE)
- {
- //======> 取得选中目录纪路径
- this->m_csEdtPath.SetWindowText(this->SelectPath());
- }
- }
- }
- return CDialog::PreTranslateMessage(pMsg);
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】消息处理过程
- //【参数】略
- //【描述】继承此虚拟函数来处理,在托盘里面的双击事件
- LRESULT CFileWatcherDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
- {
- if (message == WM_MY_NOTIFY)
- {
- if (lParam == WM_LBUTTONDBLCLK)
- {
- //=====> 显示窗口
- ShowWindow(SW_RESTORE);
- //=====> 激活窗口
- SetForegroundWindow();
- }
- }
- return CDialog::WindowProc(message, wParam, lParam);
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】程序退出过程
- //【参数】略
- //【描述】删除了调用基类的OnOK事件,以免按回车退出程序
- void CFileWatcherDlg::OnOK()
- {
- // CDialog::OnOK() 取消了此事件
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】程序退出过程
- //【参数】略
- //【描述】退出时候,弹出消息框,提示用户时候退出。销毁监视,删除托盘图标
- void CFileWatcherDlg::OnCancel()
- {
- if (::AfxMessageBox("你是否要退出程序?", MB_YESNO | MB_ICONSTOP) == IDYES)
- {
- this->NotifyTray(FALSE);
- this->m_csWatcher.Destroy();
- CDialog::OnCancel();
- }
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】窗口尺寸改变过程
- //【参数】略
- //【描述】主要利用此过程完成程序最小化的时候隐藏
- void CFileWatcherDlg::OnSize(UINT nType, int cx, int cy)
- {
- CDialog::OnSize(nType, cx, cy);
-
- if (nType == SIZE_MINIMIZED)
- {
- this->ShowWindow(SW_HIDE);
- }
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】判断是否是一个文件夹
- //【参数】lpszPath 判断路径
- //【描述】取得文件夹属性,然后,与 比较,返回
- BOOL CFileWatcherDlg::IsFolder(LPCTSTR lpszPath)
- {
- DWORD dwAttrib = 0;
- dwAttrib = GetFileAttributes(lpszPath);
- return (dwAttrib != -1) &&
- ((dwAttrib & FILE_ATTRIBUTE_DIRECTORY)?TRUE:FALSE);
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- //【名称】监控过程
- //【参数】dwAction 动作类型。csStrName1, csStrName2 相关名称
- //【描述】处理动作,不要调用Destroy。来自CWatcher转发
- void CFileWatcherDlg::OnWatch(DWORD dwAct, CString csStrName1, CString csStrName2)
- {
- CString csStrTime, csStrAct, csStrType,
- csStrPath , csStrInfo;
- int nItem = 0;
- //=======> 取得时间
- csStrTime = ::CTime::GetCurrentTime().Format("%H:%M:%S");
- //=========> 取得全路径
- csStrPath = m_csStrPath + "\\" + csStrName1; // Only 1
- //========> 判断类型,生成字符串
- if (this->IsFolder(csStrPath) == TRUE)
- {
- csStrType = "文件夹";
- }
- else
- {
- csStrType = "文件";
- }
- //==========> 判断类型
- switch (dwAct)
- {
- case CWatcher::actCreate:
- {
- csStrAct = "创建";
- csStrInfo = csStrName1;
- }
- break;
- case CWatcher::actRemote:
- {
- csStrAct = "删除";
- csStrInfo = csStrName1;
- }
- break;
- case CWatcher::actRenameNew:
- {
- csStrAct = "重命";
- csStrInfo = csStrName1 + " -> " + csStrName2;
- }
- break;
- case CWatcher::actChange:
- {
- csStrAct = "更改";
- csStrInfo = csStrName1;
- }
- break;
- }
-
- //============> 添加信息到视图控件
- nItem = this->m_csListData.InsertItem(0, csStrTime);
- this->m_csListData.SetItemText(nItem, 1, csStrAct);
- this->m_csListData.SetItemText(nItem, 2, csStrType);
- this->m_csListData.SetItemText(nItem, 3, csStrInfo);
- //=========> 保存动作到控件内部
- this->m_csListData.SetItemData(nItem, dwAct);
- }
|