📄 filedlg31.c
字号:
/*
* COMMDLG - File Dialogs
*
* Copyright 1994 Martin Ayotte
* Copyright 1996 Albrecht Kleine
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <ctype.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "windef.h"
#include "winbase.h"
#include "winnls.h"
#include "wingdi.h"
#include "winuser.h"
#include "wine/unicode.h"
#include "wine/debug.h"
#include "winreg.h"
#include "winternl.h"
#include "commdlg.h"
#include "shlwapi.h"
WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
#include "cdlg.h"
#include "filedlg31.h"
#define BUFFILE 512
#define BUFFILEALLOC 512 * sizeof(WCHAR)
static const WCHAR FILE_star[] = {'*','.','*', 0};
static const WCHAR FILE_bslash[] = {'\\', 0};
static const WCHAR FILE_specc[] = {'%','c',':', 0};
static const int fldrHeight = 16;
static const int fldrWidth = 20;
static HICON hFolder = 0;
static HICON hFolder2 = 0;
static HICON hFloppy = 0;
static HICON hHDisk = 0;
static HICON hCDRom = 0;
static HICON hNet = 0;
/***********************************************************************
* FD31_Init [internal]
*/
BOOL FD31_Init(void)
{
static BOOL initialized = 0;
if (!initialized) {
hFolder = LoadImageA( COMDLG32_hInstance, "FOLDER", IMAGE_ICON, 16, 16, LR_SHARED );
hFolder2 = LoadImageA( COMDLG32_hInstance, "FOLDER2", IMAGE_ICON, 16, 16, LR_SHARED );
hFloppy = LoadImageA( COMDLG32_hInstance, "FLOPPY", IMAGE_ICON, 16, 16, LR_SHARED );
hHDisk = LoadImageA( COMDLG32_hInstance, "HDISK", IMAGE_ICON, 16, 16, LR_SHARED );
hCDRom = LoadImageA( COMDLG32_hInstance, "CDROM", IMAGE_ICON, 16, 16, LR_SHARED );
hNet = LoadImageA( COMDLG32_hInstance, "NETWORK", IMAGE_ICON, 16, 16, LR_SHARED );
if (hFolder == 0 || hFolder2 == 0 || hFloppy == 0 ||
hHDisk == 0 || hCDRom == 0 || hNet == 0)
{
ERR("Error loading icons !\n");
return FALSE;
}
initialized = TRUE;
}
return TRUE;
}
/***********************************************************************
* FD31_StripEditControl [internal]
* Strip pathnames off the contents of the edit control.
*/
static void FD31_StripEditControl(HWND hwnd)
{
WCHAR temp[BUFFILE], *cp;
GetDlgItemTextW( hwnd, edt1, temp, sizeof(temp)/sizeof(WCHAR));
cp = strrchrW(temp, '\\');
if (cp != NULL) {
strcpyW(temp, cp+1);
}
cp = strrchrW(temp, ':');
if (cp != NULL) {
strcpyW(temp, cp+1);
}
/* FIXME: shouldn't we do something with the result here? ;-) */
}
/***********************************************************************
* FD31_CallWindowProc [internal]
*
* Call the appropriate hook
*/
BOOL FD31_CallWindowProc(const FD31_DATA *lfs, UINT wMsg, WPARAM wParam,
LPARAM lParam)
{
return lfs->callbacks->CWP(lfs, wMsg, wParam, lParam);
}
/***********************************************************************
* FD31_ScanDir [internal]
*/
static BOOL FD31_ScanDir(HWND hWnd, LPCWSTR newPath)
{
WCHAR buffer[BUFFILE];
HWND hdlg, hdlgDir;
LRESULT lRet = TRUE;
HCURSOR hCursorWait, oldCursor;
TRACE("Trying to change to %s\n", debugstr_w(newPath));
if ( newPath[0] && !SetCurrentDirectoryW( newPath ))
return FALSE;
lstrcpynW(buffer, newPath, sizeof(buffer)/sizeof(WCHAR));
/* get the list of spec files */
GetDlgItemTextW(hWnd, edt1, buffer, sizeof(buffer)/sizeof(WCHAR));
hCursorWait = LoadCursorA(0, (LPSTR)IDC_WAIT);
oldCursor = SetCursor(hCursorWait);
/* list of files */
if ((hdlg = GetDlgItem(hWnd, lst1)) != 0) {
WCHAR* scptr; /* ptr on semi-colon */
WCHAR* filter = buffer;
TRACE("Using filter %s\n", debugstr_w(filter));
SendMessageW(hdlg, LB_RESETCONTENT, 0, 0);
while (filter) {
scptr = strchrW(filter, ';');
if (scptr) *scptr = 0;
while (*filter == ' ') filter++;
TRACE("Using file spec %s\n", debugstr_w(filter));
if (SendMessageW(hdlg, LB_DIR, 0, (LPARAM)filter) == LB_ERR)
return FALSE;
if (scptr) *scptr = ';';
filter = (scptr) ? (scptr + 1) : 0;
}
}
/* list of directories */
strcpyW(buffer, FILE_star);
if ((hdlgDir = GetDlgItem(hWnd, lst2)) != 0) {
lRet = DlgDirListW(hWnd, buffer, lst2, stc1, DDL_EXCLUSIVE | DDL_DIRECTORY);
}
SetCursor(oldCursor);
return lRet;
}
/***********************************************************************
* FD31_GetFileType [internal]
*/
static LPCWSTR FD31_GetFileType(LPCWSTR cfptr, LPCWSTR fptr, const WORD index)
{
int n, i;
i = 0;
if (cfptr)
for ( ;(n = lstrlenW(cfptr)) != 0; i++)
{
cfptr += n + 1;
if (i == index)
return cfptr;
cfptr += lstrlenW(cfptr) + 1;
}
if (fptr)
for ( ;(n = lstrlenW(fptr)) != 0; i++)
{
fptr += n + 1;
if (i == index)
return fptr;
fptr += lstrlenW(fptr) + 1;
}
return FILE_star; /* FIXME */
}
/***********************************************************************
* FD31_WMDrawItem [internal]
*/
LONG FD31_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam,
int savedlg, const DRAWITEMSTRUCT *lpdis)
{
WCHAR *str;
HICON hIcon;
COLORREF oldText = 0, oldBk = 0;
if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst1)
{
if (!(str = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC))) return FALSE;
SendMessageW(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID,
(LPARAM)str);
if ((lpdis->itemState & ODS_SELECTED) && !savedlg)
{
oldBk = SetBkColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHT ) );
oldText = SetTextColor( lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
}
if (savedlg)
SetTextColor(lpdis->hDC,GetSysColor(COLOR_GRAYTEXT) );
ExtTextOutW(lpdis->hDC, lpdis->rcItem.left + 1,
lpdis->rcItem.top + 1, ETO_OPAQUE | ETO_CLIPPED,
&(lpdis->rcItem), str, lstrlenW(str), NULL);
if (lpdis->itemState & ODS_SELECTED)
DrawFocusRect( lpdis->hDC, &(lpdis->rcItem) );
if ((lpdis->itemState & ODS_SELECTED) && !savedlg)
{
SetBkColor( lpdis->hDC, oldBk );
SetTextColor( lpdis->hDC, oldText );
}
HeapFree(GetProcessHeap(), 0, str);
return TRUE;
}
if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst2)
{
if (!(str = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC)))
return FALSE;
SendMessageW(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID,
(LPARAM)str);
if (lpdis->itemState & ODS_SELECTED)
{
oldBk = SetBkColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHT ) );
oldText = SetTextColor( lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
}
ExtTextOutW(lpdis->hDC, lpdis->rcItem.left + fldrWidth,
lpdis->rcItem.top + 1, ETO_OPAQUE | ETO_CLIPPED,
&(lpdis->rcItem), str, lstrlenW(str), NULL);
if (lpdis->itemState & ODS_SELECTED)
DrawFocusRect( lpdis->hDC, &(lpdis->rcItem) );
if (lpdis->itemState & ODS_SELECTED)
{
SetBkColor( lpdis->hDC, oldBk );
SetTextColor( lpdis->hDC, oldText );
}
DrawIcon(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, hFolder);
HeapFree(GetProcessHeap(), 0, str);
return TRUE;
}
if (lpdis->CtlType == ODT_COMBOBOX && lpdis->CtlID == cmb2)
{
char root[] = "a:";
if (!(str = HeapAlloc(GetProcessHeap(), 0, BUFFILEALLOC)))
return FALSE;
SendMessageW(lpdis->hwndItem, CB_GETLBTEXT, lpdis->itemID,
(LPARAM)str);
root[0] += str[2] - 'a';
switch(GetDriveTypeA(root))
{
case DRIVE_REMOVABLE: hIcon = hFloppy; break;
case DRIVE_CDROM: hIcon = hCDRom; break;
case DRIVE_REMOTE: hIcon = hNet; break;
case DRIVE_FIXED:
default: hIcon = hHDisk; break;
}
if (lpdis->itemState & ODS_SELECTED)
{
oldBk = SetBkColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHT ) );
oldText = SetTextColor( lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
}
ExtTextOutW(lpdis->hDC, lpdis->rcItem.left + fldrWidth,
lpdis->rcItem.top + 1, ETO_OPAQUE | ETO_CLIPPED,
&(lpdis->rcItem), str, lstrlenW(str), NULL);
if (lpdis->itemState & ODS_SELECTED)
{
SetBkColor( lpdis->hDC, oldBk );
SetTextColor( lpdis->hDC, oldText );
}
DrawIcon(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, hIcon);
HeapFree(GetProcessHeap(), 0, str);
return TRUE;
}
return FALSE;
}
/***********************************************************************
* FD31_UpdateResult [internal]
* update the displayed file name (with path)
*/
static void FD31_UpdateResult(const FD31_DATA *lfs, const WCHAR *tmpstr)
{
int lenstr2;
LPOPENFILENAMEW ofnW = lfs->ofnW;
WCHAR tmpstr2[BUFFILE];
WCHAR *p;
TRACE("%s\n", debugstr_w(tmpstr));
if(ofnW->Flags & OFN_NOVALIDATE)
tmpstr2[0] = '\0';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -