📄 selectfile.c
字号:
/**************************************************************************
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 + -