📄 filedlg31.c
字号:
case cmb1: /* file type drop list */
if (notification == CBN_SELCHANGE)
return FD31_FileTypeChange( lfs );
break;
case chx1:
break;
case pshHelp:
break;
case cmb2: /* disk dropdown combo */
if (notification == CBN_SELCHANGE)
return FD31_DiskChange( lfs );
break;
case IDOK:
TRACE("OK pressed\n");
if (FD31_Validate( lfs, NULL, control, 0, FALSE ))
EndDialog(hWnd, TRUE);
return TRUE;
case IDCANCEL:
EndDialog(hWnd, FALSE);
return TRUE;
case IDABORT: /* can be sent by the hook procedure */
EndDialog(hWnd, TRUE);
return TRUE;
}
return FALSE;
}
/************************************************************************
* FD31_MapStringPairsToW [internal]
* map string pairs to Unicode
*/
static LPWSTR FD31_MapStringPairsToW(LPCSTR strA, UINT size)
{
LPCSTR s;
LPWSTR x;
unsigned int n, len;
s = strA;
while (*s)
s = s+strlen(s)+1;
s++;
n = s + 1 - strA; /* Don't forget the other \0 */
if (n < size) n = size;
len = MultiByteToWideChar( CP_ACP, 0, strA, n, NULL, 0 );
x = HeapAlloc(GetProcessHeap(),0, len * sizeof(WCHAR));
MultiByteToWideChar( CP_ACP, 0, strA, n, x, len );
return x;
}
/************************************************************************
* FD31_DupToW [internal]
* duplicates an Ansi string to unicode, with a buffer size
*/
static LPWSTR FD31_DupToW(LPCSTR str, DWORD size)
{
LPWSTR strW = NULL;
if (str && (size > 0))
{
strW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
if (strW) MultiByteToWideChar( CP_ACP, 0, str, -1, strW, size );
}
return strW;
}
/************************************************************************
* FD31_MapOfnStructA [internal]
* map a 32 bits Ansi structure to an Unicode one
*/
void FD31_MapOfnStructA(const OPENFILENAMEA *ofnA, LPOPENFILENAMEW ofnW, BOOL open)
{
UNICODE_STRING usBuffer;
ofnW->lStructSize = sizeof(OPENFILENAMEW);
ofnW->hwndOwner = ofnA->hwndOwner;
ofnW->hInstance = ofnA->hInstance;
if (ofnA->lpstrFilter)
ofnW->lpstrFilter = FD31_MapStringPairsToW(ofnA->lpstrFilter, 0);
if ((ofnA->lpstrCustomFilter) && (*(ofnA->lpstrCustomFilter)))
ofnW->lpstrCustomFilter = FD31_MapStringPairsToW(ofnA->lpstrCustomFilter, ofnA->nMaxCustFilter);
ofnW->nMaxCustFilter = ofnA->nMaxCustFilter;
ofnW->nFilterIndex = ofnA->nFilterIndex;
ofnW->nMaxFile = ofnA->nMaxFile;
ofnW->lpstrFile = FD31_DupToW(ofnA->lpstrFile, ofnW->nMaxFile);
ofnW->nMaxFileTitle = ofnA->nMaxFileTitle;
ofnW->lpstrFileTitle = FD31_DupToW(ofnA->lpstrFileTitle, ofnW->nMaxFileTitle);
if (ofnA->lpstrInitialDir)
{
RtlCreateUnicodeStringFromAsciiz (&usBuffer,ofnA->lpstrInitialDir);
ofnW->lpstrInitialDir = usBuffer.Buffer;
}
if (ofnA->lpstrTitle) {
RtlCreateUnicodeStringFromAsciiz (&usBuffer, ofnA->lpstrTitle);
ofnW->lpstrTitle = usBuffer.Buffer;
} else {
WCHAR buf[16];
LPWSTR title_tmp;
int len;
LoadStringW(COMDLG32_hInstance, open ? IDS_OPEN_FILE : IDS_SAVE_AS,
buf, sizeof(buf)/sizeof(WCHAR));
len = lstrlenW(buf)+1;
title_tmp = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
memcpy(title_tmp, buf, len * sizeof(WCHAR));
ofnW->lpstrTitle = title_tmp;
}
ofnW->Flags = ofnA->Flags;
ofnW->nFileOffset = ofnA->nFileOffset;
ofnW->nFileExtension = ofnA->nFileExtension;
ofnW->lpstrDefExt = FD31_DupToW(ofnA->lpstrDefExt, 3);
if ((ofnA->Flags & OFN_ENABLETEMPLATE) && (ofnA->lpTemplateName))
{
if (HIWORD(ofnA->lpTemplateName))
{
RtlCreateUnicodeStringFromAsciiz (&usBuffer,ofnA->lpTemplateName);
ofnW->lpTemplateName = usBuffer.Buffer;
}
else /* numbered resource */
ofnW->lpTemplateName = (LPCWSTR) ofnA->lpTemplateName;
}
}
/************************************************************************
* FD31_FreeOfnW [internal]
* Undo all allocations done by FD31_MapOfnStructA
*/
void FD31_FreeOfnW(OPENFILENAMEW *ofnW)
{
HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrFilter);
HeapFree(GetProcessHeap(), 0, ofnW->lpstrCustomFilter);
HeapFree(GetProcessHeap(), 0, ofnW->lpstrFile);
HeapFree(GetProcessHeap(), 0, ofnW->lpstrFileTitle);
HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrInitialDir);
HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpstrTitle);
if (HIWORD(ofnW->lpTemplateName))
HeapFree(GetProcessHeap(), 0, (LPWSTR) ofnW->lpTemplateName);
}
/************************************************************************
* FD31_DestroyPrivate [internal]
* destroys the private object
*/
void FD31_DestroyPrivate(PFD31_DATA lfs)
{
HWND hwnd;
if (!lfs) return;
hwnd = lfs->hwnd;
TRACE("destroying private allocation %p\n", lfs);
lfs->callbacks->Destroy(lfs);
HeapFree(GetProcessHeap(), 0, lfs);
RemovePropA(hwnd, FD31_OFN_PROP);
}
/************************************************************************
* FD31_AllocPrivate [internal]
* allocate a private object to hold 32 bits Unicode
* structure that will be used throughtout the calls, while
* keeping available the original structures and a few variables
* On entry : type = dialog procedure type (16,32A,32W)
* dlgType = dialog type (open or save)
*/
PFD31_DATA FD31_AllocPrivate(LPARAM lParam, UINT dlgType,
PFD31_CALLBACKS callbacks, DWORD data)
{
PFD31_DATA lfs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FD31_DATA));
TRACE("alloc private buf %p\n", lfs);
if (!lfs) return NULL;
lfs->hook = FALSE;
lfs->lParam = lParam;
lfs->open = (dlgType == OPEN_DIALOG);
lfs->callbacks = callbacks;
if (! lfs->callbacks->Init(lParam, lfs, data))
{
FD31_DestroyPrivate(lfs);
return NULL;
}
lfs->lbselchstring = RegisterWindowMessageA(LBSELCHSTRINGA);
lfs->fileokstring = RegisterWindowMessageA(FILEOKSTRINGA);
return lfs;
}
/***********************************************************************
* FD31_WMInitDialog [internal]
*/
LONG FD31_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
int i, n;
WCHAR tmpstr[BUFFILE];
LPWSTR pstr, old_pstr;
LPOPENFILENAMEW ofn;
PFD31_DATA lfs = (PFD31_DATA) lParam;
if (!lfs) return FALSE;
SetPropA(hWnd, FD31_OFN_PROP, (HANDLE)lfs);
lfs->hwnd = hWnd;
ofn = lfs->ofnW;
TRACE("flags=%x initialdir=%s\n", ofn->Flags, debugstr_w(ofn->lpstrInitialDir));
SetWindowTextW( hWnd, ofn->lpstrTitle );
/* read custom filter information */
if (ofn->lpstrCustomFilter)
{
pstr = ofn->lpstrCustomFilter;
n = 0;
TRACE("lpstrCustomFilter = %p\n", pstr);
while(*pstr)
{
old_pstr = pstr;
i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0,
(LPARAM)(ofn->lpstrCustomFilter) + n );
n += lstrlenW(pstr) + 1;
pstr += lstrlenW(pstr) + 1;
TRACE("add str=%s associated to %s\n",
debugstr_w(old_pstr), debugstr_w(pstr));
SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr);
n += lstrlenW(pstr) + 1;
pstr += lstrlenW(pstr) + 1;
}
}
/* read filter information */
if (ofn->lpstrFilter) {
pstr = (LPWSTR) ofn->lpstrFilter;
n = 0;
while(*pstr) {
old_pstr = pstr;
i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0,
(LPARAM)(ofn->lpstrFilter + n) );
n += lstrlenW(pstr) + 1;
pstr += lstrlenW(pstr) + 1;
TRACE("add str=%s associated to %s\n",
debugstr_w(old_pstr), debugstr_w(pstr));
SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr);
n += lstrlenW(pstr) + 1;
pstr += lstrlenW(pstr) + 1;
}
}
/* set default filter */
if (ofn->nFilterIndex == 0 && ofn->lpstrCustomFilter == NULL)
ofn->nFilterIndex = 1;
SendDlgItemMessageW(hWnd, cmb1, CB_SETCURSEL, ofn->nFilterIndex - 1, 0);
lstrcpynW(tmpstr, FD31_GetFileType(ofn->lpstrCustomFilter,
ofn->lpstrFilter, ofn->nFilterIndex - 1),BUFFILE);
TRACE("nFilterIndex = %d, SetText of edt1 to %s\n",
ofn->nFilterIndex, debugstr_w(tmpstr));
SetDlgItemTextW( hWnd, edt1, tmpstr );
/* get drive list */
*tmpstr = 0;
DlgDirListComboBoxW(hWnd, tmpstr, cmb2, 0, DDL_DRIVES | DDL_EXCLUSIVE);
/* read initial directory */
/* FIXME: Note that this is now very version-specific (See MSDN description of
* the OPENFILENAME structure). For example under 2000/XP any path in the
* lpstrFile overrides the lpstrInitialDir, but not under 95/98/ME
*/
if (ofn->lpstrInitialDir != NULL)
{
int len;
lstrcpynW(tmpstr, ofn->lpstrInitialDir, 511);
len = lstrlenW(tmpstr);
if (len > 0 && tmpstr[len-1] != '\\' && tmpstr[len-1] != ':') {
tmpstr[len]='\\';
tmpstr[len+1]='\0';
}
}
else
*tmpstr = 0;
if (!FD31_ScanDir(hWnd, tmpstr)) {
*tmpstr = 0;
if (!FD31_ScanDir(hWnd, tmpstr))
WARN("Couldn't read initial directory %s!\n", debugstr_w(tmpstr));
}
/* select current drive in combo 2, omit missing drives */
{
char dir[MAX_PATH];
char str[4] = "a:\\";
GetCurrentDirectoryA( sizeof(dir), dir );
for(i = 0, n = -1; i < 26; i++)
{
str[0] = 'a' + i;
if (GetDriveTypeA(str) > DRIVE_NO_ROOT_DIR) n++;
if (toupper(str[0]) == toupper(dir[0])) break;
}
}
SendDlgItemMessageW(hWnd, cmb2, CB_SETCURSEL, n, 0);
if (!(ofn->Flags & OFN_SHOWHELP))
ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
if (ofn->Flags & OFN_HIDEREADONLY)
ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
if (lfs->hook)
return (BOOL) FD31_CallWindowProc(lfs, WM_INITDIALOG, wParam, lfs->lParam);
return TRUE;
}
int FD31_GetFldrHeight(void)
{
return fldrHeight;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -