增加OpenFileDialog和SaveFileDialog方法

This commit is contained in:
Nomango 2018-09-02 14:03:04 +08:00
parent 2c454d4a4c
commit 2e161ff6a8
9 changed files with 175 additions and 53 deletions

View File

@ -32,7 +32,7 @@ e2d::Game::Game()
, _transition(nullptr)
, _scenes()
{
CoInitialize(nullptr);
::CoInitialize(nullptr);
_window = Window::getInstance();
_input = Input::getInstance();
@ -43,7 +43,7 @@ e2d::Game::Game()
e2d::Game::~Game()
{
CoUninitialize();
::CoUninitialize();
}
void e2d::Game::start()

View File

@ -27,7 +27,7 @@ e2d::Input::Input()
, _keyboardDevice(false)
, _mouseDevice(false)
{
CoInitialize(nullptr);
::CoInitialize(nullptr);
ZeroMemory(_keyBuffer, sizeof(_keyBuffer));
ZeroMemory(&_mouseState, sizeof(_mouseState));
@ -85,7 +85,7 @@ e2d::Input::~Input()
SafeRelease(_keyboardDevice);
SafeRelease(_directInput);
CoUninitialize();
::CoUninitialize();
}
void e2d::Input::update()

View File

@ -47,7 +47,7 @@ e2d::Renderer::Renderer()
, _textRenderer(nullptr)
, _clearColor(D2D1::ColorF(D2D1::ColorF::Black))
{
CoInitialize(nullptr);
::CoInitialize(nullptr);
HWND hWnd = Window::getInstance()->getHWnd();
@ -99,7 +99,7 @@ e2d::Renderer::~Renderer()
SafeRelease(_solidBrush);
SafeRelease(_renderTarget);
CoUninitialize();
::CoUninitialize();
}
void e2d::Renderer::beginDraw()
@ -216,12 +216,16 @@ ID2D1Factory * e2d::Renderer::getFactory()
{
if (!_factory)
{
::CoInitialize(nullptr);
ThrowIfFailed(
D2D1CreateFactory(
D2D1_FACTORY_TYPE_SINGLE_THREADED,
&_factory
)
);
::CoUninitialize();
}
return _factory;
}
@ -230,6 +234,8 @@ IWICImagingFactory * e2d::Renderer::getImagingFactory()
{
if (!_imagingFactory)
{
::CoInitialize(nullptr);
ThrowIfFailed(
CoCreateInstance(
CLSID_WICImagingFactory,
@ -239,6 +245,8 @@ IWICImagingFactory * e2d::Renderer::getImagingFactory()
reinterpret_cast<void**>(&_imagingFactory)
)
);
::CoUninitialize();
}
return _imagingFactory;
}
@ -247,6 +255,8 @@ IDWriteFactory * e2d::Renderer::getWriteFactory()
{
if (!_writeFactory)
{
::CoInitialize(nullptr);
ThrowIfFailed(
DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
@ -254,6 +264,8 @@ IDWriteFactory * e2d::Renderer::getWriteFactory()
reinterpret_cast<IUnknown**>(&_writeFactory)
)
);
::CoUninitialize();
}
return _writeFactory;
}

View File

@ -34,7 +34,7 @@ e2d::Window::Window()
, _iconID(0)
, _dpi(0.f)
{
CoInitialize(nullptr);
::CoInitialize(nullptr);
// 获取系统 DPI
_dpi = static_cast<float>(::GetDpiForSystem());
@ -50,7 +50,7 @@ e2d::Window::~Window()
if (_hWnd)
::DestroyWindow(_hWnd);
CoUninitialize();
::CoUninitialize();
}
bool e2d::Window::createMutex(const String & mutex)

View File

@ -1,6 +1,5 @@
#include "..\e2dcustom.h"
#include "..\e2dbase.h"
#include "..\e2dtool.h"
#include "..\e2dcommon.h"
e2d::VoiceCallback::VoiceCallback()
{

View File

@ -1,5 +1,5 @@
#include "..\e2dtool.h"
#include <commdlg.h>
#include <shobjidl.h>
std::list<e2d::String> e2d::File::_searchPaths;
@ -158,27 +158,144 @@ bool e2d::File::createFolder(const String & dirPath)
return true;
}
e2d::String e2d::File::getSaveFilePath(const String& title, const String& defExt)
e2d::File e2d::File::showOpenDialog(const String & title, const String & filter)
{
HWND hwnd = Window::getInstance()->getHWnd();
String filePath;
HRESULT hr = ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
// 弹出保存对话框
OPENFILENAME ofn = { 0 };
wchar_t strFilename[MAX_PATH] = { 0 }; // 用于接收文件名
ofn.lStructSize = sizeof(OPENFILENAME); // 结构体大小
ofn.hwndOwner = hwnd; // 窗口句柄
ofn.lpstrFilter = L"所有文件\0*.*\0\0"; // 设置过滤
ofn.nFilterIndex = 1; // 过滤器索引
ofn.lpstrFile = strFilename; // 接收返回的文件路径和文件名
ofn.nMaxFile = sizeof(strFilename); // 缓冲区长度
ofn.lpstrInitialDir = nullptr; // 初始目录为默认
ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
ofn.lpstrTitle = (LPCWSTR)title; // 标题
ofn.lpstrDefExt = (LPCWSTR)defExt; // 默认追加的扩展名
if (::GetSaveFileName(&ofn))
if (SUCCEEDED(hr))
{
return strFilename;
IFileOpenDialog *pFileOpen;
hr = ::CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL,
IID_IFileOpenDialog, reinterpret_cast<void**>(&pFileOpen));
if (SUCCEEDED(hr))
{
if (!title.isEmpty())
{
pFileOpen->SetTitle(LPCWSTR(title));
}
if (!filter.isEmpty())
{
COMDLG_FILTERSPEC rgSpec[] =
{
{ L"", LPCWSTR(filter) }
};
pFileOpen->SetFileTypes(1, rgSpec);
}
else
{
COMDLG_FILTERSPEC rgSpec[] =
{
{ L"ËùÓÐÎļþ", L"*.*" }
};
pFileOpen->SetFileTypes(1, rgSpec);
}
Game::getInstance()->pause();
{
HWND hWnd = Window::getInstance()->getHWnd();
hr = pFileOpen->Show(hWnd);
}
Game::getInstance()->resume();
if (SUCCEEDED(hr))
{
IShellItem *pItem;
hr = pFileOpen->GetResult(&pItem);
if (SUCCEEDED(hr))
{
PWSTR pszFilePath;
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
if (SUCCEEDED(hr))
{
filePath = pszFilePath;
::CoTaskMemFree(pszFilePath);
}
pItem->Release();
}
}
pFileOpen->Release();
}
::CoUninitialize();
}
return std::move(String());
return std::move(File(filePath));
}
e2d::File e2d::File::showSaveDialog(const String & title, const String& defFile, const String & defExt)
{
String filePath;
HRESULT hr = ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (SUCCEEDED(hr))
{
IFileSaveDialog *pFileSave;
hr = ::CoCreateInstance(CLSID_FileSaveDialog, NULL, CLSCTX_ALL,
IID_IFileSaveDialog, reinterpret_cast<void**>(&pFileSave));
if (SUCCEEDED(hr))
{
if (!title.isEmpty())
{
pFileSave->SetTitle(LPCWSTR(title));
}
if (!defFile.isEmpty())
{
pFileSave->SetFileName(LPCWSTR(defFile));
}
if (!defExt.isEmpty())
{
pFileSave->SetDefaultExtension(LPCWSTR(defExt));
String spec = L"*." + defExt;
COMDLG_FILTERSPEC rgSpec[] =
{
{ L"", LPCWSTR(spec) }
};
pFileSave->SetFileTypes(1, rgSpec);
}
else
{
COMDLG_FILTERSPEC rgSpec[] =
{
{ L"ËùÓÐÎļþ", L"*.*" }
};
pFileSave->SetFileTypes(1, rgSpec);
}
Game::getInstance()->pause();
{
HWND hWnd = Window::getInstance()->getHWnd();
hr = pFileSave->Show(hWnd);
}
Game::getInstance()->resume();
if (SUCCEEDED(hr))
{
IShellItem *pItem;
hr = pFileSave->GetResult(&pItem);
if (SUCCEEDED(hr))
{
PWSTR pszFilePath;
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
if (SUCCEEDED(hr))
{
filePath = pszFilePath;
::CoTaskMemFree(pszFilePath);
}
pItem->Release();
}
}
pFileSave->Release();
}
::CoUninitialize();
}
return std::move(File(filePath));
}

View File

@ -24,7 +24,7 @@ inline bool TraceError(wchar_t* sPrompt, HRESULT hr)
e2d::Music::XAudio2Tool::XAudio2Tool()
{
CoInitialize(nullptr);
::CoInitialize(nullptr);
ThrowIfFailed(
XAudio2Create(&_xAudio2, 0)
@ -40,7 +40,7 @@ e2d::Music::XAudio2Tool::~XAudio2Tool()
_masteringVoice->DestroyVoice();
_xAudio2->Release();
CoUninitialize();
::CoUninitialize();
}
e2d::Music::XAudio2Tool* e2d::Music::XAudio2Tool::getInstance()

View File

@ -1,9 +1,5 @@
#include "..\e2dtool.h"
extern "C" const GUID DECLSPEC_SELECTANY FOLDERID_LocalAppData = {
0xF1B32785, 0x6FBA, 0x4FCF, { 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91 }
};
#include <shlobj.h>
e2d::String e2d::Path::getDataPath()
{
@ -60,18 +56,9 @@ e2d::String e2d::Path::getLocalAppDataPath()
if (localAppDataPath.isEmpty())
{
// 获取 AppData/Local 文件夹的路径
typedef HRESULT(WINAPI* pFunSHGetKnownFolderPath)(const GUID& rfid, DWORD dwFlags, HANDLE hToken, PWSTR *ppszPath);
PWSTR pszPath = nullptr;
HMODULE hModule = LoadLibrary(L"shell32.dll");
pFunSHGetKnownFolderPath SHGetKnownFolderPath = (pFunSHGetKnownFolderPath)GetProcAddress(hModule, "SHGetKnownFolderPath");
HRESULT hr = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, nullptr, &pszPath);
if (SUCCEEDED(hr))
{
localAppDataPath = pszPath;
CoTaskMemFree(pszPath);
}
WCHAR strPath[MAX_PATH] = { 0 };
::SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, strPath);
localAppDataPath = strPath;
}
return localAppDataPath;

View File

@ -482,10 +482,17 @@ public:
const String& dirPath /* 文件夹路径 */
);
// 打开保存文件对话框
static String getSaveFilePath(
const String& title = L"保存到", /* 对话框标题 */
const String& defExt = L"" /* 默认扩展名 */
// 弹出打开文件对话框
static File showOpenDialog(
const String& title = L"打开", /* 对话框标题 */
const String& filter = L"" /* 筛选扩展名,例如 "*.jpg;*.jpeg" */
);
// 弹出保存文件对话框
static File showSaveDialog(
const String& title = L"保存", /* 对话框标题 */
const String& defFile = L"", /* 默认保存的文件名 */
const String& defExt = L"" /* 默认追加的扩展名,例如 "txt" */
);
protected: