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

📄 selectfile.c

📁 Windows Mobile好用的今日桌面插件,在桌面插入一个Item项
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************

	tdLaunch

	SelectFile.c

	(C) Copyright 2001 By Tomoaki Nakashima. All right reserved.
		http://www.nakka.com/
		nakka@nakka.com

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

/**************************************************************************
	Include Files
**************************************************************************/

#include <windows.h>
#include <Commctrl.h>
#include <aygshell.h>

#include "resource.h"


/**************************************************************************
	Define
**************************************************************************/

#define WM_SHOWFILELIST			(WM_USER + 1)
#define WM_LVCLICK				(WM_USER + 2)
#define WM_LVITEMCHANGED		(WM_USER + 3)
#define WM_LVKEYDOWN			(WM_USER + 4)

#define BUF_SIZE				256


/**************************************************************************
	Global Variables
**************************************************************************/

static TCHAR path[BUF_SIZE];
static TCHAR filename[BUF_SIZE];

typedef struct _FILELIST {
	int att;
	int Icon;
	TCHAR Name[BUF_SIZE];
	TCHAR Type[BUF_SIZE];
	int Size;
	FILETIME ftLastWriteTime;
} FILELIST;

static FILELIST *FileList;
static int FileListCnt;


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

	CretaeList

	僼傽僀儖堦棗偺嶌惉

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

static BOOL CretaeList(HWND hListView)
{
	WIN32_FIND_DATA FindData;
	HANDLE hFindFile;
	LV_ITEM lvi;
	TCHAR sPath[BUF_SIZE];
	int cnt;
	int i;

	ListView_DeleteAllItems(hListView);
	if(FileList != NULL){
		LocalFree(FileList);
	}
	FileList = NULL;
	FileListCnt = 0;

	wsprintf(sPath, TEXT("%s\\*"), path);
	//僼傽僀儖悢傪庢摼
	if((hFindFile = FindFirstFile(sPath, &FindData)) == INVALID_HANDLE_VALUE){
		return FALSE;
	}
	cnt = 0;
	do{
		cnt++;
	} while(FindNextFile(hFindFile, &FindData) == TRUE);
	FindClose(hFindFile);

	//妋曐
	FileList = (FILELIST *)LocalAlloc(LPTR, sizeof(FILELIST) * cnt);
	if(FileList == NULL){
		return FALSE;
	}
	FileListCnt = cnt;

	//僼傽僀儖忣曬傪庢摼
	if((hFindFile = FindFirstFile(sPath, &FindData)) == INVALID_HANDLE_VALUE){
		return FALSE;
	}
	i = 0;
	do{
		if(!(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){
			(FileList + i)->att = 1;
		}
		(FileList + i)->Icon = -1;
		lstrcpy((FileList + i)->Name, FindData.cFileName);
		(FileList + i)->Size = FindData.nFileSizeLow;
		memcpy(&((FileList + i)->ftLastWriteTime), &FindData.ftLastWriteTime, sizeof(FILETIME));
		i++;
	} while(FindNextFile(hFindFile, &FindData) == TRUE);
	FindClose(hFindFile);

	ListView_SetItemCount(hListView, FileListCnt);

	//儕僗僩價儏乕偵傾僀僥儉傪捛壛
	for(i = 0; i < FileListCnt; i++){
		lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
		lvi.iItem = i;
		lvi.iSubItem = 0;
		lvi.pszText = LPSTR_TEXTCALLBACK;
		lvi.cchTextMax = 0;
		lvi.iImage = I_IMAGECALLBACK;
		lvi.lParam = (long)(FileList + i);
		ListView_InsertItem(hListView, &lvi);
	}
	return TRUE;
}


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

	ListView_GetDispItem

	儕僗僩價儏乕偵昞帵偡傞傾僀僥儉忣曬偺愝掕

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

static void ListView_GetDispItem(LV_ITEM *hLVItem)
{
	FILELIST *FileListItem = (FILELIST *)hLVItem->lParam;
	SHFILEINFO shfi;
	SYSTEMTIME st;
	TCHAR fdate[BUF_SIZE];
	TCHAR ftime[BUF_SIZE];
	TCHAR buf[BUF_SIZE];
	TCHAR *p;
	int f = 0;

	if(FileListItem == NULL){
		return;
	}

	if(hLVItem->mask & LVIF_IMAGE && FileListItem->Icon == -1){
		f |= SHGFI_SYSICONINDEX;
	}
	if(hLVItem->mask & LVIF_TEXT && hLVItem->iSubItem == 1 && *FileListItem->Type == TEXT('\0')){
		f |= SHGFI_TYPENAME;
	}
	if(f != 0){
		p = lstrcpy(buf, path) + lstrlen(path);
		*(p++) = TEXT('\\');
		lstrcpy(p, FileListItem->Name);
		SHGetFileInfo(buf, 0, &shfi, sizeof(SHFILEINFO), f);
	}

	//傾僀僐儞
	if(hLVItem->mask & LVIF_IMAGE){
		if(FileListItem->Icon == -1){
			FileListItem->Icon = shfi.iIcon;
		}
		hLVItem->iImage = FileListItem->Icon;
	}

	if(hLVItem->mask & LVIF_TEXT){
		switch(hLVItem->iSubItem)
		{
		case 0:
			lstrcpy(hLVItem->pszText, FileListItem->Name);
			break;

		case 1:
			if(*FileListItem->Type == TEXT('\0')){
				lstrcpy(FileListItem->Type, shfi.szTypeName);
			}
			lstrcpy(hLVItem->pszText, FileListItem->Type);
			break;

		case 2:
			if(FileListItem->att != 0){
				wsprintf(hLVItem->pszText, TEXT("%ld KB"),
					((FileListItem->Size > 1024) ? FileListItem->Size / 1024
					: (FileListItem->Size != 0) ? 1 : 0));
			}
			break;

		case 3:
			FileTimeToSystemTime(&FileListItem->ftLastWriteTime, &st);
			GetDateFormat(0, 0, &st, NULL, fdate, BUF_SIZE - 1);
			GetTimeFormat(0, 0, &st, NULL, ftime, BUF_SIZE - 1);
			wsprintf(hLVItem->pszText, TEXT("%s %s"), fdate, ftime);
			break;
		}
	}
}


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

	CompareFunc

	僜乕僩梡偺斾妑

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

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	FILELIST *FileList1 = (FILELIST *)lParam1;
	FILELIST *FileList2 = (FILELIST *)lParam2;
	int ret, sfg, ghed;

	sfg = (lParamSort < 0) ? 1 : 0;
	ghed = ((lParamSort < 0) ? lParamSort * -1 : lParamSort) - 1;

	if(FileList1->att != FileList2->att){
		ret = FileList1->att - FileList2->att;
		return (((ret < 0 && sfg == 1) || (ret > 0 && sfg == 0)) ? 1 : -1);
	}

	switch(ghed){
	case 0:
		ret = lstrcmpi(FileList1->Name, FileList2->Name);
		break;

	case 1:
		ret = lstrcmpi(FileList1->Type, FileList2->Type);
		break;

	case 2:
		ret = FileList1->Size - FileList2->Size;
		break;

	case 3:
		ret = CompareFileTime(&FileList1->ftLastWriteTime, &FileList2->ftLastWriteTime);
		break;
	}
	return (((ret < 0 && sfg == 1) || (ret > 0 && sfg == 0)) ? 1 : -1);
}


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

	ListView_NotifyProc

	儕僗僩價儏乕僀儀儞僩

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

static LRESULT ListView_NotifyProc(HWND hWnd, LPARAM lParam)
{
	NMHDR *CForm = (NMHDR *)lParam;
	LV_DISPINFO *plv = (LV_DISPINFO *)lParam;
	LV_KEYDOWN *LKey = (LV_KEYDOWN *)lParam;
	HD_NOTIFY *phd = (HD_NOTIFY *)lParam;
	TCHAR buf[BUF_SIZE];
	static int LvSortFlag;
	static int LvSortCol = -1;
	int cnt, i;

	switch(plv->hdr.code)
	{
	case LVN_GETDISPINFO:
		ListView_GetDispItem(&(plv->item));
		return TRUE;

	case LVN_ITEMCHANGED:
		SendMessage(hWnd, WM_LVITEMCHANGED, 0, 0);
		return FALSE;
	}

	switch(LKey->hdr.code)
	{
	case LVN_KEYDOWN:
		return SendMessage(hWnd, WM_LVKEYDOWN, 0, lParam);
	}

	if(GetParent(CForm->hwndFrom) == GetDlgItem(hWnd, IDC_LIST_FILE)){
		switch(phd->hdr.code)
		{
		case HDN_ITEMCLICK:
			SetCursor(LoadCursor(NULL, IDC_WAIT));
			if(phd->iItem == 1){
				cnt = ListView_GetItemCount(GetDlgItem(hWnd, IDC_LIST_FILE));
				for(i = 0; i < cnt; i++){
					ListView_GetItemText(GetDlgItem(hWnd, IDC_LIST_FILE), i, 1, buf, BUF_SIZE - 1);
				}
			}
			//僜乕僩偺愝掕
			if(LvSortCol != phd->iItem){
				LvSortCol = phd->iItem;
				LvSortFlag = 1;
			}else{
				LvSortFlag = (LvSortFlag < 0) ? 1 : -1;
			}
			//僜乕僩
			ListView_SortItems(GetDlgItem(hWnd, IDC_LIST_FILE), CompareFunc, (LvSortCol + 1) * LvSortFlag);
			SetCursor(NULL);
			break;
		}
		return FALSE;
	}

	if(CForm->hwndFrom == GetDlgItem(hWnd, IDC_LIST_FILE)){
		switch(CForm->code)
		{
		case NM_CLICK:
			//僋儕僢僋
			return SendMessage(hWnd, WM_LVCLICK, 0, 0);
		}
	}
	return FALSE;
}

⌨️ 快捷键说明

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