⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monitordir.cpp

📁 《windows程序设计》王艳平版的书籍源代码
💻 CPP
字号:
////////////////////////////////////////////////
// MonitorDir.cpp文件

#include "resource.h"
#include "MonitorDir.h"
#include "DirDialog.h"

#include "SkinMagicLib.h"
// 注意,如果您链接MFC时使用的是Share DLL则应该选择SkinMagicLibMD6Trial.lib库
#pragma comment(lib, "SkinMagicLibMT6Trial")

CMyApp theApp;

BOOL CMyApp::InitInstance()
{
	//===SkinMagic===

	// 初始化SkinMagic库
	VERIFY(InitSkinMagicLib(AfxGetInstanceHandle(), "MonitorDir", NULL, NULL));
	// 从资源中加载皮肤文件。也可以用代码“LoadSkinFile("corona.smf")”直接从文件中加载
	if(LoadSkinFromResource(AfxGetInstanceHandle(), (LPCTSTR)IDR_SKINMAGIC1, "SKINMAGIC"))
	{
		// 设置对话框默认皮肤
		SetDialogSkin("Dialog"); 
	}

	//===SkinMagic===

	CMonitorDialog dlg;
	m_pMainWnd = &dlg;
	dlg.DoModal();

	return FALSE;	// 返回FALSE阻止程序进入消息循环
}

int CMyApp::ExitInstance()
{
	//===SkinMagic===

	// 释放SkinMagic库申请的内存
	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()
{
	// 让父类进行内部初始化
	CDialog::OnInitDialog();

	// 设置图标
	SetIcon(theApp.LoadIcon(IDI_MAIN), FALSE);

	// 创建状态栏,设置它的属性(CStatusBarCtrl类封装了对状态栏控件的操作)
	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程序设计进阶之路!", 1, 0);	// 第二个栏的文本
	m_bar.SetText(" 空闲", 0, 0);				// 第一个栏的文本

	// 无效停止按钮
	GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
	// 设置各个复选框为选中状态
	((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()	// 用户点击浏览按钮
{
	// 弹出选择目录对话框
	CDirDialog dir;
	if(dir.DoBrowse(m_hWnd, "请选择您要监视的目录:"))
	{
		GetDlgItem(IDC_TARGETDIR)->SetWindowText(dir.GetPath());
	}
}

void CMonitorDialog::OnStart()		// 用户点击开始按钮
{
	CString strDir;
	// 取得目录名称
	GetDlgItem(IDC_TARGETDIR)->GetWindowText(strDir);
	if(strDir.IsEmpty())
	{
		MessageBox("请选择一个要监视的目录!");
		return;
	}

	
	// 用事件对象句柄初始化句柄数组
	for(int i=0; i<6; i++)
		m_arhChange[i] = m_hEvent;
	m_bExit = FALSE;

	// 是否要监视子目录
	BOOL bSubDir = ((CButton*)GetDlgItem(IDC_SUBDIR))->GetCheck();
	BOOL bNeedExecute = FALSE;

	// 监视目录名称的改变		arhChange[0]
	if(((CButton*)GetDlgItem(IDC_DIRNAME_CHANGE))->GetCheck())
	{
		m_arhChange[0] = 
			::FindFirstChangeNotification(strDir, bSubDir, FILE_NOTIFY_CHANGE_DIR_NAME);
		bNeedExecute = TRUE;
	}
	// 监视文件名称的改变		arhChange[1]
	if(((CButton*)GetDlgItem(IDC_FILENAME_CHANGE))->GetCheck())
	{
		m_arhChange[1] = 
			::FindFirstChangeNotification(strDir, bSubDir, FILE_NOTIFY_CHANGE_FILE_NAME);
		bNeedExecute = TRUE;
	}
	// 监视属性的改变		arhChange[2]
	if(((CButton*)GetDlgItem(IDC_ATTRIBUTE_CHANGE))->GetCheck())
	{
		m_arhChange[2] = 
			::FindFirstChangeNotification(strDir, bSubDir, FILE_NOTIFY_CHANGE_ATTRIBUTES);
		bNeedExecute = TRUE;
	}
	// 监视文件大小的改变		arhChange[3]
	if(((CButton*)GetDlgItem(IDC_FILESIZE_CHANGE))->GetCheck())
	{
		m_arhChange[3] = 
			::FindFirstChangeNotification(strDir, bSubDir, FILE_NOTIFY_CHANGE_SIZE);
		bNeedExecute = TRUE;
	}
	// 监视最后写入时间的改变	arhChange[4]
	if(((CButton*)GetDlgItem(IDC_LASTWRITE_CHANGE))->GetCheck())
	{
		m_arhChange[4] = 
			::FindFirstChangeNotification(strDir, bSubDir, FILE_NOTIFY_CHANGE_LAST_WRITE);
		bNeedExecute = TRUE;
	}
	// 监视安全属性的改变		arhChange[5]
	if(((CButton*)GetDlgItem(IDC_SECURITY_CHANGE))->GetCheck())
	{
		m_arhChange[5] = 
			::FindFirstChangeNotification(strDir, bSubDir, FILE_NOTIFY_CHANGE_SECURITY);
		bNeedExecute = TRUE;
	}

	if(!bNeedExecute)
	{
		MessageBox("请选择一个监视类型!");
		return;
	}

	// 启动监视线程
	AfxBeginThread(MonitorThread, this);
	// 更新界面
	GetDlgItem(IDC_START)->EnableWindow(FALSE);
	GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
	m_bar.SetText(" 正在监视...", 0, 0);
}

void CMonitorDialog::OnStop()		// 用户点击停止按钮
{
	if(!m_bExit)
	{
		// 设置退出标志
		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()		// 用户点击清空按钮
{
	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)
	{
		// 在多个改变通知事件上等待
		DWORD nObjectWait = ::WaitForMultipleObjects(
					6, pDlg->m_arhChange, FALSE, INFINITE);

		if(pDlg->m_bExit)	// 用户要求退出
			break;
		// 查找促使等待函数返回的句柄,通知用户
		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;
		}
		// 继续监视
		::FindNextChangeNotification(pDlg->m_arhChange[nObjectWait]);
	}
	return 0;
}





/*

	InitSkinMagicLib(AfxGetInstanceHandle(), "MonitorDir", NULL, NULL);

	if(LoadSkinFile("Devior.smf"))
	{
		SetDialogSkin("Dialog");
	}

  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -