⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 DC的SEGA_GG模拟器源代码
💻 C
字号:
#include <windows.h>
#include <shlobj.h>
#include <stdio.h>
#include "file.h"

OPENFILENAME								FileDialog;

// Initialises the file dialog 
void InitFileDialog(HWND hwnd, char *pInitialDir, char *pFilter, DWORD Flags)
{
	FileDialog.lStructSize		= sizeof(OPENFILENAME);
	FileDialog.hwndOwner		= hwnd;
	FileDialog.hInstance		= 0;
	FileDialog.lpstrFilter		= pFilter;
	FileDialog.lpstrCustomFilter= 0;
	FileDialog.nMaxCustFilter	= 0;
	FileDialog.nFilterIndex		= 0;
	FileDialog.lpstrFile		= 0;
	FileDialog.nMaxFile			= _MAX_PATH;
	FileDialog.lpstrFileTitle	= NULL;
	FileDialog.nMaxFileTitle	= _MAX_FNAME + _MAX_EXT;
	FileDialog.lpstrInitialDir	= pInitialDir;
	FileDialog.lpstrTitle		= NULL;
	FileDialog.Flags			= Flags;
	FileDialog.nFileOffset		= 0;
	FileDialog.nFileExtension	= 0;
	FileDialog.lpstrDefExt		= NULL;
	FileDialog.lCustData		= 0L;
	FileDialog.lpfnHook			= NULL;
	FileDialog.lpTemplateName	= NULL;
}

// Sets up a file dialog for a load, and obtains the load name
BOOL GetLoadFileFromDialog(HWND hwnd, char *pTitle, char *pBuffer)
{
	memset(pBuffer, 0, strlen(pBuffer));

	FileDialog.hwndOwner		= hwnd;
	FileDialog.lpstrFile		= pBuffer;
	FileDialog.Flags			&= (~OFN_HIDEREADONLY);
	FileDialog.lpstrTitle		= pTitle;

	return GetOpenFileName(&FileDialog);
}

// Sets up a file dialog for a save, and obtains the save name
BOOL GetSaveFileFromDialog(HWND hwnd, char *pTitle, char *pBuffer)
{
	memset(pBuffer, 0, strlen(pBuffer));

	FileDialog.hwndOwner		= hwnd;
	FileDialog.lpstrFile		= pBuffer;
	FileDialog.Flags			|= OFN_HIDEREADONLY;
	FileDialog.lpstrTitle		= pTitle;

	return GetSaveFileName(&FileDialog);
}

BOOL BrowseForDirectory(HWND hwnd, LPSTR DirName, LPCSTR Prompt)
{ 
	BROWSEINFO bi;
	LPITEMIDLIST pidlDrives;	// PIDL for Drives folder
	LPITEMIDLIST pidlBrowse;	// PIDL selected by user
	LPMALLOC g_pMalloc; 

	/* Get the shell's allocator */
	if (!SUCCEEDED(SHGetMalloc(&g_pMalloc)))
		return FALSE;
 
	/* Get the PIDL for the Drives folder. */
	if (!SUCCEEDED(SHGetSpecialFolderLocation(hwnd, /*CSIDL_DRIVES*/ /*CSIDL_NETWORK*/ CSIDL_DESKTOP, &pidlDrives))) {
		g_pMalloc->lpVtbl->Release(g_pMalloc);
		return FALSE;
	}

	/* Fill in the BROWSEINFO structure. */
	bi.hwndOwner = hwnd;
	bi.pidlRoot = pidlDrives;
	bi.pszDisplayName = DirName;		// no path output
	if (Prompt == NULL)
		bi.lpszTitle = "Chosen Directory:";
	else
		bi.lpszTitle = Prompt;
	bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
	bi.lpfn = GetDirFunc;
	bi.lParam = (long)DirName;

	/* Browser Dialog (And Get Directories PIDL) */
	pidlBrowse = SHBrowseForFolder(&bi);
	if (pidlBrowse == NULL) {
		g_pMalloc->lpVtbl->Free(g_pMalloc, pidlDrives);
		g_pMalloc->lpVtbl->Release(g_pMalloc);
		return FALSE;
	}

	/* Get Full Path Name */
	SHGetPathFromIDList(pidlBrowse, DirName);

	/* Free the browse PIDL */
	g_pMalloc->lpVtbl->Free(g_pMalloc, pidlBrowse);

	/* Free the Drives pidl */
	g_pMalloc->lpVtbl->Free(g_pMalloc, pidlDrives);

	/* Release the shell's allocator */
	g_pMalloc->lpVtbl->Release(g_pMalloc);
  
	if (DirName[strlen(DirName) - 1] != '\\') strcat(DirName, "\\");

	return TRUE;
}


int CALLBACK GetDirFunc(HWND hwnd, UINT uMsg, LPARAM lpData, LPARAM lParam)
{
	char str[MAX_PATH];

	if (uMsg == BFFM_INITIALIZED) {
		SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lParam);
	} else if (uMsg == BFFM_SELCHANGED) {
		SHGetPathFromIDList((LPITEMIDLIST)lpData, str);
		if (str[0]==(char)0)
			SendMessage(hwnd, BFFM_SETSTATUSTEXT, (WPARAM)0, (LPARAM)"<None>");
		else
			SendMessage(hwnd, BFFM_SETSTATUSTEXT, (WPARAM)0, (LPARAM)str);
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -