第七章 目录监视 windows程序设计王艳平版
#ifndef __DIRDIALOG_H_
#define __DIRDIALOG_H_
#include <shlobj.h>
class CDirDialog
{
public:
CDirDialog();
// 顯示對(duì)話框
BOOL DoBrowse(HWND hWndParent, LPCTSTR pszTitle = NULL);
// 取得用戶選擇的目錄名稱
LPCTSTR GetPath() { return m_szPath; }
protected:
BROWSEINFOA m_bi;?
// 用來(lái)接受用戶選擇目錄的緩沖區(qū)
char m_szDisplay[MAX_PATH];
char m_szPath[MAX_PATH];
};
CDirDialog::CDirDialog()
{
memset(&m_bi, 0, sizeof(m_bi));
m_bi.hwndOwner = NULL;?
m_bi.pidlRoot = NULL;
m_bi.pszDisplayName = m_szDisplay;?
m_bi.lpszTitle = NULL;
m_bi.ulFlags = BIF_RETURNONLYFSDIRS;
m_szPath[0] = '\0';
}
BOOL CDirDialog::DoBrowse(HWND hWndParent, LPCTSTR pszTitle)
{
if(pszTitle == NULL)
m_bi.lpszTitle = "選擇目標(biāo)文件夾";
else
m_bi.lpszTitle = pszTitle;
m_bi.hwndOwner = hWndParent;
LPITEMIDLIST pItem = ::SHBrowseForFolder(&m_bi);
if(pItem != 0)
{
::SHGetPathFromIDList(pItem, m_szPath);
return TRUE;
}
return FALSE;
}
#endif //__DIRDIALOG_H_
///
// MonitorDir.cpp文件
#include "resource.h"
#include "MonitorDir.h"
#include "DirDialog.h"
#include "SkinMagicLib.h"
// 注意,如果您鏈接MFC時(shí)使用的是Share DLL則應(yīng)該選擇SkinMagicLibMD6Trial.lib庫(kù)
#pragma comment(lib, "SkinMagicLibMT6Trial")
CMyApp theApp;
BOOL CMyApp::InitInstance()
{
//===SkinMagic===
// 初始化SkinMagic庫(kù)
VERIFY(InitSkinMagicLib(AfxGetInstanceHandle(), "MonitorDir", NULL, NULL));
// 從資源中加載皮膚文件。也可以用代碼“LoadSkinFile("corona.smf")”直接從文件中加載
if(LoadSkinFromResource(AfxGetInstanceHandle(), (LPCTSTR)IDR_SKINMAGIC1, "SKINMAGIC"))
{
// 設(shè)置對(duì)話框默認(rèn)皮膚
SetDialogSkin("Dialog");?
}
//===SkinMagic===
CMonitorDialog dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
return FALSE; // 返回FALSE阻止程序進(jìn)入消息循環(huán)
}
int CMyApp::ExitInstance()
{
//===SkinMagic===
// 釋放SkinMagic庫(kù)申請(qǐng)的內(nèi)存
ExitSkinMagicLib();
//===SkinMagic===
return CWinApp::ExitInstance();
}
CMonitorDialog::CMonitorDialog(CWnd* pParentWnd):CDialog(IDD_MAINDIALOG, pParentWnd)
{
m_hEvent = ::CreateEvent(NULL, FALSE, 0, NULL);
}
CMonitorDialog::~CMonitorDialog()
{
::CloseHandle(m_hEvent);
}
BEGIN_MESSAGE_MAP(CMonitorDialog, CDialog)
ON_BN_CLICKED(IDC_START, OnStart)
ON_BN_CLICKED(IDC_STOP, OnStop)
ON_BN_CLICKED(IDC_BROWSER, OnBrowser)
ON_BN_CLICKED(IDC_CLEAR, OnClear)
END_MESSAGE_MAP()
BOOL CMonitorDialog::OnInitDialog()
{
// 讓父類進(jìn)行內(nèi)部初始化
CDialog::OnInitDialog();
// 設(shè)置圖標(biāo)
SetIcon(theApp.LoadIcon(IDI_MAIN), FALSE);
// 創(chuàng)建狀態(tài)欄,設(shè)置它的屬性(CStatusBarCtrl類封裝了對(duì)狀態(tài)欄控件的操作)
m_bar.Create(WS_CHILD|WS_VISIBLE|SBS_SIZEGRIP, CRect(0, 0, 0, 0), this, 101);
m_bar.SetBkColor(RGB(0xa6, 0xca, 0xf0));// 背景色
int arWidth[] = { 250, -1 };
m_bar.SetParts(2, arWidth);// 分欄
m_bar.SetText(" Windows程序設(shè)計(jì)進(jìn)階之路!", 1, 0);// 第二個(gè)欄的文本
m_bar.SetText(" 空閑", 0, 0);// 第一個(gè)欄的文本
// 無(wú)效停止按鈕
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
// 設(shè)置各個(gè)復(fù)選框?yàn)檫x中狀態(tài)
((CButton*)GetDlgItem(IDC_SUBDIR))->SetCheck(1);
((CButton*)GetDlgItem(IDC_FILENAME_CHANGE))->SetCheck(1);
((CButton*)GetDlgItem(IDC_FILESIZE_CHANGE))->SetCheck(1);
((CButton*)GetDlgItem(IDC_DIRNAME_CHANGE))->SetCheck(1);
((CButton*)GetDlgItem(IDC_LASTWRITE_CHANGE))->SetCheck(1);
((CButton*)GetDlgItem(IDC_ATTRIBUTE_CHANGE))->SetCheck(1);
((CButton*)GetDlgItem(IDC_SECURITY_CHANGE))->SetCheck(1);
return TRUE;
}
void CMonitorDialog::OnBrowser() // 用戶點(diǎn)擊瀏覽按鈕
{
// 彈出選擇目錄對(duì)話框
CDirDialog dir;
if(dir.DoBrowse(m_hWnd, "請(qǐng)選擇您要監(jiān)視的目錄:"))
{
GetDlgItem(IDC_TARGETDIR)->SetWindowText(dir.GetPath());
}
}
void CMonitorDialog::OnStart() // 用戶點(diǎn)擊開始按鈕
{
CString strDir;
// 取得目錄名稱
GetDlgItem(IDC_TARGETDIR)->GetWindowText(strDir);
if(strDir.IsEmpty())
{
MessageBox("請(qǐng)選擇一個(gè)要監(jiān)視的目錄!");
return;
}
// 用事件對(duì)象句柄初始化句柄數(shù)組
for(int i=0; i<6; i++)
m_arhChange[i] = m_hEvent;
m_bExit = FALSE;
// 是否要監(jiān)視子目錄
BOOL bSubDir = ((CButton*)GetDlgItem(IDC_SUBDIR))->GetCheck();
BOOL bNeedExecute = FALSE;
// 監(jiān)視目錄名稱的改變 arhChange[0]
if(((CButton*)GetDlgItem(IDC_DIRNAME_CHANGE))->GetCheck())
{
m_arhChange[0] =?
::FindFirstChangeNotification(strDir, bSubDir, FILE_NOTIFY_CHANGE_DIR_NAME);
bNeedExecute = TRUE;
}
// 監(jiān)視文件名稱的改變 arhChange[1]
if(((CButton*)GetDlgItem(IDC_FILENAME_CHANGE))->GetCheck())
{
m_arhChange[1] =?
::FindFirstChangeNotification(strDir, bSubDir, FILE_NOTIFY_CHANGE_FILE_NAME);
bNeedExecute = TRUE;
}
// 監(jiān)視屬性的改變 arhChange[2]
if(((CButton*)GetDlgItem(IDC_ATTRIBUTE_CHANGE))->GetCheck())
{
m_arhChange[2] =?
::FindFirstChangeNotification(strDir, bSubDir, FILE_NOTIFY_CHANGE_ATTRIBUTES);
bNeedExecute = TRUE;
}
// 監(jiān)視文件大小的改變 arhChange[3]
if(((CButton*)GetDlgItem(IDC_FILESIZE_CHANGE))->GetCheck())
{
m_arhChange[3] =?
::FindFirstChangeNotification(strDir, bSubDir, FILE_NOTIFY_CHANGE_SIZE);
bNeedExecute = TRUE;
}
// 監(jiān)視最后寫入時(shí)間的改變arhChange[4]
if(((CButton*)GetDlgItem(IDC_LASTWRITE_CHANGE))->GetCheck())
{
m_arhChange[4] =?
::FindFirstChangeNotification(strDir, bSubDir, FILE_NOTIFY_CHANGE_LAST_WRITE);
bNeedExecute = TRUE;
}
// 監(jiān)視安全屬性的改變 arhChange[5]
if(((CButton*)GetDlgItem(IDC_SECURITY_CHANGE))->GetCheck())
{
m_arhChange[5] =?
::FindFirstChangeNotification(strDir, bSubDir, FILE_NOTIFY_CHANGE_SECURITY);
bNeedExecute = TRUE;
}
if(!bNeedExecute)
{
MessageBox("請(qǐng)選擇一個(gè)監(jiān)視類型!");
return;
}
// 啟動(dòng)監(jiān)視線程
AfxBeginThread(MonitorThread, this);
// 更新界面
GetDlgItem(IDC_START)->EnableWindow(FALSE);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
m_bar.SetText(" 正在監(jiān)視...", 0, 0);
}
void CMonitorDialog::OnStop() // 用戶點(diǎn)擊停止按鈕
{
if(!m_bExit)
{
// 設(shè)置退出標(biāo)志
m_bExit = TRUE;
for(int i=0; i<6; i++)
{
if(m_arhChange[i] != m_hEvent)
::FindCloseChangeNotification(m_arhChange[i]);
}
}
GetDlgItem(IDC_START)->EnableWindow(TRUE);
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
m_bar.SetText(" 空閑", 0, 0);
}
void CMonitorDialog::OnClear() // 用戶點(diǎn)擊清空按鈕
{
GetDlgItem(IDC_EDITCHANGES)->SetWindowText("");
}
void CMonitorDialog::OnCancel()
{
OnStop();
CDialog::OnCancel();
}
void CMonitorDialog::AddStringToList(LPCTSTR lpszString)
{
// 向"改變"窗口中添加文本
CString strEdit;
GetDlgItem(IDC_EDITCHANGES)->GetWindowText(strEdit);
strEdit += lpszString;
GetDlgItem(IDC_EDITCHANGES)->SetWindowText(strEdit);
}
UINT MonitorThread(LPVOID lpParam)
{
CMonitorDialog* pDlg = (CMonitorDialog*)lpParam;
while(TRUE)
{
// 在多個(gè)改變通知事件上等待
DWORD nObjectWait = ::WaitForMultipleObjects(
6, pDlg->m_arhChange, FALSE, INFINITE);
if(pDlg->m_bExit)// 用戶要求退出
break;
// 查找促使等待函數(shù)返回的句柄,通知用戶
int nIndex = nObjectWait - WAIT_OBJECT_0;
switch(nIndex)
{
case 0:
pDlg->AddStringToList(" Directory name changed \r\n");
break;
case 1:
pDlg->AddStringToList(" File name changed \r\n");
break;
case 2:
pDlg->AddStringToList(" File attribute changed \r\n");
break;
case 3:
pDlg->AddStringToList(" File size changed \r\n");
break;
case 4:
pDlg->AddStringToList(" Last write changed \r\n");
break;
case 5:
pDlg->AddStringToList(" Security changed \r\n");
break;
}
// 繼續(xù)監(jiān)視
::FindNextChangeNotification(pDlg->m_arhChange[nObjectWait]);
}
return 0;
}
/*
InitSkinMagicLib(AfxGetInstanceHandle(), "MonitorDir", NULL, NULL);
if(LoadSkinFile("Devior.smf"))
{
SetDialogSkin("Dialog");
}
? */
// MonitorDir.h文件
#include <afxwin.h>
#include <afxcmn.h> // 為了使用CStatusBarCtrl類
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
};
class CMonitorDialog : public CDialog
{
public:
CMonitorDialog(CWnd* pParentWnd = NULL);
~CMonitorDialog();
protected:
// 向輸出窗口添加文本
void AddStringToList(LPCTSTR lpszString);
// 監(jiān)視線程
friend UINT MonitorThread(LPVOID lpParam);
CStatusBarCtrl m_bar;// 一個(gè)狀態(tài)欄對(duì)象
HANDLE m_hEvent;// 用于占位的事件對(duì)象句柄
HANDLE m_arhChange[6];// 改變通知事件的6個(gè)句柄
BOOL m_bExit; // 指示監(jiān)視線程是否退出
protected:
virtual BOOL OnInitDialog();
virtual void OnCancel();
afx_msg void OnBrowser();
afx_msg void OnStart();
afx_msg void OnStop();
afx_msg void OnClear();
DECLARE_MESSAGE_MAP()
};
總結(jié)
以上是生活随笔為你收集整理的第七章 目录监视 windows程序设计王艳平版的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 实验七 MapReduce实验:计数器
- 下一篇: 联想笔记本无法切换独显、强行切换提示核芯