fileopen.c
资源名称:shell.rar [点击查看]
上传用户:xhy777
上传日期:2007-02-14
资源大小:24088k
文件大小:300k
源码类别:
系统编程
开发平台:
Visual C++
- cb += (int) SendDlgItemMessage(
- hDlg,
- lst2,
- LB_GETTEXT,
- (WPARAM)idir,
- (LPARAM)&pOFI->szPath[cb] );
- pOFI->szPath[cb++] = CHAR_BSLASH;
- }
- //
- // The root is a special case.
- //
- if (idirNew)
- {
- pOFI->szPath[cb - 1] = CHAR_NULL;
- }
- pstrPath = pOFI->szPath;
- }
- if (!*pstrPath ||
- (ChangeDir(hDlg, pstrPath, FALSE, TRUE) == CHANGEDIR_FAILED))
- {
- break;
- }
- //
- // List all directories under this one.
- //
- UpdateListBoxes(hDlg, pOFI, NULL, mskDirectory);
- if (pOFN->lpfnHook)
- {
- LPOFNHOOKPROC lpfnHook = GETHOOKFN(pOFN);
- #ifdef UNICODE
- if (pOFI->ApiType == COMDLG_ANSI)
- {
- (*lpfnHook)( hDlg,
- msgLBCHANGEA,
- lst2,
- MAKELONG(LOWORD(idirNew), CD_LBSELCHANGE) );
- }
- else
- #endif
- {
- (*lpfnHook)( hDlg,
- msgLBCHANGEW,
- lst2,
- MAKELONG(LOWORD(idirNew), CD_LBSELCHANGE) );
- }
- }
- return (TRUE);
- }
- break;
- }
- case ( cmb2 ) :
- {
- switch (GET_WM_COMMAND_CMD(wParam, lParam))
- {
- case ( CBN_DROPDOWN ) :
- {
- pOFN->Flags |= OFN_DRIVEDOWN;
- return (TRUE);
- break;
- }
- case ( CBN_CLOSEUP ) :
- {
- //
- // It would seem reasonable to merely do the update
- // at this point, but that would rely on message
- // ordering, which isnt a smart move. In fact, if
- // you hit ALT-DOWNARROW, DOWNARROW, ALT-DOWNARROW,
- // you receive CBN_DROPDOWN, CBN_SELCHANGE, and then
- // CBN_CLOSEUP. But if you use the mouse to choose
- // the same element, the last two messages trade
- // places. PostMessage allows all messages in the
- // sequence to be processed, and then updates are
- // done as needed.
- //
- PostMessage( hDlg,
- WM_COMMAND,
- GET_WM_COMMAND_MPS(
- cmb2,
- GET_WM_COMMAND_HWND(wParam, lParam),
- MYCBN_DRAW ) );
- return (TRUE);
- break;
- }
- case ( MYCBN_LIST ) :
- {
- LoadDrives(hDlg);
- break;
- }
- case ( MYCBN_REPAINT ) :
- {
- int cchCurDir;
- LPTSTR lpCurDir;
- // sanity
- if (!(lpCurDlg = (LPCURDLG)TlsGetValue(g_tlsiCurDlg)) ||
- !(lpCurDir = lpCurDlg->lpstrCurDir))
- {
- break;
- }
- cchCurDir = GetPathOffset(lpCurDir);
- if (cchCurDir != -1)
- {
- TCHAR szRepaintDir[CCHNETPATH];
- HWND hCmb2 = (HWND)lParam;
- lstrcpy(szRepaintDir, lpCurDir);
- szRepaintDir[cchCurDir] = CHAR_NULL;
- SendMessage( hCmb2,
- CB_SELECTSTRING,
- (WPARAM)-1,
- (LPARAM)szRepaintDir );
- }
- break;
- }
- case ( CBN_SELCHANGE ) :
- {
- StripFileName(hDlg, IS16BITWOWAPP(pOFN));
- //
- // Version check not needed, since flag never set
- // for versions not supporting CBN_CLOSEUP. Putting
- // check at CBN_DROPDOWN is more efficient since it
- // is less frequent than CBN_SELCHANGE.
- if (pOFN->Flags & OFN_DRIVEDOWN)
- {
- //
- // Don't fill lst2 while the combobox is down.
- //
- return (TRUE);
- break;
- }
- }
- case ( MYCBN_CHANGEDIR ) :
- case ( MYCBN_DRAW ) :
- {
- TCHAR szTitle[WARNINGMSGLENGTH];
- LPTSTR lpFilter;
- int nDiskInd, nInd;
- DWORD dwType;
- LPTSTR lpszPath = NULL;
- LPTSTR lpszDisk = NULL;
- HWND hCmb2;
- OFN_DISKINFO *pofndiDisk = NULL;
- static szDrawDir[CCHNETPATH];
- int nRet;
- HourGlass(TRUE);
- //
- // Clear Flag for future CBN_SELCHANGE messeges.
- //
- pOFN->Flags &= ~OFN_DRIVEDOWN;
- //
- // Change the drive.
- //
- szText[0] = CHAR_NULL;
- hCmb2 = (HWND)lParam;
- if (hCmb2 != NULL)
- {
- nInd = (int) SendMessage(hCmb2, CB_GETCURSEL, 0, 0L);
- if (nInd != CB_ERR)
- {
- SendMessage( hCmb2,
- CB_GETLBTEXT,
- nInd,
- (LPARAM)(LPTSTR)szDrawDir );
- }
- if ((nInd == CB_ERR) || ((INT_PTR)pofndiDisk == CB_ERR))
- {
- if (lpCurDlg = (LPCURDLG)TlsGetValue(g_tlsiCurDlg))
- {
- if (lpCurDlg->lpstrCurDir)
- {
- lstrcpy((LPTSTR)szDrawDir,
- lpCurDlg->lpstrCurDir);
- }
- }
- }
- CharLower((LPTSTR)szDrawDir);
- //
- // Should always succeed.
- //
- nDiskInd = DiskAddedPreviously(0, (LPTSTR)szDrawDir);
- if (nDiskInd != 0xFFFFFFFF)
- {
- pofndiDisk = &gaDiskInfo[nDiskInd];
- }
- else
- {
- //
- // Skip update in the case where it fails.
- //
- return (TRUE);
- }
- dwType = pofndiDisk->dwType;
- lpszDisk = pofndiDisk->lpPath;
- }
- if ((GET_WM_COMMAND_CMD(wParam, lParam)) == MYCBN_CHANGEDIR)
- {
- if (lpNetDriveSync)
- {
- lpszPath = lpNetDriveSync;
- lpNetDriveSync = NULL;
- }
- else
- {
- if (lpCurDlg = (LPCURDLG)TlsGetValue(g_tlsiCurDlg))
- {
- if (lpCurDlg->lpstrCurDir)
- {
- lstrcpy((LPTSTR)szDrawDir,
- lpCurDlg->lpstrCurDir);
- lpszPath = (LPTSTR)szDrawDir;
- }
- }
- }
- }
- else
- {
- lpszPath = lpszDisk;
- }
- if (bInitializing)
- {
- lpFilter = szTitle;
- if (pOFN->lpstrFile &&
- (StrChr(pOFN->lpstrFile, CHAR_STAR) ||
- StrChr(pOFN->lpstrFile, CHAR_QMARK)))
- {
- lstrcpy(lpFilter, pOFN->lpstrFile);
- }
- else
- {
- HWND hcmb1 = GetDlgItem(hDlg, cmb1);
- nInd = (int) SendMessage(hcmb1, CB_GETCURSEL, 0, 0L);
- if (nInd == CB_ERR)
- {
- //
- // No current selection.
- //
- goto NullSearch;
- }
- //
- // Must also check if filter contains anything.
- //
- if (nInd ||
- !(pOFN->lpstrCustomFilter &&
- *pOFN->lpstrCustomFilter))
- {
- lpFilter = (LPTSTR)(pOFN->lpstrFilter);
- lpFilter += SendMessage( hcmb1,
- CB_GETITEMDATA,
- (WPARAM)nInd,
- 0 );
- }
- else
- {
- lpFilter = pOFN->lpstrCustomFilter;
- lpFilter += lstrlen(pOFN->lpstrCustomFilter) + 1;
- }
- }
- }
- else
- {
- NullSearch:
- lpFilter = NULL;
- }
- //
- // UpdateListBoxes cuts up filter string in place.
- //
- if (lpFilter)
- {
- lstrcpy(szTitle, lpFilter);
- CharLower(szTitle);
- }
- if (dwType == REMDRVBMP)
- {
- DWORD err = WNetRestoreConnection(hDlg, lpszDisk);
- if (err != WN_SUCCESS)
- {
- HourGlass(FALSE);
- return (TRUE);
- }
- pofndiDisk->dwType = NETDRVBMP;
- SendMessage(
- hCmb2,
- CB_SETITEMDATA,
- (WPARAM)SendMessage(
- hCmb2,
- CB_SELECTSTRING,
- (WPARAM)-1,
- (LPARAM)(LPTSTR)pofndiDisk->lpAbbrName ),
- (LPARAM)NETDRVBMP );
- }
- //
- // Calls to ChangeDir will call SelDisk, so no need
- // to update cmb2 on our own here (used to be after
- // updatelistboxes).
- //
- if ((nRet = ChangeDir( hDlg,
- lpszPath,
- FALSE,
- FALSE )) == CHANGEDIR_FAILED)
- {
- int mbRet;
- while (nRet == CHANGEDIR_FAILED)
- {
- if (dwType == FLOPPYBMP)
- {
- mbRet = InvalidFileWarning(
- hDlg,
- lpszPath,
- ERROR_NO_DISK_IN_DRIVE,
- (UINT)(MB_RETRYCANCEL |
- MB_ICONEXCLAMATION));
- }
- else if (dwType == CDDRVBMP)
- {
- mbRet = InvalidFileWarning(
- hDlg,
- lpszPath,
- ERROR_NO_DISK_IN_CDROM,
- (UINT)(MB_RETRYCANCEL |
- MB_ICONEXCLAMATION) );
- }
- else
- {
- //
- // See if it's a RAW volume.
- //
- if (dwType == HARDDRVBMP &&
- GetLastError() == ERROR_UNRECOGNIZED_VOLUME)
- {
- mbRet = InvalidFileWarning(
- hDlg,
- lpszPath,
- ERROR_UNRECOGNIZED_VOLUME,
- (UINT)(MB_OK |
- MB_ICONEXCLAMATION) );
- }
- else
- {
- mbRet = InvalidFileWarning(
- hDlg,
- lpszPath,
- ERROR_DIR_ACCESS_DENIED,
- (UINT)(MB_RETRYCANCEL |
- MB_ICONEXCLAMATION) );
- }
- }
- if (bFirstTime || (mbRet != IDRETRY))
- {
- lpszPath = NULL;
- nRet = ChangeDir(hDlg, lpszPath, TRUE, FALSE);
- }
- else
- {
- nRet = ChangeDir(hDlg, lpszPath, FALSE, FALSE);
- }
- }
- }
- UpdateListBoxes( hDlg,
- pOFI,
- lpFilter ? szTitle : lpFilter,
- (WORD)(mskDrives | mskDirectory) );
- if (pOFN->lpfnHook)
- {
- LPOFNHOOKPROC lpfnHook = GETHOOKFN(pOFN);
- nInd = (int) SendDlgItemMessage( hDlg,
- cmb2,
- CB_GETCURSEL,
- 0,
- 0 );
- #ifdef UNICODE
- if (pOFI->ApiType == COMDLG_ANSI)
- {
- (*lpfnHook)( hDlg,
- msgLBCHANGEA,
- cmb2,
- MAKELONG(LOWORD(nInd),
- CD_LBSELCHANGE) );
- }
- else
- #endif
- {
- (*lpfnHook)( hDlg,
- msgLBCHANGEW,
- cmb2,
- MAKELONG(LOWORD(nInd),
- CD_LBSELCHANGE) );
- }
- }
- HourGlass(FALSE);
- return (TRUE);
- break;
- }
- default :
- {
- break;
- }
- }
- break;
- }
- case ( pshHelp ) :
- {
- #ifdef UNICODE
- if (pOFI->ApiType == COMDLG_ANSI)
- {
- if (msgHELPA && pOFN->hwndOwner)
- {
- SendMessage( pOFN->hwndOwner,
- msgHELPA,
- (WPARAM)hDlg,
- (DWORD_PTR)pOFN );
- }
- }
- else
- #endif
- {
- if (msgHELPW && pOFN->hwndOwner)
- {
- SendMessage( pOFN->hwndOwner,
- msgHELPW,
- (WPARAM)hDlg,
- (DWORD_PTR)pOFN );
- }
- }
- break;
- }
- case ( psh14 ) :
- {
- bGetNetDrivesSync = TRUE;
- if (CallNetDlg(hDlg))
- {
- LNDSetEvent(hDlg);
- }
- else
- {
- bGetNetDrivesSync = FALSE;
- }
- break;
- }
- default :
- {
- break;
- }
- }
- return (FALSE);
- }
- ////////////////////////////////////////////////////////////////////////////
- //
- // UpdateListBoxes
- //
- // Fills out File and Directory List Boxes in a single pass
- // given (potentially) multiple filters
- //
- // It assumes the string of extensions are delimited by semicolons.
- //
- // hDlg Handle to File Open/Save dialog
- // pOFI pointer to OPENFILEINFO structure
- // lpszFilter pointer to filter, if NULL, use pOFI->szSpecCur
- // wMask mskDirectory and/or mskDrives, or NULL
- //
- // Returns: TRUE if match
- // FALSE if not
- //
- ////////////////////////////////////////////////////////////////////////////
- BOOL UpdateListBoxes(
- HWND hDlg,
- POPENFILEINFO pOFI,
- LPTSTR lpszFilter,
- WORD wMask)
- {
- LPTSTR lpszF[MAXFILTERS + 1];
- LPTSTR lpszTemp;
- SHORT i, nFilters;
- HWND hFileList = GetDlgItem(hDlg, lst1);
- HWND hDirList = GetDlgItem(hDlg, lst2);
- BOOL bRet = FALSE;
- TCHAR szSpec[MAX_FULLPATHNAME];
- BOOL bDriveChange;
- BOOL bFindAll = FALSE;
- RECT rDirLBox;
- BOOL bLFN;
- HANDLE hff;
- DWORD dwErr;
- WIN32_FIND_DATA FindFileData;
- TCHAR szBuffer[MAX_FULLPATHNAME]; // add one for CHAR_DOT
- WORD wCount;
- LPCURDLG lpCurDlg;
- //
- // Save the drive bit and then clear it out.
- //
- bDriveChange = wMask & mskDrives;
- wMask &= ~mskDrives;
- if (!lpszFilter)
- {
- GetDlgItemText( hDlg,
- edt1,
- lpszFilter = szSpec,
- MAX_FULLPATHNAME - 1 );
- //
- // If any directory or drive characters are in there, or if there
- // are no wildcards, use the default spec.
- //
- if ( StrChr(szSpec, CHAR_BSLASH) ||
- StrChr(szSpec, CHAR_SLASH) ||
- StrChr(szSpec, CHAR_COLON) ||
- (!((StrChr(szSpec, CHAR_STAR)) ||
- (StrChr(szSpec, CHAR_QMARK)))) )
- {
- lstrcpy(szSpec, pOFI->szSpecCur);
- }
- else
- {
- lstrcpy(pOFI->szLastFilter, szSpec);
- }
- }
- //
- // We need to find out what kind of a drive we are running
- // on in order to determine if spaces are valid in a filename
- // or not.
- //
- bLFN = IsLFNDriveX(hDlg, TEXT("
English
