275 lines
6.9 KiB
C++
275 lines
6.9 KiB
C++
|
#include "Dialog.h"
|
|||
|
|
|||
|
HWND GetTopMostWindowInCurrentProcess()
|
|||
|
{
|
|||
|
struct EnumParams {
|
|||
|
DWORD processID;
|
|||
|
HWND topMostWindow;
|
|||
|
};
|
|||
|
DWORD currentProcessID = GetCurrentProcessId();
|
|||
|
EnumParams params = { currentProcessID, NULL };
|
|||
|
|
|||
|
EnumWindows(
|
|||
|
[](HWND hwnd, LPARAM lParam) {
|
|||
|
EnumParams* params = (EnumParams*)lParam;
|
|||
|
DWORD windowProcessID;
|
|||
|
GetWindowThreadProcessId(hwnd, &windowProcessID);
|
|||
|
if (windowProcessID == params->processID) {
|
|||
|
HWND hwndTop = hwnd;
|
|||
|
while (hwndTop != NULL) {
|
|||
|
hwndTop = GetWindow(hwndTop, GW_HWNDPREV);
|
|||
|
if (hwndTop == NULL) {
|
|||
|
params->topMostWindow = hwnd;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return TRUE;
|
|||
|
}, (LPARAM)¶ms);
|
|||
|
|
|||
|
return params.topMostWindow;
|
|||
|
}
|
|||
|
|
|||
|
OpenFileDialog::OpenFileDialog()
|
|||
|
: FilterIndex(0),
|
|||
|
Multiselect(false),
|
|||
|
SupportMultiDottedExtensions(false),
|
|||
|
DereferenceLinks(true),
|
|||
|
ValidateNames(true),
|
|||
|
Filter("All Files\0*.*\0"),
|
|||
|
Title("Open File")
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
DialogResult OpenFileDialog::ShowDialog(HWND owner)
|
|||
|
{
|
|||
|
Filter.append(2, '\0');
|
|||
|
OPENFILENAMEA ofn;
|
|||
|
CHAR szFile[1024] = { 0 };
|
|||
|
ZeroMemory(&ofn, sizeof(ofn));
|
|||
|
|
|||
|
ofn.lStructSize = sizeof(ofn);
|
|||
|
ofn.hwndOwner = owner;
|
|||
|
ofn.hInstance = GetModuleHandle(NULL);
|
|||
|
ofn.lpstrFile = szFile;
|
|||
|
ofn.nMaxFile = sizeof(szFile);
|
|||
|
ofn.lpstrFilter = Filter.c_str();
|
|||
|
ofn.nFilterIndex = FilterIndex;
|
|||
|
ofn.lpstrTitle = Title.c_str();
|
|||
|
ofn.lpstrInitialDir = InitialDirectory.empty() ? NULL : InitialDirectory.c_str();
|
|||
|
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
|
|||
|
|
|||
|
if (Multiselect)
|
|||
|
{
|
|||
|
ofn.Flags |= OFN_ALLOWMULTISELECT | OFN_EXPLORER;
|
|||
|
}
|
|||
|
if (!DereferenceLinks)
|
|||
|
{
|
|||
|
ofn.Flags |= OFN_NODEREFERENCELINKS;
|
|||
|
}
|
|||
|
if (!ValidateNames)
|
|||
|
{
|
|||
|
ofn.Flags |= OFN_NOVALIDATE;
|
|||
|
}
|
|||
|
|
|||
|
if (GetOpenFileNameA(&ofn) == TRUE)
|
|||
|
{
|
|||
|
SelectedPaths.clear();
|
|||
|
if (Multiselect)
|
|||
|
{
|
|||
|
CHAR* p = ofn.lpstrFile;
|
|||
|
std::string directory = p;
|
|||
|
p += directory.size() + 1;
|
|||
|
while (*p)
|
|||
|
{
|
|||
|
std::string filename = p;
|
|||
|
std::string fullpath = directory + "\\" + filename;
|
|||
|
SelectedPaths.push_back(fullpath);
|
|||
|
p += filename.size() + 1;
|
|||
|
}
|
|||
|
if (SelectedPaths.empty())
|
|||
|
{
|
|||
|
SelectedPaths.push_back(directory);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
SelectedPaths.push_back(ofn.lpstrFile);
|
|||
|
}
|
|||
|
return DialogResult::OK;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
DWORD err = CommDlgExtendedError();
|
|||
|
if (err != 0)
|
|||
|
{
|
|||
|
return DialogResult::Abort;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return DialogResult::Cancel;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
SaveFileDialog::SaveFileDialog()
|
|||
|
: FilterIndex(0),
|
|||
|
SupportMultiDottedExtensions(false),
|
|||
|
DereferenceLinks(true),
|
|||
|
ValidateNames(true),
|
|||
|
Filter("All Files\0*.*\0"),
|
|||
|
Title("Save File")
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
DialogResult SaveFileDialog::ShowDialog(HWND owner)
|
|||
|
{
|
|||
|
Filter.append(2, '\0');
|
|||
|
OPENFILENAMEA ofn;
|
|||
|
CHAR szFile[1024] = { 0 };
|
|||
|
ZeroMemory(&ofn, sizeof(ofn));
|
|||
|
|
|||
|
ofn.lStructSize = sizeof(ofn);
|
|||
|
ofn.hwndOwner = owner;
|
|||
|
ofn.hInstance = GetModuleHandle(NULL);
|
|||
|
ofn.lpstrFile = szFile;
|
|||
|
ofn.nMaxFile = sizeof(szFile);
|
|||
|
ofn.lpstrFilter = Filter.c_str();
|
|||
|
ofn.nFilterIndex = FilterIndex;
|
|||
|
ofn.lpstrTitle = Title.c_str();
|
|||
|
ofn.lpstrInitialDir = InitialDirectory.empty() ? NULL : InitialDirectory.c_str();
|
|||
|
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
|
|||
|
|
|||
|
if (SupportMultiDottedExtensions)
|
|||
|
{
|
|||
|
ofn.Flags |= OFN_EXPLORER | OFN_ENABLESIZING | OFN_ALLOWMULTISELECT | OFN_ENABLEHOOK;
|
|||
|
}
|
|||
|
|
|||
|
if (GetSaveFileNameA(&ofn) == TRUE)
|
|||
|
{
|
|||
|
SelectedPath = ofn.lpstrFile;
|
|||
|
return DialogResult::OK;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return DialogResult::Cancel;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
FolderBrowserDialog::FolderBrowserDialog()
|
|||
|
: ShowNewFolderButton(true),
|
|||
|
Multiselect(false)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
DialogResult FolderBrowserDialog::ShowDialog(HWND owner)
|
|||
|
{
|
|||
|
BROWSEINFOA bi = { 0 };
|
|||
|
bi.hwndOwner = owner;
|
|||
|
bi.pidlRoot = NULL;
|
|||
|
bi.pszDisplayName = NULL;
|
|||
|
bi.lpszTitle = Description.c_str();
|
|||
|
bi.ulFlags = BIF_RETURNONLYFSDIRS;
|
|||
|
if (ShowNewFolderButton)
|
|||
|
{
|
|||
|
bi.ulFlags |= BIF_NEWDIALOGSTYLE;
|
|||
|
}
|
|||
|
LPITEMIDLIST idl = SHBrowseForFolderA(&bi);
|
|||
|
if (idl == NULL)
|
|||
|
{
|
|||
|
return DialogResult::Cancel;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
char path[MAX_PATH] = { 0 };
|
|||
|
SHGetPathFromIDListA(idl, path);
|
|||
|
SelectedPath = path;
|
|||
|
return DialogResult::OK;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
ColorDialog::ColorDialog()
|
|||
|
: Color(RGB(0, 0, 0))
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
DialogResult ColorDialog::ShowDialog(HWND owner)
|
|||
|
{
|
|||
|
CHOOSECOLORA cc = { 0 };
|
|||
|
static COLORREF acrCustClr[16];
|
|||
|
cc.lStructSize = sizeof(cc);
|
|||
|
cc.hwndOwner = owner;
|
|||
|
cc.lpCustColors = (LPDWORD)acrCustClr;
|
|||
|
cc.rgbResult = Color;
|
|||
|
cc.Flags = CC_FULLOPEN | CC_RGBINIT;
|
|||
|
if (ChooseColorA(&cc))
|
|||
|
{
|
|||
|
Color = cc.rgbResult;
|
|||
|
return DialogResult::OK;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return DialogResult::Cancel;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
FontDialog::FontDialog()
|
|||
|
: FontSize(9),
|
|||
|
Color(RGB(0, 0, 0)),
|
|||
|
Bold(false),
|
|||
|
Italic(false),
|
|||
|
Underline(false),
|
|||
|
Strikeout(false)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 显示字体选择对话框并获取用户选择的字体信息。
|
|||
|
*
|
|||
|
* @param owner 窗口句柄,表示对话框的拥有者。
|
|||
|
* @return DialogResult 返回对话框的结果,成功时返回 DialogResult::OK,失败时返回 DialogResult::Cancel。
|
|||
|
*
|
|||
|
* @details 此函数使用 Windows API 的 ChooseFontA 函数显示字体选择对话框。
|
|||
|
* 用户选择的字体信息将被存储在 FontName、FontSize、Color 等成员变量中。
|
|||
|
* 函数还会根据用户选择的字体高度和屏幕 DPI 计算字体大小。
|
|||
|
*/
|
|||
|
DialogResult FontDialog::ShowDialog(HWND owner)
|
|||
|
{
|
|||
|
CHOOSEFONTA cf = {0};
|
|||
|
static LOGFONTA lf = { 0 };
|
|||
|
cf.lStructSize = sizeof(cf);
|
|||
|
cf.hwndOwner = owner;
|
|||
|
cf.lpLogFont = &lf;
|
|||
|
cf.rgbColors = Color;
|
|||
|
cf.Flags = CF_SCREENFONTS | CF_EFFECTS;
|
|||
|
if (ChooseFontA(&cf))
|
|||
|
{
|
|||
|
int fontSizeInPixels = abs(lf.lfHeight);
|
|||
|
int dpi = GetDeviceCaps(GetDC(cf.hwndOwner), LOGPIXELSY);
|
|||
|
int fontSize = MulDiv(fontSizeInPixels, 72, dpi);
|
|||
|
|
|||
|
FontName = lf.lfFaceName;
|
|||
|
FontSize = fontSize;
|
|||
|
Color = cf.rgbColors;
|
|||
|
Bold = lf.lfWeight == FW_BOLD;
|
|||
|
Italic = lf.lfItalic;
|
|||
|
Underline = lf.lfUnderline;
|
|||
|
Strikeout = lf.lfStrikeOut;
|
|||
|
return DialogResult::OK;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return DialogResult::Cancel;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
DialogResult MessageBox::Show(const std::string& text, const std::string& caption, UINT type)
|
|||
|
{
|
|||
|
return (DialogResult)MessageBoxA(GetTopMostWindowInCurrentProcess(), text.c_str(), caption.c_str(), type);
|
|||
|
}
|
|||
|
|
|||
|
DialogResult MessageBox::Show(const std::wstring& text, const std::wstring& caption, UINT type)
|
|||
|
{
|
|||
|
return (DialogResult)MessageBoxW(GetTopMostWindowInCurrentProcess(), text.c_str(), caption.c_str(), type);
|
|||
|
}
|