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

📄 filedlg.cpp

📁 近来看《windows驱动开发技术详解》, 照着书上做了一个加载和卸载驱动的小工具
💻 CPP
字号:

/********************************************************************

Copyright 2006-2008 ZHANG Luduo. All Rights Reserved.

Permission to use, copy, modify, distribute and sell this software
and its documentation for any purpose is hereby granted without fee,
provided that the above copyright notice appear in all copies and
that both that copyright notice and this permission notice appear
in supporting documentation.

********************************************************************/

/*
代码描述:

	通用对话框之[文件打开], [文件保存], [目录浏览]

关于作者:

	姓名  - 张鲁夺, ZHANG Luduo
	MSN   - zhangluduo@msn.com
	Email - zhangluduo@163.com
	QQ群  - 34064264, 56918155, 56918241
	网站  - http://www.oopfans.com

	为所有爱我的人和我爱的人努力!
*/

#include "stdafx.h"
#include "FileDlg.h"

FileDlg::FileDlg()
{
	m_NameBuf = NULL;
	m_bBrowseInit = FALSE;
	m_dwBufferSize = 1024;

	memset(&m_OFNOpen, 0, sizeof(OPENFILENAME));
	memset(&m_OFNSave, 0, sizeof(OPENFILENAME));
	memset(&m_BIFBrowse, 0, sizeof(BROWSEINFO));

	TCHAR tbuf[MAX_PATH] = { 0 };
	GetModuleFileName(NULL, tbuf, MAX_PATH);

	m_InitDir  = tbuf;
	m_InitName = tbuf;

	m_InitDir  = m_InitDir.substr(0, m_InitDir.find_last_of(_T("\\")) + 1);
	m_InitName = m_InitName.substr(m_InitName.find_last_of(_T("\\")) + 1);

	m_OFNOpen.lStructSize = sizeof(OPENFILENAME);
	m_OFNSave.lStructSize = sizeof(OPENFILENAME);

	OSVERSIONINFOEX osvi = { 0 };
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
	GetVersionEx((OSVERSIONINFO *)&osvi);

	switch(osvi.dwPlatformId)
	{
	case VER_PLATFORM_WIN32_WINDOWS:
		if(	(osvi.dwMajorVersion==4 && osvi.dwMinorVersion ==10) || //win 98
			(osvi.dwMajorVersion==4 && osvi.dwMinorVersion ==90) || //win Me
			(osvi.dwMajorVersion==3 && osvi.dwMinorVersion ==51) || //win NT 3.51
			(osvi.dwMajorVersion==4 && osvi.dwMinorVersion ==0))	//win NT 4.0
		{
			m_OFNOpen.lStructSize = 76;
			m_OFNSave.lStructSize = 76;
		}
		break;
	case VER_PLATFORM_WIN32_NT:
		if(	(osvi.dwMajorVersion==5 && osvi.dwMinorVersion ==0) ||	//win 2000
			(osvi.dwMajorVersion==5 && osvi.dwMinorVersion ==1) ||	//win xp
			(osvi.dwMajorVersion==5 && osvi.dwMinorVersion ==2))	//win 2003
		{
			m_OFNOpen.lStructSize = 88;
			m_OFNSave.lStructSize = 88;
		}
		break;
	default:
		{
			m_OFNOpen.lStructSize = 76;
			m_OFNSave.lStructSize = 76;		
		}
	}
}

FileDlg::~FileDlg()
{
	if(NULL != m_NameBuf)
		delete[] m_NameBuf;
}

UINT_PTR FileDlg::OpenProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	if(uMsg == WM_INITDIALOG)
	{
		RECT rtWnd, rcSys;
		::GetWindowRect(GetParent(hWnd), &rtWnd);
		SystemParametersInfo(SPI_GETWORKAREA, 0, &rcSys, 0);
		::MoveWindow(GetParent(hWnd),
				(rcSys.right - (rtWnd.right	- rtWnd.left)) / 2,
				(rcSys.bottom - (rtWnd.bottom	- rtWnd.top)) / 2,
				rtWnd.right	- rtWnd.left, rtWnd.bottom - rtWnd.top,
				true);
	}
	return 0;
}

UINT_PTR FileDlg::SaveProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	if(uMsg == WM_INITDIALOG)
	{
		RECT rtWnd, rcSys;
		::GetWindowRect(GetParent(hWnd), &rtWnd);
		SystemParametersInfo(SPI_GETWORKAREA, 0, &rcSys, 0);
		::MoveWindow(GetParent(hWnd),
				(rcSys.right - (rtWnd.right	- rtWnd.left)) / 2,
				(rcSys.bottom - (rtWnd.bottom	- rtWnd.top)) / 2,
				rtWnd.right	- rtWnd.left, rtWnd.bottom - rtWnd.top,
				true);
	}
	return 0;
}

int FileDlg::BrowseProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
	if(uMsg == WM_INITDIALOG)
	{
		RECT rtWnd, rcSys;
		::GetWindowRect(GetParent(hWnd), &rtWnd);
		SystemParametersInfo(SPI_GETWORKAREA, 0, &rcSys, 0);
		::MoveWindow(GetParent(hWnd),
				(rcSys.right - (rtWnd.right	- rtWnd.left)) / 2,
				(rcSys.bottom - (rtWnd.bottom	- rtWnd.top)) / 2,
				rtWnd.right	- rtWnd.left, rtWnd.bottom - rtWnd.top,
				true);
	}

	if(m_bBrowseInit)
	{
		if(uMsg == BFFM_INITIALIZED)
			::SendMessage(hWnd, BFFM_SETSELECTION, 1, (WPARAM)m_InitDir.c_str());
	}
	else
	{
		if(uMsg == BFFM_INITIALIZED)
			::SendMessage(hWnd, BFFM_SETSELECTION, 1, (WPARAM)_T(""));
	}

	if(uMsg == BFFM_SELCHANGED )
	{
		TCHAR buf[MAX_PATH + 1] = { 0 };

		if(SHGetPathFromIDList((LPCITEMIDLIST)lParam, buf) && buf != 0)
		{
			::SendMessage(hWnd, BFFM_ENABLEOK, 0, 1);

			::SendMessage(hWnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)buf);
		}
		else
		{
			::SendMessage(hWnd, BFFM_ENABLEOK, 0, 0);
		}
	}
	return 0;
}

vector<tstring> FileDlg::GetOpenFileName(HWND hWnd, BOOL bMultiSelect, 
				TCHAR* strFilter, tstring strInitName, tstring strInitDir)
{
	m_OFNOpen.hwndOwner = hWnd;
	m_OFNOpen.Flags |= OFN_EXPLORER | OFN_ENABLEHOOK | OFN_FILEMUSTEXIST | OFN_ENABLESIZING;
	m_OFNOpen.nMaxFile = m_dwBufferSize;
	m_OFNOpen.lpfnHook = (LPOFNHOOKPROC)m_lpOpenProc.Thiscall(this, Thunk::GetMemberFxnAddr(&FileDlg::OpenProc));

	if(bMultiSelect) 
		m_OFNOpen.Flags |= OFN_ALLOWMULTISELECT;
	else
		m_OFNOpen.Flags &= ~OFN_ALLOWMULTISELECT;

	if(NULL == strFilter) 
		m_OFNOpen.lpstrFilter = _T("All Files (*.*)\0*.*\0\0");
	else 
		m_OFNOpen.lpstrFilter = strFilter;

	if(!strInitDir.empty())
		m_InitDir = strInitDir;
	m_OFNOpen.lpstrInitialDir = m_InitDir.c_str();

	if(NULL != m_NameBuf)
		delete[] m_NameBuf;
	m_NameBuf = new TCHAR[m_dwBufferSize + 1];
	for(int i = 0; i < m_dwBufferSize + 1; i++)
		m_NameBuf[i] = 0;

	if(!strInitName.empty()) 
		_tcsncpy(m_NameBuf, strInitName.c_str(), strInitName.length());
	m_OFNOpen.lpstrFile = m_NameBuf;

	vector<tstring> Names;

	if(!::GetOpenFileName(&m_OFNOpen))
		goto LABEL_RETURN;
	{
		TCHAR* ptr = m_OFNOpen.lpstrFile;

		if(!(m_OFNOpen.Flags & OFN_ALLOWMULTISELECT))
		{
			Names.push_back(tstring(ptr));
			goto LABEL_RETURN;
		}

		int nFiles = 0;
		tstring strDir = _T("");

		while(*ptr++)
		{
			if(1 == ++nFiles)
			{
				if(GetFileAttributes(ptr - 1) & FILE_ATTRIBUTE_DIRECTORY)
				{
					strDir = ptr - 1;
					if(strDir[strDir.length() - 1] != '\\')
						strDir += '\\';
				}
				else
				{
					Names.push_back(tstring(ptr - 1));
					break;
				}
			}
			else
			{
				Names.push_back(strDir + (ptr - 1));
			}

			while(*ptr++);
		}
	}

LABEL_RETURN:

	// save current directory
	if(Names.size() > 0)
		m_InitDir = Names[0].substr(0, Names[0].find_last_of(_T("\\")));

	delete[] m_NameBuf;
	m_NameBuf = NULL;

	return Names;
}

tstring FileDlg::GetSaveFileName(HWND hWnd, BOOL bAutoAddExtName, 
				TCHAR* strFilter, tstring strInitName, tstring strInitDir)
{
	m_OFNSave.hwndOwner = hWnd;
	m_OFNSave.Flags |= OFN_EXPLORER | OFN_ENABLEHOOK | OFN_OVERWRITEPROMPT | OFN_FILEMUSTEXIST | OFN_ENABLESIZING;
	m_OFNSave.nMaxFile = m_dwBufferSize;
	m_OFNSave.lpfnHook = (LPOFNHOOKPROC)m_lpSaveProc.Thiscall(this, Thunk::GetMemberFxnAddr(&FileDlg::SaveProc));

	if(NULL == strFilter) 
		m_OFNSave.lpstrFilter = _T("All Files (*.*)\0*.*\0\0");
	else 
		m_OFNSave.lpstrFilter = strFilter;

	if(!strInitDir.empty())
		m_InitDir = strInitDir;
	m_OFNSave.lpstrInitialDir = m_InitDir.c_str();

	if(NULL != m_NameBuf)
		delete[] m_NameBuf;
	m_NameBuf = new TCHAR[m_dwBufferSize + 1];
	for(int i = 0; i < m_dwBufferSize + 1; i++)
		m_NameBuf[i] = 0;

	if(!strInitName.empty()) 
		_tcsncpy(m_NameBuf, strInitName.c_str(), strInitName.length());
	m_OFNSave.lpstrFile = m_NameBuf;

	tstring strFileName = _T("");

	if(!::GetSaveFileName(&m_OFNSave))
		goto LABEL_RETURN;

	// Get file name
	strFileName = m_OFNSave.lpstrFile;

	// save current directory
	if(!strFileName.empty())
		m_InitDir = strFileName.substr(0, strFileName.find_last_of(_T("\\")));

	if(!bAutoAddExtName)
		goto LABEL_RETURN;
	
	{
		BOOL bExtName = strFileName.find_last_of(_T(".")) == -1 ? FALSE : TRUE;

		if(bExtName)
			goto LABEL_RETURN;

		vector<tstring> Filters;
		TCHAR* ptr = (TCHAR*)m_OFNSave.lpstrFilter;
		int odd = 0;
		while(*ptr++)
		{
			odd++;
			if(odd == 2)
			{
				Filters.push_back(ptr - 1);
				odd = 0;
			}
			while(*ptr++);
		}

		tstring strFilter = Filters[m_OFNSave.nFilterIndex - 1];
		if(strFilter == _T("*.*"))
			goto LABEL_RETURN;
		
		strFileName += strFilter.substr(strFilter.find_last_of(_T(".")));
	}

LABEL_RETURN:

	delete[] m_NameBuf;
	m_NameBuf = NULL;
	return strFileName;
}

tstring FileDlg::GetBrowseForFolder(HWND hWnd, tstring strInitDir)
{
	if(!strInitDir.empty())
	{
		m_InitDir = strInitDir;
		m_bBrowseInit = TRUE;
	}

	if(NULL != m_NameBuf)
		delete[] m_NameBuf;
	m_NameBuf = new TCHAR[m_dwBufferSize + 1];
	for(int i = 0; i < m_dwBufferSize + 1; i++)
		m_NameBuf[i] = 0;

	m_BIFBrowse.hwndOwner = hWnd;
	m_BIFBrowse.pszDisplayName = m_NameBuf;
	m_BIFBrowse.ulFlags	|= BIF_STATUSTEXT;
	m_BIFBrowse.lpszTitle = _T("Please choose a forlder :");
	m_BIFBrowse.lpfn = (BFFCALLBACK)m_lpBrowseProc.Thiscall(this, Thunk::GetMemberFxnAddr(&FileDlg::BrowseProc));

	LPCITEMIDLIST lpcitemidlist = SHBrowseForFolder(&m_BIFBrowse);

	if(!lpcitemidlist)
		goto LABEL_RETURN;

	if(!SHGetPathFromIDList(lpcitemidlist, m_BIFBrowse.pszDisplayName))
		goto LABEL_RETURN;

	m_InitDir = m_BIFBrowse.pszDisplayName;

	m_bBrowseInit = TRUE;

	return m_InitDir;

LABEL_RETURN:

	delete[] m_NameBuf;
	m_NameBuf = NULL;
	return _T("");
}

void FileDlg::SetBufferSize(DWORD dwBufferSize)
{
	if (0 >= dwBufferSize)
		return;

	m_dwBufferSize = dwBufferSize;
}

DWORD FileDlg::GetBufferSize()
{
	return m_dwBufferSize;
}

⌨️ 快捷键说明

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