584 lines
15 KiB
C++
584 lines
15 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1993-2001 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
browse.cpp
|
||
|
|
||
|
Abstract:
|
||
|
This file implements the functions that make use of the common
|
||
|
file open dialogs for browsing for files/directories.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Wesley Witt (wesw) 1-May-1993
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
User Mode
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "pch.cpp"
|
||
|
|
||
|
|
||
|
static _TCHAR szHelpFileName[MAX_PATH];
|
||
|
static _TCHAR szLastWaveFile[MAX_PATH];
|
||
|
static _TCHAR szLastDumpFile[MAX_PATH];
|
||
|
|
||
|
|
||
|
|
||
|
int CALLBACK
|
||
|
BrowseHookProc(
|
||
|
HWND hwnd,
|
||
|
UINT message,
|
||
|
LPARAM lParam,
|
||
|
LPARAM lpData
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Hook procedure for directory browse common file dialog. This hook
|
||
|
procedure is required to provide help, put the window in the
|
||
|
foreground, and set the edit so that the common file dialog dll
|
||
|
thinks the user entered a value.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
hwnd - window handle to the dialog box
|
||
|
|
||
|
message - message number
|
||
|
|
||
|
wParam - first message parameter
|
||
|
|
||
|
lParam - Caller's data
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE - did not process the message
|
||
|
FALSE - did process the message
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
POINT pt;
|
||
|
DWORD ctlId;
|
||
|
|
||
|
switch (message) {
|
||
|
#if 0
|
||
|
case WM_COMMAND:
|
||
|
if (wParam==psh15) {
|
||
|
//
|
||
|
// get the help file name
|
||
|
//
|
||
|
GetHtmlHelpFileName(szHelpFileName, sizeof(szHelpFileName) / sizeof(_TCHAR) );
|
||
|
//GetWinHelpFileName( szHelpFileName, sizeof( szHelpFileName ) / sizeof(_TCHAR) );
|
||
|
|
||
|
//
|
||
|
// call for Help
|
||
|
//
|
||
|
HtmlHelp(hwnd,
|
||
|
szHelpFileName,
|
||
|
HH_DISPLAY_TOPIC,
|
||
|
(DWORD_PTR)(IDHH_LOGFILELOCATION)
|
||
|
);
|
||
|
//WinHelp( hwnd, szHelpFileName, HELP_FINDER, IDH_LOGFILELOCATION );
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_CONTEXTMENU: // right mouse click
|
||
|
if( hwnd == (HWND) wParam ) {
|
||
|
GetCursorPos(&pt);
|
||
|
ScreenToClient(hwnd, &pt);
|
||
|
wParam = (WPARAM) ChildWindowFromPoint(hwnd, pt);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// only mess with our controls
|
||
|
//
|
||
|
ctlId = GetDlgCtrlID((HWND) wParam);
|
||
|
if (ctlId != psh15) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
GetWinHelpFileName( szHelpFileName, sizeof(szHelpFileName) / sizeof(_TCHAR) );
|
||
|
WinHelp((HWND)wParam,
|
||
|
szHelpFileName,
|
||
|
HELP_CONTEXTMENU,
|
||
|
(DWORD_PTR) DrWatsonHelpIds
|
||
|
);
|
||
|
return TRUE;
|
||
|
#endif
|
||
|
case BFFM_INITIALIZED:
|
||
|
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
BrowseForDirectory(
|
||
|
HWND hwnd,
|
||
|
_TCHAR *szCurrDir
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Presents a common file open dialog that contains only the directory
|
||
|
tree. The use can select a directory for use as a storage location
|
||
|
for the DRWTSN32 log file.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
szCurrDir - current directory
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE - got a good directory (user pressed the OK button)
|
||
|
FALSE - got nothing (user pressed the CANCEL button)
|
||
|
|
||
|
the szCurrDir is also changed to have the selected directory.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
BROWSEINFO browseinfo;
|
||
|
LPITEMIDLIST pitemidlist;
|
||
|
_TCHAR ftitle [MAX_PATH];
|
||
|
_TCHAR title [MAX_PATH];
|
||
|
_TCHAR fname [MAX_PATH];
|
||
|
_TCHAR szDir [_MAX_DIR];
|
||
|
|
||
|
browseinfo.hwndOwner = hwnd;
|
||
|
browseinfo.pidlRoot = NULL;
|
||
|
browseinfo.pszDisplayName = fname;
|
||
|
_tcscpy( title, LoadRcString( IDS_LOGBROWSE_TITLE ) );
|
||
|
browseinfo.lpszTitle = title;
|
||
|
browseinfo.ulFlags = BIF_NEWDIALOGSTYLE |
|
||
|
BIF_RETURNONLYFSDIRS ;
|
||
|
browseinfo.lpfn = BrowseHookProc;
|
||
|
browseinfo.lParam = (LPARAM) szCurrDir;
|
||
|
|
||
|
if (pitemidlist = SHBrowseForFolder(&browseinfo)) {
|
||
|
SHFILEINFO FolderData;
|
||
|
if (SHGetPathFromIDList(pitemidlist,
|
||
|
szDir )) {
|
||
|
_tcscpy( szCurrDir, szDir );
|
||
|
szCurrDir[_tcslen(szCurrDir)] = _T('\0');
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
UINT_PTR
|
||
|
WaveHookProc(
|
||
|
HWND hwnd,
|
||
|
UINT message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Hook procedure for wave file selection common file dialog. This hook
|
||
|
procedure is required to provide help, put the window in the
|
||
|
foreground, and provide a test button for listening to a wave file.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
hwnd - window handle to the dialog box
|
||
|
|
||
|
message - message number
|
||
|
|
||
|
wParam - first message parameter
|
||
|
|
||
|
lParam - second message parameter
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE - did not process the message
|
||
|
FALSE - did process the message
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
_TCHAR szWave[MAX_PATH];
|
||
|
DWORD ctlId;
|
||
|
NMHDR *pnmhdr;
|
||
|
|
||
|
switch (message) {
|
||
|
case WM_INITDIALOG:
|
||
|
SetForegroundWindow( hwnd );
|
||
|
return (TRUE);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (wParam) {
|
||
|
case ID_TEST_WAVE:
|
||
|
CommDlg_OpenSave_GetFilePath(GetParent(hwnd), szWave, sizeof(szWave) / sizeof(_TCHAR));
|
||
|
PlaySound( szWave, NULL, SND_FILENAME );
|
||
|
break;
|
||
|
|
||
|
#if 0
|
||
|
case psh15:
|
||
|
//
|
||
|
// get the help file name
|
||
|
//
|
||
|
GetHtmlHelpFileName( szHelpFileName, sizeof( szHelpFileName ) / sizeof(_TCHAR) );
|
||
|
//GetWinHelpFileName( szHelpFileName, sizeof( szHelpFileName ) / sizeof(_TCHAR) );
|
||
|
|
||
|
//
|
||
|
// call for Help
|
||
|
//
|
||
|
HtmlHelp(hwnd,
|
||
|
szHelpFileName,
|
||
|
HH_DISPLAY_TOPIC,
|
||
|
(DWORD_PTR)(IDHH_WAVEFILE)
|
||
|
);
|
||
|
//WinHelp( hwnd, szHelpFileName, HELP_FINDER, IDH_WAVEFILE );
|
||
|
break;
|
||
|
#endif
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
#if 0
|
||
|
case WM_CONTEXTMENU: // right mouse click
|
||
|
if( hwnd == (HWND) wParam ) {
|
||
|
POINT pt;
|
||
|
GetCursorPos(&pt);
|
||
|
ScreenToClient(hwnd, &pt);
|
||
|
wParam = (WPARAM) ChildWindowFromPoint(hwnd, pt);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// only mess with our controls
|
||
|
//
|
||
|
ctlId = GetDlgCtrlID((HWND) wParam);
|
||
|
if (ctlId != psh15 && ctlId != ID_TEST_WAVE) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
GetWinHelpFileName( szHelpFileName, sizeof(szHelpFileName) / sizeof(_TCHAR) );
|
||
|
WinHelp((HWND)wParam,
|
||
|
szHelpFileName,
|
||
|
HELP_CONTEXTMENU,
|
||
|
(DWORD_PTR) DrWatsonHelpIds
|
||
|
);
|
||
|
return TRUE;
|
||
|
#endif
|
||
|
case WM_NOTIFY:
|
||
|
pnmhdr = (NMHDR *) lParam;
|
||
|
if (pnmhdr->code == CDN_HELP) {
|
||
|
LPOFNOTIFY pofn = (LPOFNOTIFY) lParam;
|
||
|
|
||
|
PostMessage(pofn->lpOFN->hwndOwner, IDH_WAVE_FILE, 0 , 0);
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
|
||
|
GetHtmlHelpFileName( szHelpFileName, sizeof( szHelpFileName ) / sizeof(_TCHAR) );
|
||
|
HtmlHelp(pofn->lpOFN->hwndOwner,
|
||
|
szHelpFileName,
|
||
|
HH_DISPLAY_TOPIC,
|
||
|
(DWORD_PTR) (IDHH_WAVEFILE)
|
||
|
);
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
GetWaveFileName(
|
||
|
HWND hwnd,
|
||
|
_TCHAR *szWaveName
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Presents a common file open dialog for the purpose of selecting a
|
||
|
wave file to be played when an application error occurs.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
szWaveName - name of the selected wave file
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE - got a good wave file name (user pressed the OK button)
|
||
|
FALSE - got nothing (user pressed the CANCEL button)
|
||
|
|
||
|
the szWaveName is changed to have the selected wave file name.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
OPENFILENAME of;
|
||
|
_TCHAR ftitle[MAX_PATH];
|
||
|
_TCHAR title[MAX_PATH];
|
||
|
_TCHAR fname[MAX_PATH];
|
||
|
_TCHAR filter[1024];
|
||
|
_TCHAR szDrive [_MAX_DRIVE];
|
||
|
_TCHAR szDir [_MAX_DIR];
|
||
|
_TCHAR szDefExt[]=_T("wav");
|
||
|
|
||
|
LPTSTR pszfil;
|
||
|
|
||
|
ZeroMemory(&of, sizeof(OPENFILENAME));
|
||
|
ftitle[0] = 0;
|
||
|
_tcscpy( fname, *szWaveName ? szWaveName : _T("*.wav") );
|
||
|
of.lStructSize = sizeof(OPENFILENAME);
|
||
|
of.hwndOwner = hwnd;
|
||
|
of.hInstance = GetModuleHandle( NULL );
|
||
|
_tcscpy( filter, LoadRcString( IDS_WAVE_FILTER ) );
|
||
|
pszfil=&filter[_tcslen(filter)+1];
|
||
|
_tcscpy( pszfil, _T("*.wav") );
|
||
|
pszfil[_tcslen(pszfil)+1] = _T('\0');
|
||
|
of.lpstrFilter = filter;
|
||
|
of.lpstrCustomFilter = NULL;
|
||
|
of.nMaxCustFilter = 0;
|
||
|
of.nFilterIndex = 0;
|
||
|
of.lpstrFile = fname;
|
||
|
of.nMaxFile = MAX_PATH;
|
||
|
of.lpstrFileTitle = ftitle;
|
||
|
of.nMaxFileTitle = MAX_PATH;
|
||
|
_tcscpy( title, LoadRcString( IDS_WAVEBROWSE_TITLE ) );
|
||
|
of.lpstrTitle = title;
|
||
|
of.Flags = OFN_NONETWORKBUTTON |
|
||
|
OFN_HIDEREADONLY |
|
||
|
OFN_ENABLEHOOK |
|
||
|
OFN_ENABLETEMPLATE |
|
||
|
#if 1
|
||
|
OFN_SHOWHELP |
|
||
|
#endif
|
||
|
OFN_NOCHANGEDIR |
|
||
|
OFN_EXPLORER |
|
||
|
OFN_ENABLESIZING |
|
||
|
OFN_NODEREFERENCELINKS;
|
||
|
of.nFileOffset = 0;
|
||
|
of.nFileExtension = 0;
|
||
|
of.lpstrDefExt = szDefExt;
|
||
|
of.lCustData = 0;
|
||
|
of.lpfnHook = WaveHookProc;
|
||
|
of.lpTemplateName = MAKEINTRESOURCE(WAVEFILEOPENDIALOG2);
|
||
|
if (GetOpenFileName( &of )) {
|
||
|
_tcscpy( szWaveName, fname );
|
||
|
_tsplitpath( fname, szDrive, szDir, NULL, NULL );
|
||
|
_tcscpy( szLastWaveFile, szDrive );
|
||
|
_tcscat( szLastWaveFile, szDir );
|
||
|
return TRUE;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
UINT_PTR
|
||
|
DumpHookProc(
|
||
|
HWND hwnd,
|
||
|
UINT message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Hook procedure for wave file selection common file dialog. This hook
|
||
|
procedure is required to provide help, put the window in the
|
||
|
foreground, and provide a test button for listening to a wave file.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
hwnd - window handle to the dialog box
|
||
|
|
||
|
message - message number
|
||
|
|
||
|
wParam - first message parameter
|
||
|
|
||
|
lParam - second message parameter
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE - did not process the message
|
||
|
FALSE - did process the message
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
DWORD ctlId;
|
||
|
NMHDR *pnmhdr;
|
||
|
|
||
|
switch (message) {
|
||
|
#if 0
|
||
|
case WM_INITDIALOG:
|
||
|
SetForegroundWindow( hwnd );
|
||
|
return (TRUE);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (wParam) {
|
||
|
case psh15:
|
||
|
//
|
||
|
// get the help file name
|
||
|
//
|
||
|
GetHtmlHelpFileName( szHelpFileName, sizeof( szHelpFileName ) / sizeof(_TCHAR) );
|
||
|
//GetWinHelpFileName( szHelpFileName, sizeof( szHelpFileName ) / sizeof(_TCHAR) );
|
||
|
|
||
|
//
|
||
|
// call HtmlHelp
|
||
|
//
|
||
|
HtmlHelp(hwnd,
|
||
|
szHelpFileName,
|
||
|
HH_DISPLAY_TOPIC,
|
||
|
(DWORD_PTR)(IDHH_CRASH_DUMP)
|
||
|
);
|
||
|
//WinHelp( hwnd, szHelpFileName, HELP_FINDER, IDH_CRASH_DUMP );
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_CONTEXTMENU: // right mouse click
|
||
|
if( hwnd == (HWND) wParam ) {
|
||
|
POINT pt;
|
||
|
GetCursorPos(&pt);
|
||
|
ScreenToClient(hwnd, &pt);
|
||
|
wParam = (WPARAM) ChildWindowFromPoint(hwnd, pt);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// only mess with our controls
|
||
|
//
|
||
|
ctlId = GetDlgCtrlID((HWND) wParam);
|
||
|
if (ctlId != psh15) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
GetWinHelpFileName( szHelpFileName, sizeof(szHelpFileName) / sizeof(_TCHAR) );
|
||
|
WinHelp((HWND)wParam,
|
||
|
szHelpFileName,
|
||
|
HELP_CONTEXTMENU,
|
||
|
(DWORD_PTR) DrWatsonHelpIds
|
||
|
);
|
||
|
return TRUE;
|
||
|
#endif
|
||
|
case WM_NOTIFY:
|
||
|
pnmhdr = (NMHDR *) lParam;
|
||
|
if (pnmhdr->code == CDN_HELP) {
|
||
|
LPOFNOTIFY pofn = (LPOFNOTIFY) lParam;
|
||
|
|
||
|
PostMessage(pofn->lpOFN->hwndOwner, IDH_CRASH_DUMP, 0 , 0);
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
GetHtmlHelpFileName( szHelpFileName, sizeof( szHelpFileName ) / sizeof(_TCHAR) );
|
||
|
|
||
|
HtmlHelp(pofn->lpOFN->hwndOwner,
|
||
|
szHelpFileName,
|
||
|
HH_DISPLAY_TOPIC,
|
||
|
(DWORD_PTR) (IDHH_CRASH_DUMP)
|
||
|
);
|
||
|
return TRUE;
|
||
|
}
|
||
|
case WM_CLOSE:
|
||
|
HtmlHelp( NULL, NULL, HH_CLOSE_ALL, 0);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
GetDumpFileName(
|
||
|
HWND hwnd,
|
||
|
_TCHAR *szDumpName
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Presents a common file open dialog for the purpose of selecting a
|
||
|
wave file to be played when an application error occurs.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
szWaveName - name of the selected wave file
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE - got a good wave file name (user pressed the OK button)
|
||
|
FALSE - got nothing (user pressed the CANCEL button)
|
||
|
|
||
|
the szWaveName is changed to have the selected wave file name.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
OPENFILENAME of;
|
||
|
_TCHAR ftitle[MAX_PATH];
|
||
|
_TCHAR title[MAX_PATH];
|
||
|
_TCHAR fname[MAX_PATH];
|
||
|
_TCHAR filter[1024];
|
||
|
_TCHAR szDrive [_MAX_DRIVE];
|
||
|
_TCHAR szDir [_MAX_DIR];
|
||
|
_TCHAR szDefExt[]=_T("dmp");
|
||
|
|
||
|
LPTSTR pszfil;
|
||
|
|
||
|
ZeroMemory(&of, sizeof(OPENFILENAME));
|
||
|
ftitle[0] = 0;
|
||
|
_tcscpy( fname, *szDumpName ? szDumpName : _T("*.dmp") );
|
||
|
of.lStructSize = sizeof(OPENFILENAME);
|
||
|
of.hwndOwner = hwnd;
|
||
|
of.hInstance = GetModuleHandle( NULL );
|
||
|
_tcscpy( filter, LoadRcString( IDS_DUMP_FILTER ) );
|
||
|
pszfil=&filter[_tcslen(filter)+1];
|
||
|
_tcscpy( pszfil, _T("*.dmp") );
|
||
|
pszfil[_tcslen(pszfil) +1] = _T('\0');
|
||
|
of.lpstrFilter = filter;
|
||
|
of.lpstrCustomFilter = NULL;
|
||
|
of.nMaxCustFilter = 0;
|
||
|
of.nFilterIndex = 0;
|
||
|
of.lpstrFile = fname;
|
||
|
of.nMaxFile = MAX_PATH;
|
||
|
of.lpstrFileTitle = ftitle;
|
||
|
of.nMaxFileTitle = MAX_PATH;
|
||
|
_tcscpy( title, LoadRcString( IDS_DUMPBROWSE_TITLE ) );
|
||
|
of.lpstrTitle = title;
|
||
|
of.Flags = //OFN_NONETWORKBUTTON |
|
||
|
OFN_HIDEREADONLY |
|
||
|
OFN_ENABLEHOOK |
|
||
|
#if 1
|
||
|
OFN_SHOWHELP |
|
||
|
#endif
|
||
|
OFN_NOCHANGEDIR |
|
||
|
OFN_EXPLORER |
|
||
|
OFN_ENABLESIZING;
|
||
|
of.nFileOffset = 0;
|
||
|
of.nFileExtension = 0;
|
||
|
of.lpstrDefExt = szDefExt;
|
||
|
of.lCustData = 0;
|
||
|
of.lpfnHook = DumpHookProc;
|
||
|
of.lpTemplateName = MAKEINTRESOURCE(DUMPFILEOPENDIALOG);
|
||
|
if (GetOpenFileName( &of )) {
|
||
|
_tcscpy( szDumpName, fname );
|
||
|
_tsplitpath( fname, szDrive, szDir, NULL, NULL );
|
||
|
_tcscpy( szLastDumpFile, szDrive );
|
||
|
_tcscat( szLastDumpFile, szDir );
|
||
|
return TRUE;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|