📄 filedlg.c
字号:
else if (strcmp(dir, "..") == 0) { GetParentDir (pWinFileData->filepath); myWinFileListDirWithFilter (hDlg, IDC_DIRCHOISE, IDC_FILECHOISE, pWinFileData->filepath, NULL); } else { if (pWinFileData->filepath [strlen (pWinFileData->filepath) - 1] != '/') strcat (pWinFileData->filepath, "/"); strcat (pWinFileData->filepath, dir); strcat (pWinFileData->filepath, "/"); if (access (pWinFileData->filepath, R_OK) == -1) { sprintf (msg, "No read permission to %s! \n", pWinFileData->filepath); MessageBox (hDlg, msg, "提示信息", MB_OK | MB_ICONSTOP| MB_BASEDONPARENT); GetParentDir (pWinFileData->filepath); } } GetWindowText (GetDlgItem (hDlg, IDC_FILENAME), dir, NAME_MAX); SetWindowText (GetDlgItem (hDlg, IDC_PATH), pWinFileData->filepath); if (dir[0] == '\0') myWinFileListDirWithFilter (hDlg, IDC_DIRCHOISE, IDC_FILECHOISE, pWinFileData->filepath, NULL); else myWinFileListDirWithFilter (hDlg, IDC_DIRCHOISE, IDC_FILECHOISE, pWinFileData->filepath, dir); } break; } case IDC_FILECHOISE: { if (code == LBN_SELCHANGE || code == LBN_DBLCLK || code == LBN_ENTER) { nSelect = SendDlgItemMessage (hDlg, IDC_FILECHOISE, LB_GETCURSEL, 0, 0); if (nSelect != -1) { SendDlgItemMessage(hDlg, IDC_FILECHOISE, LB_GETTEXT, nSelect, (LPARAM)pWinFileData->filename); SetWindowText (GetDlgItem(hDlg, IDC_FILENAME), pWinFileData->filename); } if (code == LBN_DBLCLK || code == LBN_ENTER) { SendNotifyMessage (hDlg, MSG_COMMAND, IDOK, 0); } } break; }#if 0 case IDC_HOME: { char a1 [PATH_MAX + 1]; char *filter = a1; strcpy (pWinFileData->filepath, getpwuid (getuid ())->pw_dir); SetWindowText (GetDlgItem (hDlg, IDC_PATH), pWinFileData->filepath); GetWindowText(GetDlgItem(hDlg, IDC_FILENAME), filter, NAME_MAX); if (filter[0] == '\0') myWinFileListDirWithFilter (hDlg, IDC_DIRCHOISE, IDC_FILECHOISE, pWinFileData->filepath, NULL); else myWinFileListDirWithFilter (hDlg, IDC_DIRCHOISE, IDC_FILECHOISE, pWinFileData->filepath, filter); break; }#endif case IDC_UP: { char a1[NAME_MAX + 1]; char *filter = a1; GetParentDir (pWinFileData->filepath); SetWindowText (GetDlgItem (hDlg, IDC_PATH), pWinFileData->filepath); GetWindowText(GetDlgItem(hDlg, IDC_FILENAME), filter, NAME_MAX); if (filter[0] == '\0') myWinFileListDirWithFilter (hDlg, IDC_DIRCHOISE, IDC_FILECHOISE, pWinFileData->filepath, NULL); else myWinFileListDirWithFilter (hDlg, IDC_DIRCHOISE, IDC_FILECHOISE, pWinFileData->filepath, filter); break; } case IDC_FILENAME: { char dir[PATH_MAX + 1]; char fn[NAME_MAX + 1]; char a[NAME_MAX + 1]; char *filter = a; char msg[50]; int i, nParent = 0; memset (dir, 0, PATH_MAX +1); if (code == EN_ENTER ) { // Add the response to EN_TAB later GetWindowText(GetDlgItem(hDlg, IDC_FILENAME), fn, NAME_MAX); for (i = strlen(fn)-1; i>=0; i--) { if (fn [i] == '/') { if (fn [1] != 0) nParent = i; else nParent = 1; strncpy (filter, fn+i+1 , NAME_MAX); //just path only, no filter if (i == strlen (fn)-1) { filter = NULL; SetWindowText (GetDlgItem (hDlg, IDC_FILENAME), ""); } else SetWindowText (GetDlgItem (hDlg, IDC_FILENAME), filter); fn[i+1] = 0; break; } } // filter in the current path if (nParent == 0) { //file change if (strlen(fn) == 0) filter = NULL; else strncpy (filter, fn , NAME_MAX); myWinFileListDirWithFilter (hDlg, IDC_DIRCHOISE, IDC_FILECHOISE, pWinFileData->filepath, filter); // have new path } else { if (fn[0] == '/') //absolute path strncpy (dir, fn, PATH_MAX); else { //relative path if (pWinFileData->filepath [strlen (pWinFileData->filepath)-1] != '/') strcat(pWinFileData->filepath,"/"); strncpy (dir, pWinFileData->filepath, PATH_MAX); strcat (dir, fn); } if (access (dir, F_OK) == -1){ sprintf (msg, "对不起,未找到指定的目录:\n\n %s \n", fn); MessageBox(hDlg , msg, "提示信息", MB_OK | MB_ICONSTOP| MB_BASEDONPARENT); } else { if (access (dir, R_OK) == -1) { sprintf (msg, "不能读取 %s !\n", fn); MessageBox(hDlg , msg, "提示信息", MB_OK | MB_ICONSTOP| MB_BASEDONPARENT); } else if ((pWinFileData->IsSave) && (access (dir, W_OK) == -1)) { sprintf (msg, "对 %s 没有写权限!\n", fn); MessageBox(hDlg , msg, "提示信息", MB_OK | MB_ICONSTOP| MB_BASEDONPARENT); } else { strncpy (pWinFileData->filepath, dir, PATH_MAX); myWinFileListDirWithFilter (hDlg, IDC_DIRCHOISE, IDC_FILECHOISE, pWinFileData->filepath, filter); } } } } break; } case IDOK: { char a1[NAME_MAX + 1]; char a2[NAME_MAX + PATH_MAX + 1]; char *filter = a1; char *fullname = a2; nSelect = SendDlgItemMessage(hDlg, IDC_FILECHOISE, LB_GETCURSEL, 0, 0); if (nSelect != -1) { SendDlgItemMessage (hDlg, IDC_FILECHOISE, LB_GETTEXT, nSelect, (LPARAM)pWinFileData->filename); GetWindowText(GetDlgItem(hDlg, IDC_FILENAME), filter, NAME_MAX); //make up full file name if (pWinFileData->filepath[strlen(pWinFileData->filepath)-1] != '/') strcat(pWinFileData->filepath,"/"); strncpy (pWinFileData->filefullname,pWinFileData->filepath, PATH_MAX); strncpy (fullname, pWinFileData->filefullname, PATH_MAX); if (pWinFileData->IsSave) { if ((strchr(filter, '*') == NULL) && (strchr (filter, '?') == NULL)) { strcat (fullname, pWinFileData->filename); if (access (fullname, F_OK) != -1) { sprintf (msg, "是否要覆盖文件 %s ?\n", fullname); if (MessageBox(hDlg, msg, "提示信息", MB_YESNO | MB_ICONQUESTION | MB_BASEDONPARENT) == IDNO) break; } if (strcmp (filter, pWinFileData->filename) == 0) { if (access (fullname, W_OK) == -1) { sprintf (msg, "对 %s 没有写权限!\n", fullname); MessageBox(hDlg , msg, "提示信息", MB_OK | MB_ICONSTOP| MB_BASEDONPARENT); } else if (access (fullname, R_OK) == -1) { sprintf (msg, "不能读取 %s !\n", fullname); MessageBox(hDlg , msg, "提示信息", MB_OK | MB_ICONSTOP| MB_BASEDONPARENT); } else { strncpy (pWinFileData->filename, filter, NAME_MAX); strncpy (pWinFileData->filefullname, fullname, NAME_MAX + PATH_MAX + 1); EndDialog(hDlg,IDOK); } } else { strncpy (pWinFileData->filefullname, fullname, NAME_MAX + PATH_MAX + 1); EndDialog(hDlg,IDOK); } } } else { strcat (pWinFileData->filefullname,pWinFileData->filename); if (strcmp (filter, pWinFileData->filename) == 0) EndDialog(hDlg,IDOK); } } else if (pWinFileData->IsSave) { // make up full file name if (pWinFileData->filepath[strlen(pWinFileData->filepath)-1] != '/') strcat(pWinFileData->filepath,"/"); strcpy (pWinFileData->filefullname,pWinFileData->filepath); GetWindowText(GetDlgItem(hDlg, IDC_FILENAME), filter, NAME_MAX); strcat (pWinFileData->filefullname, filter); EndDialog(hDlg,IDOK); } break; } default: break; } /* switch (id) */ break; } break; } /* switch (message) */ return DefaultDialogProc (hDlg, message, wParam, lParam);}#define SPACE_WIDTH 4#define SPACE_HEIGHT 4int OpenFileDialogEx (HWND hWnd, int lx, int ty, int w, int h, PFILEDLGDATA pfdi){ int totalW = w-3*SPACE_WIDTH; int LstH = h -20- 6*SPACE_HEIGHT - GetSysCharHeight() - 20 - 20 - 20; // 20: caption 20: edit 20:button 20:up button int LstTY = 2*SPACE_HEIGHT+20; CTRLDATA WinFileCtrl [] = { /* { "static", WS_VISIBLE | SS_LEFT, SPACE_WIDTH, SPACE_WIDTH, 80, GetSysCharHeight(), IDC_STATIC, "选择目录", 0 }, { "static", WS_VISIBLE | SS_LEFT, SPACE_WIDTH+totalW*2/5, SPACE_WIDTH, 80, GetSysCharHeight(), IDC_STATIC, "选择文件", 0 }, { "button", WS_VISIBLE | WS_TABSTOP , SPACE_WIDTH+totalW*2/5+ 60, SPACE_WIDTH, 22, GetSysCharHeight(), IDC_HOME, "Hm", 0 },*/ { "button", WS_VISIBLE | WS_TABSTOP , 2*SPACE_WIDTH+totalW*2/5 , SPACE_HEIGHT, 80, 20, IDC_UP, "上一级目录", 0 }, { "listbox", WS_VISIBLE | WS_TABSTOP | LBS_NOTIFY | WS_VSCROLL | WS_BORDER | LBS_SORT, SPACE_WIDTH, LstTY, totalW*2/5, LstH, IDC_DIRCHOISE, NULL, 0 }, { "listbox",WS_VISIBLE | WS_TABSTOP | LBS_NOTIFY | WS_VSCROLL | WS_BORDER | LBS_SORT, 2*SPACE_WIDTH+totalW*2/5, LstTY, totalW*3/5, LstH, IDC_FILECHOISE, NULL, 0 }, { "static", WS_VISIBLE | SS_LEFT, SPACE_WIDTH, LstH+LstTY+SPACE_HEIGHT, 4*GetSysCCharWidth(), GetSysCharHeight(), IDC_STATIC1, "当前路径", 0 }, { "static", WS_VISIBLE | SS_LEFT, 2*SPACE_WIDTH+4*GetSysCCharWidth(), LstH+LstTY+SPACE_HEIGHT, totalW-4*GetSysCCharWidth()-3*SPACE_WIDTH, GetSysCharHeight(), IDC_PATH, "", 0 }, { "static", WS_VISIBLE | SS_LEFT, SPACE_WIDTH, LstH+LstTY+2*SPACE_HEIGHT+GetSysCharHeight()+1, 2*GetSysCCharWidth(), GetSysCharHeight(), IDC_STATIC2, "文件", 0 }, { "sledit",WS_VISIBLE | WS_TABSTOP | WS_BORDER | LBS_NOTIFY, 2*SPACE_WIDTH+2*GetSysCCharWidth(), LstH+LstTY+2*SPACE_HEIGHT+GetSysCharHeight(), totalW-2*GetSysCCharWidth()-3*SPACE_WIDTH, 18, IDC_FILENAME, NULL, 0 }, { "button", WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON | WS_GROUP, (totalW-2*40)*2/5+SPACE_WIDTH, LstH+LstTY+3*SPACE_HEIGHT+GetSysCharHeight()+20,40 , 20, IDOK, "确认", 0 }, { "button", WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, (totalW-2*40)*3/5+2*SPACE_WIDTH+40, LstH+LstTY+3*SPACE_HEIGHT+GetSysCharHeight()+20, 40, 20, IDCANCEL, "取消", 0 } }; DLGTEMPLATE WinFileDlg = {#ifdef _FLAT_WINDOW_STYLE WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX, WS_EX_NONE,#else WS_BORDER | WS_CAPTION, WS_EX_NONE,#endif lx, ty, w, h, NULL, 0, 0, 9, NULL }; if (access (pfdi->filepath, F_OK) == -1) return FILE_ERROR_PATHNOTEXIST; WinFileDlg.caption = (pfdi->IsSave)?"保存文件":"打开文件"; WinFileDlg.controls = WinFileCtrl; return DialogBoxIndirectParam (&WinFileDlg, hWnd, WinFileProc, (LPARAM)(pfdi));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -