📄 openfile.cpp
字号:
#include <windows.h>#include <aygshell.h>#include <gpac/config.h>#include "resource.h"static HINSTANCE g_hInst = NULL;static HMENU g_hMenuView;static HWND g_hWndMenuBar;static HWND hDirTxt;static HWND the_wnd;static HWND hList;static TCHAR w_current_dir[GF_MAX_PATH] = _T("\\");static u8 current_dir[GF_MAX_PATH] = "\\";static const char *extension_list = NULL;static char *out_url = NULL;Bool bViewUnknownTypes = 0;Bool playlist_mode = 0;GF_Config *cfg;static void refresh_menu_states(){ if (playlist_mode) { EnableMenuItem(g_hMenuView, IDM_OF_PL_UP, MF_BYCOMMAND|MF_ENABLED); EnableMenuItem(g_hMenuView, IDM_OF_PL_DOWN, MF_BYCOMMAND|MF_ENABLED ); } else { EnableMenuItem(g_hMenuView, IDM_OF_VIEW_ALL, MF_BYCOMMAND| (extension_list ? MF_ENABLED : MF_GRAYED) ); CheckMenuItem(g_hMenuView, IDM_OF_VIEW_ALL, MF_BYCOMMAND| (bViewUnknownTypes ? MF_CHECKED : MF_UNCHECKED) ); } CheckMenuItem(g_hMenuView, IDM_OF_PLAYLIST, MF_BYCOMMAND| (playlist_mode ? MF_CHECKED : MF_UNCHECKED) );}static void switch_menu_pl(){ DeleteMenu(g_hMenuView, IDM_OF_VIEW_ALL, MF_BYCOMMAND); DeleteMenu(g_hMenuView, IDM_OF_PL_UP, MF_BYCOMMAND); DeleteMenu(g_hMenuView, IDM_OF_PL_DOWN, MF_BYCOMMAND); DeleteMenu(g_hMenuView, IDM_OF_PL_CLEAR, MF_BYCOMMAND); if (playlist_mode) { InsertMenu(g_hMenuView, 0, MF_BYPOSITION, IDM_OF_PL_CLEAR, _T("Clear")); InsertMenu(g_hMenuView, 0, MF_BYPOSITION, IDM_OF_PL_DOWN, _T("Move Down") ); InsertMenu(g_hMenuView, 0, MF_BYPOSITION, IDM_OF_PL_UP, _T("Move Up") ); } else { InsertMenu(g_hMenuView, 0, MF_BYPOSITION, IDM_OF_VIEW_ALL, _T("All Unknown Files") ); } TBBUTTONINFO tbbi; tbbi.cbSize = sizeof(tbbi); tbbi.dwMask = TBIF_TEXT; tbbi.pszText = playlist_mode ? _T("Remove") : _T("Add"); SendMessage(g_hWndMenuBar, TB_SETBUTTONINFO, IDM_OF_PL_ACT, (LPARAM)&tbbi); refresh_menu_states();}Bool enum_dirs(void *cbk, char *name, char *path){ TCHAR w_name[GF_MAX_PATH], w_str_name[GF_MAX_PATH]; CE_CharToWide(name, w_name); wcscpy(w_str_name, _T("+ ")); wcscat(w_str_name, w_name); int iRes = SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) w_str_name); SendMessage(hList, LB_SETITEMDATA, iRes, (LPARAM) 1); return 0;}Bool enum_files(void *cbk, char *name, char *path){ TCHAR w_name[GF_MAX_PATH]; if (!bViewUnknownTypes && extension_list) { char *ext = strrchr(name, '.'); if (!ext || !strstr(extension_list, ext+1)) return 0; } CE_CharToWide(name, w_name); SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) w_name); return 0;}void set_directory(TCHAR *dir){ SendMessage(hList, LB_RESETCONTENT, 0, 0); CE_WideToChar(dir, (char *) current_dir); wcscpy(w_current_dir, dir); SetWindowText(hDirTxt, w_current_dir); if (strcmp((const char *) current_dir, "\\")) { int iRes = SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) _T("+ ..") ); SendMessage(hList, LB_SETITEMDATA, iRes, (LPARAM) 1); } /*enum directories*/ gf_enum_directory((const char *) current_dir, 1, enum_dirs, NULL, NULL); /*enum files*/ gf_enum_directory((char *) current_dir, 0, enum_files, NULL, NULL); SendMessage(hList, LB_SETCURSEL, 0, 0); SetFocus(hList);}void refresh_playlist(){ TCHAR w_name[GF_MAX_PATH]; u32 count, i; SetWindowText(hDirTxt, _T("Playlist")); SendMessage(hList, LB_RESETCONTENT, 0, 0); count = gf_cfg_get_key_count(cfg, "Playlist"); for (i=0; i<count; i++) { const char *file = gf_cfg_get_key_name(cfg, "Playlist", i); char *name = strrchr(file, '\\'); if (!name) name = strrchr(file, '/'); CE_CharToWide(name ? name+1 : (char *) file, w_name); SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) w_name); } i = 0; const char *ple = gf_cfg_get_key(cfg, "General", "PLEntry"); i = ple ? atoi(ple) : 0; if (i>=count) i=0; SendMessage(hList, LB_SETCURSEL, i, 0); SetFocus(hList);}void playlist_act(u32 act_type){ u32 idx, count; char entry[MAX_PATH]; const char *url; /*reset all*/ if (act_type == 3) { count = gf_cfg_get_key_count(cfg, "Playlist"); while (count) { url = gf_cfg_get_key_name(cfg, "Playlist", 0); gf_cfg_set_key(cfg, "Playlist", url, NULL); count--; } refresh_playlist(); return; } count = SendMessage(hList, LB_GETSELCOUNT, 0, 0); if (!count) return; idx = SendMessage(hList, LB_GETCURSEL, 0, 0); if ((act_type==1) && !idx) return; else if ((act_type==2) && (idx+1==count)) return; url = gf_cfg_get_key_name(cfg, "Playlist", idx); if (!url) return; strcpy(entry, url); /*remove from playlist*/ gf_cfg_set_key(cfg, "Playlist", url, NULL); switch (act_type) { /*remove*/ case 0: if (idx+1==count) idx--; break; /*up*/ case 1: gf_cfg_insert_key(cfg, "Playlist", entry, "", idx-1); idx--; break; /*down*/ case 2: gf_cfg_insert_key(cfg, "Playlist", entry, "", idx+1); idx++; break; } refresh_playlist(); SendMessage(hList, LB_SETCURSEL, idx, 0); SetFocus(hList);}Bool add_files(void *cbk, char *name, char *path){ if (!bViewUnknownTypes && extension_list) { char *ext = strrchr(name, '.'); if (!ext || !strstr(extension_list, ext+1)) return 0; } gf_cfg_set_key(cfg, "Playlist", path, ""); return 0;}void process_list_change(HWND hWnd, Bool add_to_pl){ TCHAR sTxt[GF_MAX_PATH]; if (!SendMessage(hList, LB_GETSELCOUNT, 0, 0)) return; u32 idx = SendMessage(hList, LB_GETCURSEL, 0, 0); SendMessage(hList, LB_GETTEXT, idx, (LPARAM)(LPCTSTR) sTxt); DWORD param = SendMessage(hList, LB_GETITEMDATA, idx, 0); if (param==1) { if (!wcscmp(sTxt, _T("+ ..") ) ) { if (add_to_pl) return; current_dir[strlen((const char *) current_dir)-1] = 0; char *b = strrchr((const char *) current_dir, '\\'); if (b) b[1] = 0; else b[0] = '\\'; CE_CharToWide((char *) current_dir, w_current_dir); set_directory(w_current_dir); } else { if (add_to_pl) { char dir[MAX_PATH]; TCHAR wdir[MAX_PATH]; wcscpy(wdir, w_current_dir); wcscat(wdir, sTxt+2); wcscat(wdir, _T("\\")); CE_WideToChar(wdir, (char *) dir); gf_enum_directory(dir, 0, add_files, NULL, NULL); } else { wcscat(w_current_dir, sTxt+2); wcscat(w_current_dir, _T("\\")); CE_WideToChar(w_current_dir, (char *) current_dir); set_directory(w_current_dir); } } } else { char szTxt[1024]; CE_WideToChar(sTxt, (char *) szTxt); strcpy((char *) out_url, (const char *) current_dir); strcat(out_url, szTxt); if (add_to_pl) { gf_cfg_set_key(cfg, "Playlist", out_url, ""); strcpy(out_url, ""); } else { if (playlist_mode) { const char *file; char szPLE[20]; sprintf(szPLE, "%d", idx); gf_cfg_set_key(cfg, "General", "PLEntry", szPLE); file = gf_cfg_get_key_name(cfg, "Playlist", idx); strcpy(out_url, file); } gf_cfg_set_key(cfg, "General", "LastWorkingDir", (const char *) current_dir); EndDialog(hWnd, 1); } }}BOOL InitFileDialog(const HWND hWnd){ TCHAR psz[80]; ZeroMemory(psz, sizeof(psz)); SHINITDLGINFO sid; ZeroMemory(&sid, sizeof(sid)); sid.dwMask = SHIDIM_FLAGS; sid.dwFlags = SHIDIF_SIZEDLGFULLSCREEN; sid.hDlg = hWnd; if (FALSE == SHInitDialog(&sid)) return FALSE; SHMENUBARINFO mbi; ZeroMemory(&mbi, sizeof(SHMENUBARINFO)); mbi.cbSize = sizeof(SHMENUBARINFO); mbi.hwndParent = hWnd; mbi.nToolBarId = IDR_MENU_OPEN; mbi.hInstRes = g_hInst; if (FALSE == SHCreateMenuBar(&mbi)) { return FALSE; } g_hWndMenuBar = mbi.hwndMB; ShowWindow(g_hWndMenuBar, SW_SHOW); the_wnd = hWnd; hDirTxt = GetDlgItem(hWnd, IDC_DIRNAME); hList = GetDlgItem(hWnd, IDC_FILELIST); g_hMenuView = (HMENU)SendMessage(g_hWndMenuBar, SHCMBM_GETSUBMENU, 0, ID_OF_VIEW); RECT rc; GetClientRect(hWnd, &rc); u32 caption_h = GetSystemMetrics(SM_CYCAPTION) - 3; MoveWindow(hDirTxt, 0, 0, rc.right - rc.left, caption_h, 1); MoveWindow(hList, 0, caption_h, rc.right - rc.left, rc.bottom - rc.top - caption_h, 1); if (playlist_mode) { refresh_playlist(); } else { if (!strcmp((const char *) current_dir, "\\")) { char *opt = (char *) gf_cfg_get_key(cfg, "General", "LastWorkingDir"); if (opt) CE_CharToWide(opt, w_current_dir); } set_directory(w_current_dir); } switch_menu_pl(); return TRUE;}BOOL CALLBACK FileDialogProc(const HWND hWnd, const UINT Msg, const WPARAM wParam, const LPARAM lParam) { BOOL bProcessedMsg = TRUE; switch (Msg) { case WM_INITDIALOG: if (FALSE == InitFileDialog(hWnd)) EndDialog(hWnd, -1); break; case WM_ACTIVATE: if (WA_INACTIVE != LOWORD(wParam)) SetFocus(hWnd); break; case WM_CLOSE: EndDialog(hWnd, 0); break; case WM_COMMAND: if (LOWORD(wParam) == IDC_FILELIST) { if (HIWORD(wParam) == LBN_DBLCLK) { process_list_change(hWnd, 0); } else { bProcessedMsg = FALSE; } } else { switch (LOWORD(wParam)) { case IDOK: process_list_change(hWnd, 0); break; case IDCANCEL: EndDialog(hWnd, 0); break; case IDM_OF_VIEW_ALL: bViewUnknownTypes = !bViewUnknownTypes; refresh_menu_states(); set_directory(w_current_dir); break; case IDM_OF_PLAYLIST: playlist_mode = !playlist_mode; if (playlist_mode) refresh_playlist(); else set_directory(w_current_dir); switch_menu_pl(); break; case IDM_OF_PL_ACT: if (playlist_mode) { playlist_act(0); } else { process_list_change(hWnd, 1); } break; case IDM_OF_PL_UP: playlist_act(1); break; case IDM_OF_PL_DOWN: playlist_act(2); break; case IDM_OF_PL_CLEAR: playlist_act(3); break; default: bProcessedMsg = FALSE; break; } } break; case WM_KEYDOWN: switch (wParam) { case VK_LEFT: case '1': playlist_act(1); break; case VK_RIGHT: case '2': playlist_act(2); break; default: bProcessedMsg = FALSE; break; } break; default: bProcessedMsg = FALSE; } return bProcessedMsg;}Bool gf_file_dialog(HINSTANCE inst, HWND parent, char *url, const char *ext_list, GF_Config *gpac_cfg){ extension_list = ext_list; out_url = url; g_hInst = inst; cfg = gpac_cfg; int iResult = DialogBox(inst, MAKEINTRESOURCE(IDD_FILEDIALOG), parent,(DLGPROC)FileDialogProc); if (iResult>0) return 1; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -