📄 useful.cpp
字号:
#include "..\stdafx.h"
#include "Useful.h"
typedef BOOL (WINAPI * GetDskFreeSpcEx)(LPCTSTR lpDirectoryName,
PULARGE_INTEGER lpFreeBytesAvailableToCaller,
PULARGE_INTEGER lpTotalNumberOfBytes,
PULARGE_INTEGER lpTotalNumberOfFreeBytes );
BOOL GetHDSpace(const CString& DriveLetter, DWORD& nFreeLow, DWORD& nFreeHigh,
DWORD& nTotalLow, DWORD& nTotalHigh)
{
//ASSERT ( pFreeLow != NULL );
BOOL bRet = FALSE;
//DWORD freeLow = 0L;
//TCHAR rootpath[10];
BOOL bOSR2 = FALSE;
OSVERSIONINFO VersionInfo;
VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&VersionInfo);
if( VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS &&
LOWORD(VersionInfo.dwBuildNumber) > 1000 )
{
bOSR2 = TRUE;
}
//_stprintf( rootpath, "%c:\\", DriveLetter );
//OSR2 detected or WINDOWS NT
if( bOSR2 || (VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) )
{
ULARGE_INTEGER bytesAvailToMe;
ULARGE_INTEGER TotalBytes;
ULARGE_INTEGER TotalFreeBytes;
HINSTANCE hLib = ::LoadLibrary( "KERNEL32.DLL" );
if( hLib )
{
GetDskFreeSpcEx pProc;
pProc = (GetDskFreeSpcEx)::GetProcAddress( hLib, (LPSTR)"GetDiskFreeSpaceExA");
if( pProc )
{
BOOL bRes = pProc( DriveLetter, &bytesAvailToMe, &TotalBytes, &TotalFreeBytes );
if( bRes )
{
//freeLow = bytesAvailToMe.LowPart;
nFreeLow = bytesAvailToMe.LowPart;
nFreeHigh = bytesAvailToMe.HighPart;
nTotalLow = TotalBytes.LowPart;
nTotalHigh = TotalBytes.HighPart;
bRet = TRUE; //success
}
else
{
DWORD err = GetLastError();
TRACE( "Error with GetDiskFreeSpaceEx (%ld)\n", err );
}
}
else
{
DWORD err = GetLastError();
TRACE( "Error with GetProcAddress (%ld)\n", err );
}
FreeLibrary(hLib);
}
}
else //Windows 95 NOT OSR2
{
DWORD sectorPerCluster;
DWORD bytesPerSector;
DWORD freeClusters;
DWORD totalClusters;
BOOL bRes = ::GetDiskFreeSpace( DriveLetter, §orPerCluster,
&bytesPerSector, &freeClusters, &totalClusters );
if( bRes )
{
nFreeLow = freeClusters * sectorPerCluster * bytesPerSector;
nTotalLow = totalClusters * sectorPerCluster * bytesPerSector;
//GetDiskFreeSpace caanot return more than 32 Bits
nFreeHigh = 0;
nTotalHigh = 0;
bRet = TRUE; //success
}
else
{
DWORD err = GetLastError();
TRACE( "Error with GetDiskFreeSpace (%ld)\n", err );
}
}
return( bRet );
}
void FormatByteSize(long double ldLength, CString& str)
{
if (ldLength >= 1024)
{
ldLength /= 1024;
if (ldLength >= 1000)
{
ldLength /= 1024;
if (ldLength >= 1000)
{
ldLength /=1024;
str.Format(_T("%.2f Gb"), ldLength);
}else
str.Format(_T("%.2f Mb"), ldLength);
}else
str.Format(_T("%.2f Kb"), ldLength);
}else
str.Format(_T("%.0f byte"), ldLength);
}
void PumpMessages()
{
MSG msg;
// Handle dialog messages
while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
CString GetHomeDirectory()
{
TCHAR sFilename[_MAX_PATH];
TCHAR sDrive[_MAX_DRIVE];
TCHAR sDir[_MAX_DIR];
TCHAR sFname[_MAX_FNAME];
TCHAR sExt[_MAX_EXT];
GetModuleFileName(AfxGetInstanceHandle(), sFilename, _MAX_PATH);
_tsplitpath(sFilename, sDrive, sDir, sFname, sExt);
CString rVal(CString(sDrive) + CString(sDir));
int nLen = rVal.GetLength();
if (rVal.GetAt(nLen-1) != _T('\\'))
rVal += _T("\\");
return rVal;
}
static COMCTL32VERSION c_nComCtl32Version = COMCTL32_UNKNOWN;
BOOL IfNewComCtrl32()
{
// if we don't already know which version, try to find out
if (c_nComCtl32Version == COMCTL32_UNKNOWN) {
// have we loaded COMCTL32 yet?
HMODULE theModule = ::GetModuleHandle("COMCTL32");
// if so, then we can check for the version
if (theModule) {
// InitCommonControlsEx is unique to 4.7 and later
FARPROC theProc = ::GetProcAddress(theModule, "InitCommonControlsEx");
if (! theProc) {
// not found, must be 4.00
c_nComCtl32Version = COMCTL32_400;
} else {
// The following symbol are unique to 4.71
//牋 DllInstall
//牋 FlatSB_EnableScrollBar FlatSB_GetScrollInfo FlatSB_GetScrollPos
//牋 FlatSB_GetScrollProp FlatSB_GetScrollRange FlatSB_SetScrollInfo
//牋 FlatSB_SetScrollPos FlatSB_SetScrollProp FlatSB_SetScrollRange
//牋 FlatSB_ShowScrollBar
//牋 _DrawIndirectImageList _DuplicateImageList
//牋 InitializeFlatSB
//牋 UninitializeFlatSB
// we could check for any of these - I chose DllInstallFARPROC theProc = ::GetProcAddress(theModule, "DllInstall");
if (! theProc) {
// not found, must be 4.70
c_nComCtl32Version = COMCTL32_470;
} else {
// found, must be 4.71
c_nComCtl32Version = COMCTL32_471;
}
}
}
}
return c_nComCtl32Version> COMCTL32_400;
}
BOOL IsFileExist(LPCTSTR strFile)
{
DWORD Code = GetFileAttributes(strFile);
return (Code != -1);
}
// To be optimized
void StringDeleteFromLeft(CString & string, int len)
{
int strLen = string.GetLength();
string = string.Right(strLen - len);
}
void StringDeleteFromRight(CString & string, int len)
{
int strLen = string.GetLength();
string = string.Left(strLen-len);
}
void FocusFirstChild(CWnd* pWnd)
{
CWnd* pwndChild = pWnd->GetWindow(GW_CHILD);
while (pwndChild)
{
if (pwndChild->IsWindowEnabled())
{
pwndChild->SetFocus();
return;
}
pwndChild = pwndChild->GetNextWindow();
}
}
LONG GetRegKey(HKEY key, LPCTSTR subkey, LPTSTR retdata)
{
HKEY hkey;
LONG retval = RegOpenKeyEx(key, subkey, 0, KEY_QUERY_VALUE, &hkey);
if (retval == ERROR_SUCCESS) {
long datasize = MAX_PATH;
TCHAR data[MAX_PATH];
RegQueryValue(hkey, NULL, data, &datasize);
lstrcpy(retdata,data);
RegCloseKey(hkey);
}
return retval;
}
void RunApp(LPCTSTR strApp, LPCTSTR strPar)
{
TCHAR sFilename[_MAX_PATH];
TCHAR sDrive[_MAX_DRIVE];
TCHAR sDir[_MAX_DIR];
TCHAR sFname[_MAX_FNAME];
TCHAR sExt[_MAX_EXT];
GetModuleFileName(AfxGetInstanceHandle(), sFilename, _MAX_PATH);
_tsplitpath(sFilename, sDrive, sDir, sFname, sExt);
CString rVal(CString(sDrive) + CString(sDir));
int nLen = rVal.GetLength();
if (rVal.GetAt(nLen-1) != _T('\\'))
rVal += _T("\\");
rVal += strApp;
HINSTANCE result = ShellExecute(NULL, _T("open"), rVal, strPar,NULL,
SW_SHOWNORMAL);
// If it failed, get the .htm regkey and lookup the program
if ((UINT)result <= HINSTANCE_ERROR)
{
//MessageBox("Error Opening the app...");
}
}
void GotoURL(LPCTSTR url)
{
TCHAR key[MAX_PATH + MAX_PATH];
// First try ShellExecute()
HINSTANCE result = ShellExecute(NULL, _T("open"), url, NULL,NULL, SW_SHOW);
// If it failed, get the .htm regkey and lookup the program
if ((UINT)result <= HINSTANCE_ERROR)
{
if (GetRegKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS) {
lstrcat(key, _T("\\shell\\open\\command"));
if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
TCHAR *pos;
pos = _tcsstr(key, _T("\"%1\""));
if (pos == NULL) { // No quotes found
pos = strstr(key, _T("%1")); // Check for %1, without quotes
if (pos == NULL) // No parameter at all...
pos = key+lstrlen(key)-1;
else
*pos = '\0'; // Remove the parameter
}
else
*pos = '\0'; // Remove the parameter
lstrcat(pos, _T(" "));
lstrcat(pos, url);
result = (HINSTANCE) WinExec(key,SW_SHOW);
}
}
}
if ((UINT)result <= HINSTANCE_ERROR)
{
}
}
void AdjustString(CString& str)
{
int nLength = str.GetLength();
for (int n=0; n<nLength; n++)
{
if (str[n]=='&' && n<nLength-1 && str[n+1]!='&')
{
// insert a new &
str.Insert(n, '&');
n++;
nLength++;
}
}
}
BOOL IsFolderEmpty(LPCTSTR str)
{
BOOL bRet = TRUE;
CString strPath(str);
if (strPath.Right(1)!=_T("\\"))
strPath += _T("\\");
CString strCmp(strPath);
strCmp += _T("*.*");
HANDLE hFind;
WIN32_FIND_DATA fd;
if ((hFind = ::FindFirstFile ((LPCTSTR) strCmp, &fd)) ==
INVALID_HANDLE_VALUE)
{
FindClose (hFind);
return TRUE;
}
do {
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
strCmp = (LPCTSTR) &fd.cFileName;
if ((strCmp != ".") && (strCmp != ".."))
{
strCmp = strPath + strCmp;
bRet = IsFolderEmpty(strCmp);
break;
}
}else
{
bRet = FALSE;
break;
}
} while (::FindNextFile (hFind, &fd));
FindClose (hFind);
return bRet;
}
// Check if directory exists
BOOL IsDirExist(const CString& Name)
{
DWORD Code = GetFileAttributes(Name);
return (Code != -1) && (Code & FILE_ATTRIBUTE_DIRECTORY );
}
//--------------------------------------------
// Extract file Path name - basically go up one level (search for the first '\' or ':')
// Helper only
CString ExtractFilePath(const CString& FileName)
{
CString Path;
int i=-1;
i = FileName.ReverseFind( '\\' );
if (i==-1)
i = FileName.ReverseFind( ':' );
if (i>=0)
Path = FileName.Left(i);
else
Path = FileName;
return Path;
}
//--------------------------------------------
// Create full path weather exists or not
BOOL CreateFullDir(const CString& Dir)
{
if (Dir.IsEmpty())
return TRUE;
CString Path = ExtractFilePath(Dir);
if (Dir.GetLength() < 3 || IsDirExist(Dir) || Path == Dir)
return TRUE; // avoid 'xyz:\' problem.
CreateFullDir(Path);
return CreateDirectory(Dir, NULL);
}
BOOL IsRunningNT()
{
OSVERSIONINFO VersionInfo;
VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&VersionInfo);
return (VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);
}
BOOL DeleteAllInDir(LPCTSTR str, LPCTSTR strExcept)
{
BOOL bError = FALSE;
CString strFolder(str);
if (strFolder.Right(1) != "\\")
strFolder += "\\";
CString strFile(strFolder);
strFile += "*.*";
HANDLE hFind;
WIN32_FIND_DATA fd;
if ((hFind = ::FindFirstFile ((LPCTSTR) strFile, &fd)) ==
INVALID_HANDLE_VALUE)
return 1;
do {
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
strFile = CString(fd.cFileName);
if ((strcmp(strFile, ".")!=0) && (strcmp(strFile, "..")!=0))
{
CString strSubFolder = strFolder + strFile;
if (!DeleteAllInDir(strSubFolder, strExcept))
bError = TRUE;
if (!RemoveDirectory(strSubFolder))
bError = TRUE;
}
}else
{
strFile = CString(fd.cFileName);
if (strFile.CompareNoCase(strExcept) != 0)
{
if (!DeleteFile(strFolder + strFile))
bError = TRUE;
}
}
} while (::FindNextFile (hFind, &fd));
::FindClose (hFind);
return !bError;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -