📄 selectfile.c
字号:
/******************************************************************************
CheckDir
僨傿儗僋僩儕偐偳偆偐僠僃僢僋
******************************************************************************/
static BOOL CheckDir(TCHAR *fname)
{
WIN32_FIND_DATA FindData;
HANDLE hFindFile;
TCHAR buf[BUF_SIZE];
wsprintf(buf, TEXT("%s\\%s"), path, fname);
if((hFindFile = FindFirstFile(buf, &FindData)) == INVALID_HANDLE_VALUE){
return FALSE;
}
FindClose(hFindFile);
if(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
return TRUE;
}
return FALSE;
}
/******************************************************************************
ChangeSelPath
僷僗偺曄峏
******************************************************************************/
static BOOL ChangeSelPath(TCHAR *fname)
{
TCHAR buf[BUF_SIZE];
if(CheckDir(fname) == TRUE){
wsprintf(buf, TEXT("%s\\%s"), path, fname);
lstrcpy(path, buf);
return TRUE;
}
return FALSE;
}
/******************************************************************************
CmboBox_AddPath
僐儞儃儃僢僋僗偵僷僗傪愝掕偡傞
******************************************************************************/
void CmboBox_AddPath(HWND hCombo, TCHAR *fpath)
{
TCHAR buf[BUF_SIZE];
TCHAR *p, *r;
int i;
SendMessage(hCombo, CB_RESETCONTENT, 0, 0);
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)TEXT("\\"));
if(*fpath == TEXT('\0')){
SendMessage(hCombo, CB_SETCURSEL, 0, 0);
return;
}
for(r = buf, p = fpath + 1; *p != TEXT('\0'); p++){
if(*p == TEXT('\\')){
*r = TEXT('\0');
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)buf);
r = buf;
}else{
*(r++) = *p;
}
}
*r = TEXT('\0');
i = SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)buf);
SendMessage(hCombo, CB_SETCURSEL, i, 0);
}
/******************************************************************************
CmboBox_GetPath
僐儞儃儃僢僋僗偺巜掕埵抲偺僷僗傪庢摼
******************************************************************************/
BOOL CmboBox_GetPath(HWND hCombo, int sel, TCHAR *fpath)
{
TCHAR buf[BUF_SIZE];
TCHAR *p;
int len, i;
p = buf;
for(i = 1; i <= sel; i++){
*(p++) = TEXT('\\');
len = SendMessage(hCombo, CB_GETLBTEXT, i, (LPARAM)p);
if(len == -1){
return FALSE;
}
p += len;
}
*p = TEXT('\0');
lstrcpy(fpath, buf);
return TRUE;
}
/******************************************************************************
SelectFileDlgProc
僼傽僀儖慖戰僾儘僔乕僕儍
******************************************************************************/
static BOOL CALLBACK SelectFileDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
SHINITDLGINFO shidi;
SHFILEINFO shfi;
LVCOLUMN lvc;
HIMAGELIST IconList;
TCHAR buf[BUF_SIZE];
TCHAR *p;
int i;
switch(uMsg)
{
case WM_INITDIALOG:
//PocketPC梡弶婜壔
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN;
shidi.hDlg = hDlg;
SHInitDialog(&shidi);
SetWindowText(hDlg, TEXT("Select file"));
if((TCHAR *)lParam != NULL){
SendDlgItemMessage(hDlg, IDC_EDIT_NAME, WM_SETTEXT, 0, lParam);
}
SendDlgItemMessage(hDlg, IDC_COMBO_PATH, CB_SETEXTENDEDUI, TRUE, 0);
lvc.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
lvc.cx = 150;
lvc.pszText = TEXT("Name");
lvc.cchTextMax = lstrlen(TEXT("Name"));
lvc.iSubItem = 0;
lvc.fmt = LVCFMT_LEFT;
ListView_InsertColumn(GetDlgItem(hDlg, IDC_LIST_FILE), 0, &lvc);
lvc.cx = 100;
lvc.pszText = TEXT("Type");
lvc.cchTextMax = lstrlen(TEXT("Type"));
lvc.iSubItem = 1;
lvc.fmt = LVCFMT_LEFT;
ListView_InsertColumn(GetDlgItem(hDlg, IDC_LIST_FILE), 1, &lvc);
lvc.cx = 70;
lvc.pszText = TEXT("Size");
lvc.cchTextMax = lstrlen(TEXT("Size"));
lvc.iSubItem = 2;
lvc.fmt = LVCFMT_RIGHT;
ListView_InsertColumn(GetDlgItem(hDlg, IDC_LIST_FILE), 2, &lvc);
lvc.cx = 150;
lvc.pszText = TEXT("Date");
lvc.cchTextMax = lstrlen(TEXT("Date"));
lvc.iSubItem = 3;
lvc.fmt = LVCFMT_LEFT;
ListView_InsertColumn(GetDlgItem(hDlg, IDC_LIST_FILE), 3, &lvc);
IconList = (HIMAGELIST)SHGetFileInfo(TEXT(""), 0,
&shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_SYSICONINDEX);
ListView_SetImageList(GetDlgItem(hDlg, IDC_LIST_FILE), IconList, LVSIL_SMALL);
ListView_SetExtendedListViewStyle(GetDlgItem(hDlg, IDC_LIST_FILE), LVS_EX_ONECLICKACTIVATE);
case WM_SHOWFILELIST:
SetCursor(LoadCursor(NULL, IDC_WAIT));
SendMessage(GetDlgItem(hDlg, IDC_LIST_FILE), WM_SETREDRAW, (WPARAM)FALSE, 0);
CretaeList(GetDlgItem(hDlg, IDC_LIST_FILE));
ListView_SortItems(GetDlgItem(hDlg, IDC_LIST_FILE), CompareFunc, 1);
CmboBox_AddPath(GetDlgItem(hDlg, IDC_COMBO_PATH), path);
SetCursor(NULL);
SendMessage(GetDlgItem(hDlg, IDC_LIST_FILE), WM_SETREDRAW, (WPARAM)TRUE, 0);
break;
case WM_NOTIFY:
return ListView_NotifyProc(hDlg, lParam);
case WM_LVCLICK:
if(ListView_GetNextItem(GetDlgItem(hDlg, IDC_LIST_FILE), -1, LVIS_SELECTED) != -1){
SendMessage(hDlg, WM_COMMAND, IDOK, 0);
}
break;
case WM_LVITEMCHANGED:
if((i = ListView_GetNextItem(GetDlgItem(hDlg, IDC_LIST_FILE), -1, LVIS_SELECTED)) == -1){
break;
}
*buf = TEXT('\0');
ListView_GetItemText(GetDlgItem(hDlg, IDC_LIST_FILE), i, 0, buf, BUF_SIZE - 1);
if(CheckDir(buf) == TRUE){
break;
}
SendDlgItemMessage(hDlg, IDC_EDIT_NAME, WM_SETTEXT, 0, (LPARAM)buf);
break;
case WM_LVKEYDOWN:
if(((LV_KEYDOWN *)lParam)->wVKey == VK_BACK){
SendMessage(hDlg, WM_COMMAND, IDC_BUTTON_UP, 0);
break;
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_EDIT_NAME:
switch(HIWORD(wParam)){
case EN_SETFOCUS:
SHSipPreference(hDlg, SIP_UP);
break;
case EN_KILLFOCUS:
SHSipPreference(hDlg, SIP_DOWN);
break;
}
break;
case IDC_COMBO_PATH:
if(HIWORD(wParam) == CBN_CLOSEUP){
i = SendDlgItemMessage(hDlg, IDC_COMBO_PATH, CB_GETCURSEL, 0, 0);
if(i < SendDlgItemMessage(hDlg, IDC_COMBO_PATH, CB_GETCOUNT, 0, 0) - 1){
CmboBox_GetPath(GetDlgItem(hDlg, IDC_COMBO_PATH),
SendDlgItemMessage(hDlg, IDC_COMBO_PATH, CB_GETCURSEL, 0, 0), path);
SendMessage(hDlg, WM_SHOWFILELIST, 0, 0);
}
}
break;
case IDC_BUTTON_UP:
for(p = path + lstrlen(path) - 1; p > path && *p != TEXT('\\'); p--);
if(p <= path){
*path = TEXT('\0');
}else{
*p = TEXT('\0');
}
SendMessage(hDlg, WM_SHOWFILELIST, 0, 0);
break;
case IDCANCEL:
ListView_DeleteAllItems(GetDlgItem(hDlg, IDC_LIST_FILE));
DestroyWindow(GetDlgItem(hDlg, IDC_LIST_FILE));
EndDialog(hDlg, FALSE);
break;
case IDOK:
if((i = ListView_GetNextItem(GetDlgItem(hDlg, IDC_LIST_FILE), -1, LVIS_SELECTED)) != -1){
*buf = TEXT('\0');
ListView_GetItemText(GetDlgItem(hDlg, IDC_LIST_FILE), i, 0, buf, BUF_SIZE - 1);
if(CheckDir(buf) == TRUE){
ChangeSelPath(buf);
SendMessage(hDlg, WM_SHOWFILELIST, 0, 0);
break;
}
}
*filename = TEXT('\0');
SendDlgItemMessage(hDlg, IDC_EDIT_NAME, WM_GETTEXT, BUF_SIZE - 1, (LPARAM)filename);
if(*filename == TEXT('\0')){
break;
}
if(ChangeSelPath(filename) == TRUE){
SendMessage(hDlg, WM_SHOWFILELIST, 0, 0);
break;
}
ListView_DeleteAllItems(GetDlgItem(hDlg, IDC_LIST_FILE));
EndDialog(hDlg, TRUE);
break;
}
break;
default:
return FALSE;
}
return TRUE;
}
/******************************************************************************
SelectFile
僼傽僀儖慖戰
******************************************************************************/
BOOL SelectFile(HWND hDlg, HINSTANCE hInst, TCHAR *fname, TCHAR *ret)
{
BOOL rc;
rc = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG_SELECTFILE), hDlg, SelectFileDlgProc, (LPARAM)fname);
if(rc == TRUE){
wsprintf(ret, TEXT("%s\\%s"), path, filename);
}
if(FileList != NULL){
LocalFree(FileList);
}
FileList = NULL;
FileListCnt = 0;
return rc;
}
/* End of source */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -