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

📄 ext32dlg.cpp

📁 visual c++ 实例编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	int i;
	char *Tmp;
	_getdcwd(_getdrive(), cPath, _MAX_PATH);
	::SetWindowText(ghDispFold, cPath);
	if(!gbStopThread){
		for(i=0; i<NumFileSpec; i++){
			if((FFHan = FindFirstFile(FileSpec, &FindStruct)) != INVALID_HANDLE_VALUE){
				if((FindStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)==0){
					ProcessExt(&FindStruct);
					gdNumFiles++;
				}
			}
			if(FFHan != NULL){
				while(FindNextFile(FFHan, &FindStruct) && !gbStopThread){
					if((FindStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)==0){
						ProcessExt(&FindStruct);
						gdNumFiles++;
					}
				}
				FindClose(FFHan);
			}
		}
		if(!gbSubDir)
			return;
		if((FFHan = FindFirstFile("*.*", &FindStruct)) == INVALID_HANDLE_VALUE){
			_chdir("..");	//Now find the directories
			return;
		}
		do{
			Tmp = ((FindStruct.cAlternateFileName[0] == 0) ? \
				(char *)&(FindStruct.cFileName):(char *)&(FindStruct.cAlternateFileName));
			if(((FindStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) && (Tmp[0] != '.')){
				//If the path could be found then enter it!
				if(!_chdir(FindStruct.cFileName))  
					OurFindFile(FileSpec, NumFileSpec);
			}
		}while(FindNextFile(FFHan, &FindStruct) && !gbStopThread);
		FindClose(FFHan);
	}
	_chdir("..");
	return;
}

void ProcessExt(WIN32_FIND_DATA *ff)
{
	char	Ext[4]={"   "};
	char *Tmp;
	int i;
	Tmp = ((ff->cAlternateFileName[0] == 0) ? (char *)&(ff->cFileName):(char *)&(ff->cAlternateFileName));
	for(i=0;i<13;i++){
		if (Tmp[i]=='.' || Tmp[i]==0)
			break;
	}
	if(Tmp[i]=='.'){
		strcpy(Ext, &Tmp[i+1]);
	}
	UpdateExt(Ext, ff);
}

void UpdateExt(char *Exten, WIN32_FIND_DATA *ff)
{
	EXTINFO *pTempExt = gpExtMem;
	int i;
	unsigned long TmpVal;
//	HICON hIcon;
	SHFILEINFO psfi;
	for(i=0; i<gdNumExt; i++)
	{
		if (!strcmp(pTempExt->Extens, Exten))
		{
			//Now the string comparison succeeds
			pTempExt->ExtSize += ff->nFileSizeLow;
			pTempExt->ExtClust += ff->nFileSizeLow%gdBytesPerClust ? (ff->nFileSizeLow/gdBytesPerClust+1)*gdBytesPerClust:ff->nFileSizeLow;
			pTempExt->ExtCount++;
			return;
		}
		pTempExt++;
	}
	unsigned short j=0;
//	hIcon = ExtractAssociatedIcon(ghInstance, ff->cFileName, &j);
	SHGetFileInfo(ff->cFileName, 0, &psfi, sizeof(SHFILEINFO), SHGFI_TYPENAME|SHGFI_ICON|SHGFI_SYSICONINDEX|SHGFI_LARGEICON);
	if(!psfi.hIcon)
		ghImageList.Add(hIconMain);
	else
		ghImageList.Add(psfi.hIcon);
	strcpy(pTempExt->cType, psfi.szTypeName);
	strcpy(pTempExt->Extens, Exten);
	pTempExt->ExtSize += ff->nFileSizeLow;
	pTempExt->ExtClust += ff->nFileSizeLow%gdBytesPerClust ? (ff->nFileSizeLow/gdBytesPerClust+1)*gdBytesPerClust:ff->nFileSizeLow;
	pTempExt->ExtCount++;
	gdNumExt++;
	char TmpStr[10];
	wsprintf(TmpStr, "%u", gdNumExt);
	::SetWindowText(ghNumExt, TmpStr);
}

void PrintExtInfo(void)
{
	EXTINFO *pTempExt = gpExtMem;
	int Ext=0;
	DWORD ldBytes=0, ldBytesDisk=0;
	LV_ITEM lvI;        		// list view item structure
	for(int i=0; i<gdNumExt; i++){
		lvI.mask = LVIF_TEXT | LVIF_IMAGE |LVIF_STATE |LVIF_PARAM;
		lvI.iItem = i;
		lvI.iSubItem = EXTNAME;
		lvI.pszText = LPSTR_TEXTCALLBACK; //pTempExt->Extens;
		lvI.cchTextMax = MAX_PATH; //4;
		lvI.iImage = i;
		lvI.state = 0;
		lvI.stateMask = 0;
		lvI.lParam = (LPARAM) &(pTempExt[i]);
		gdTotClust += ((EXTINFO *)lvI.lParam)->ExtClust;
		m_ListCtrl.InsertItem(&lvI);
		lvI.iSubItem = EXTSIZE;
		m_ListCtrl.SetItemText(i, EXTSIZE, LPSTR_TEXTCALLBACK);
		lvI.iSubItem = EXTCOUNT;
		m_ListCtrl.SetItemText(i, EXTCOUNT, LPSTR_TEXTCALLBACK);
		lvI.iSubItem = EXTCLUST;
		m_ListCtrl.SetItemText(i, EXTCLUST, LPSTR_TEXTCALLBACK);
		lvI.iSubItem = EXTTYPE;
		m_ListCtrl.SetItemText(i, EXTTYPE, LPSTR_TEXTCALLBACK);
	}
}

/****************************************************************************
* 
*    FUNCTION: NotifyHandler(HWND, UINT, UINT, LONG)
*
*    PURPOSE: This function is the handler for the WM_NOTIFY that is 
*    sent to the parent of the list view window.
*
****************************************************************************/
LRESULT CExt32Dlg::NotifyHandler(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	LV_DISPINFO *pLvdi = (LV_DISPINFO *)lParam;
	NM_LISTVIEW *pNm = (NM_LISTVIEW *)lParam;
	EXTINFO *pExt = (EXTINFO *)(pLvdi->item.lParam);
	static char szText[10];

	switch(pLvdi->hdr.code)
	{
		case LVN_GETDISPINFO:

			switch (pLvdi->item.iSubItem)
			{
				case EXTNAME:     
					pLvdi->item.pszText = pExt->Extens;
					break;

				case EXTSIZE:     
					wsprintf(szText, "%lu", pExt->ExtSize);
					pLvdi->item.pszText = szText;
					break;

				case EXTCOUNT:     
					wsprintf(szText, "%lu", pExt->ExtCount);
					pLvdi->item.pszText = szText;
					break;
				case EXTCLUST:
					wsprintf(szText, "%lu", pExt->ExtClust);
					pLvdi->item.pszText = szText;
					break;
				case EXTTYPE:
					pLvdi->item.pszText = pExt->cType;
					break;
				default:
					break;
			}
			break;

/*        case LVN_BEGINLABELEDIT:
            {
                HWND hWndEdit;

                // Get the handle to the edit box.
                hWndEdit = (HWND)SendMessage(hWnd, LVM_GETEDITCONTROL, 
                    0, 0);
                // Limit the amount of text that can be entered.
                SendMessage(hWndEdit, EM_SETLIMITTEXT, (WPARAM)20, 0);
            }
            break;

        case LVN_ENDLABELEDIT:
            // Save the new label information
            if ((pLvdi->item.iItem != -1) && 
                (pLvdi->item.pszText != NULL))
			    lstrcpy(pExt->szAddress, pLvdi->item.pszText);
            break;	*/

		case LVN_COLUMNCLICK:
			// The user clicked a column header - sort by this criterion.
			gbAscOrder = ~gbAscOrder;
			m_ListCtrl.SortItems(ListViewCompareProc, (LPARAM)(pNm->iSubItem));
			break;
//		case LVN_HOTTRACK:
//			return 1;
		case LVN_ITEMCHANGED:
			{
				LVITEM lv;
				char cExtSize[10];
				int i;
				char TmpStr[100];
				UINT uExtSize = 0;
/*				for(i=0;i<gdNumExt;i++){
					if(m_ListCtrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED){
						lv.iSubItem = EXTCLUST;
						lv.iItem = i;
						lv.mask = LVIF_TEXT;
						lv.pszText = cExtSize;
						::SendMessage(m_ListCtrl.m_hWnd, LVM_GETITEMTEXT, i, (LPARAM)&lv);
						uExtSize += atoi(lv.pszText);
					}
				}*/
				wsprintf(TmpStr, "%d Extensions found, %lu Kb Real Filesize, %lu Files", gdNumExt, 
					gdTotClust/1024, gdNumFiles);
				::SetWindowText(ghDispFold, TmpStr);
			}
			break;
//		case LVN_ITEMACTIVATE:{
//			char TmpStr[20];
//			m_ListCtrl.DeleteItem(0);
//			wsprintf(TmpStr, "lParam %d", lParam);
//			AfxMessageBox(TmpStr);
//			}
//			break;

		default:
			break;
	}
	return 0L;
}

LRESULT CExt32Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	if (message == WM_NOTIFY)
		NotifyHandler(message, wParam, lParam);
			
	return CDialog::WindowProc(message, wParam, lParam);
}

/****************************************************************************
* 
*    FUNCTION: ListViewCompareProc(LPARAM, LPARAM, LPARAM)
*
*    PURPOSE: Callback function that sorts depending on the column click 
*
****************************************************************************/
int CALLBACK CExt32Dlg::ListViewCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	EXTINFO *pExt1 = (EXTINFO *)lParam1;
	EXTINFO *pExt2 = (EXTINFO *)lParam2;
	LPSTR lpStr1, lpStr2;
	int iResult;

	if (pExt1 && pExt2)
	{
		switch( lParamSort)
		{
			case EXTNAME:
				lpStr1 = pExt1->Extens;
				lpStr2 = pExt2->Extens;
				if(gbAscOrder)
					iResult = strcmpi(lpStr1, lpStr2);
				else
					iResult = strcmpi(lpStr2, lpStr1);
				break;

			case EXTSIZE:
				if(gbAscOrder)
					iResult = pExt1->ExtSize - pExt2->ExtSize;
				else
					iResult = pExt2->ExtSize - pExt1->ExtSize;
				break;

			case EXTCOUNT:
				if(gbAscOrder)
					iResult = pExt1->ExtCount - pExt2->ExtCount;
				else
					iResult = pExt2->ExtCount - pExt1->ExtCount;
				break;

			case EXTCLUST:
				if(gbAscOrder)
					iResult = pExt1->ExtClust - pExt2->ExtClust;
				else
					iResult = pExt2->ExtClust - pExt1->ExtClust;
				break;

			case EXTTYPE:
				lpStr1 = pExt1->cType;
				lpStr2 = pExt2->cType;
				if(gbAscOrder)
					iResult = strcmpi(lpStr1, lpStr2);
				else
					iResult = strcmpi(lpStr2, lpStr1);
				break;

			default:
				iResult = 0;
				break;
		}

	}
	return(iResult);
}

void CALLBACK IconTimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
//	SetIcon(Icon[AnimNum], FALSE);
	::SendMessage(hWndMain, WM_SETICON, (WPARAM) ICON_SMALL, (LPARAM) Icon[AnimNum]);
//	SendMessage(hWndDlgIcon, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) Icon[AnimNum]);
	if(++AnimNum == 4)
		AnimNum = 0;
}

void InitTimerIcon(void)
{
	SetTimer(hWndMain, 0, 250, IconTimerProc);
}

void FinishTimerIcon(void)
{
	KillTimer(hWndMain, 0);
	AnimNum = 0;
//	SetIcon(m_hIcon, FALSE);		// Set small icon
	SendMessage(hWndMain, WM_SETICON, (WPARAM) ICON_SMALL, (LPARAM) hIconMain);
//	SendMessage(hWndDlgIcon, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) hIconMain);
}

/*id FileReport(void)
{
	char TmpStr[100];
	wsprintf(TmpStr, "%lu Extensions, %lu Files, %lu Kb Real Filesize", gdNumExt, gdNumFiles, TotClus/1024);
	SetWindowText(hWndDispFold, TmpStr);
}
*/

void CExt32Dlg::OnAbout() 
{
	// TODO: Add your control notification handler code here
	CAboutDlg dlgAbout;
	dlgAbout.DoModal();
}

⌨️ 快捷键说明

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