Skip to content

Commit

Permalink
improve
Browse files Browse the repository at this point in the history
  • Loading branch information
katahiromz committed Apr 2, 2024
1 parent 46f4503 commit 9251393
Show file tree
Hide file tree
Showing 4 changed files with 305 additions and 368 deletions.
370 changes: 4 additions & 366 deletions GUI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1480,68 +1480,6 @@ void __fastcall XgUpdateHints(void)
}
}

// ヒントの内容をメモ帳で開く。
bool XgOpenHintsByNotepad(HWND /*hwnd*/, bool bShowAnswer)
{
WCHAR szPath[MAX_PATH];
WCHAR szCmdLine[MAX_PATH * 2];
XGStringW str;
DWORD cb;
STARTUPINFOW si;
PROCESS_INFORMATION pi;

// 解がないときは、ヒントはない。
if (!xg_bSolved) {
::MessageBeep(0xFFFFFFFF);
return false;
}

// 一時ファイルを作成する。
::GetTempPathW(MAX_PATH, szPath);
StringCchCat(szPath, _countof(szPath), XgLoadStringDx1(IDS_HINTSTXT));
HANDLE hFile = ::CreateFileW(szPath, GENERIC_WRITE, FILE_SHARE_READ,
nullptr, CREATE_ALWAYS, 0, nullptr);
if (hFile == INVALID_HANDLE_VALUE)
return false;

// BOMとヒントの文字列をファイルに書き込む。
str = reinterpret_cast<LPCWSTR>("\xFF\xFE\x00");
str += L"\r\n";
XG_HintsWnd::UpdateHintData(); // ヒントに変更があれば、更新する。
XgGetHintsStr(xg_solution, xg_strHints, 2, true);
str += xg_strHints;
cb = static_cast<DWORD>(str.size() * sizeof(WCHAR));
if (::WriteFile(hFile, str.data(), cb, &cb, nullptr)) {
// ファイルを閉じる。
::CloseHandle(hFile);

// メモ帳でファイルを開く。
StringCchPrintf(szCmdLine, _countof(szCmdLine), XgLoadStringDx1(IDS_NOTEPAD), szPath);
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
if (::CreateProcessW(nullptr, szCmdLine, nullptr, nullptr, FALSE,
0, nullptr, nullptr, &si, &pi))
{
// メモ帳が待ち状態になるまで待つ。
if (::WaitForInputIdle(pi.hProcess, 5 * 1000) != WAIT_TIMEOUT) {
// 0.2秒待つ。
::Sleep(200);
// ファイルを削除する。
::DeleteFileW(szPath);
}
// ハンドルを閉じる。
::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
return true;
}
}
// ファイルを閉じる。
::CloseHandle(hFile);
return false;
}

//////////////////////////////////////////////////////////////////////////////

// 盤を特定の文字で埋め尽くす。
Expand Down Expand Up @@ -5625,308 +5563,8 @@ void __fastcall XgJumpNumber(HWND hwnd, INT nNumber, BOOL bVert)
SetFocus(hwnd);
}

// 全般設定の[ファイル]設定。
INT_PTR CALLBACK
FileSettingsDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
// チェックボックスを初期化。
if (xg_bShowAnswerOnOpen)
CheckDlgButton(hwnd, chx1, BST_CHECKED);
if (xg_bAutoSave)
CheckDlgButton(hwnd, chx2, BST_CHECKED);
if (xg_bShowAnswerOnGenerate)
CheckDlgButton(hwnd, chx3, BST_CHECKED);
// 保存先を初期化。
for (const auto& dir : xg_dirs_save_to) {
SendDlgItemMessage(hwnd, cmb1, CB_ADDSTRING, 0, (LPARAM)dir.c_str());
}
SendDlgItemMessage(hwnd, cmb1, CB_SETCURSEL, 0, 0);
// ドラッグ&ドロップを受け付ける。
DragAcceptFiles(hwnd, TRUE);
return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam))
{
case chx1:
case chx2:
case chx3:
if (HIWORD(wParam) == BN_CLICKED)
PropSheet_Changed(GetParent(hwnd), hwnd);
break;
case cmb1:
if (HIWORD(wParam) == CBN_EDITCHANGE ||
HIWORD(wParam) == CBN_SELCHANGE ||
HIWORD(wParam) == CBN_SELENDOK)
{
PropSheet_Changed(GetParent(hwnd), hwnd);
}
break;
case psh1: // 「参照」ボタン。
{
BROWSEINFOW bi = { hwnd };
bi.lpszTitle = XgLoadStringDx1(IDS_CROSSSTORAGE);
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = XgBrowseCallbackProc;
::GetDlgItemTextW(hwnd, cmb1, xg_szDir, _countof(xg_szDir));
{
LPITEMIDLIST pidl = ::SHBrowseForFolderW(&bi);
if (pidl) {
WCHAR szFile[MAX_PATH];
::SHGetPathFromIDListW(pidl, szFile);
::SetDlgItemTextW(hwnd, cmb1, szFile);
::CoTaskMemFree(pidl);
PropSheet_Changed(GetParent(hwnd), hwnd);
}
}
}
break;
case psh2: // 「フォルダを開く」ボタン。
::GetDlgItemTextW(hwnd, cmb1, xg_szDir, _countof(xg_szDir));
::ShellExecuteW(hwnd, NULL, xg_szDir, NULL, NULL, SW_SHOWNORMAL);
break;
}
break;

case WM_DROPFILES:
{
HDROP hDrop = (HDROP)wParam;
DragQueryFileW(hDrop, 0, xg_szDir, _countof(xg_szDir));
if (PathIsDirectoryW(xg_szDir))
{
::SetDlgItemTextW(hwnd, cmb1, xg_szDir);
PropSheet_Changed(GetParent(hwnd), hwnd);
}
}
break;

case WM_NOTIFY:
{
NMHDR *pnmhdr = (NMHDR *)lParam;
switch (pnmhdr->code) {
case PSN_APPLY: // 適用
{
// チェックボックスから設定を取得する。
xg_bShowAnswerOnOpen = (IsDlgButtonChecked(hwnd, chx1) == BST_CHECKED);
xg_bAutoSave = (IsDlgButtonChecked(hwnd, chx2) == BST_CHECKED);
xg_bShowAnswerOnGenerate = (IsDlgButtonChecked(hwnd, chx3) == BST_CHECKED);

// テキストを取得する。
WCHAR szFile[MAX_PATH];
::GetDlgItemTextW(hwnd, cmb1, szFile, _countof(szFile));

// 一致する項目を削除する。
INT i = 0;
for (const auto& dir : xg_dirs_save_to) {
if (lstrcmpiW(dir.c_str(), szFile) == 0) {
xg_dirs_save_to.erase(xg_dirs_save_to.begin() + i);
break;
}
++i;
}

// 先頭に挿入。
xg_dirs_save_to.insert(xg_dirs_save_to.begin(), szFile);
}
break;
}
}
break;
}
return 0;
}

// 全般設定の[表示]設定。
INT_PTR CALLBACK
ViewSettingsDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static XGStringW s_strFit;

switch (uMsg)
{
case WM_INITDIALOG:
// チェックボックスを初期化。
if (xg_bShowToolBar)
::CheckDlgButton(hwnd, chx1, BST_CHECKED);
if (s_bShowStatusBar)
::CheckDlgButton(hwnd, chx2, BST_CHECKED);
if (::IsWindow(xg_hwndInputPalette))
::CheckDlgButton(hwnd, chx3, BST_CHECKED);
if (::IsWindow(xg_hHintsWnd))
::CheckDlgButton(hwnd, chx4, BST_CHECKED);
if (xg_bShowAnswer)
::CheckDlgButton(hwnd, chx5, BST_CHECKED);
if (xg_bShowNumbering)
::CheckDlgButton(hwnd, chx6, BST_CHECKED);
if (xg_bShowCaret)
::CheckDlgButton(hwnd, chx7, BST_CHECKED);
if (xg_bShowDoubleFrame)
::CheckDlgButton(hwnd, chx8, BST_CHECKED);
if (xg_bShowDoubleFrameLetters)
::CheckDlgButton(hwnd, chx9, BST_CHECKED);
if (xg_nViewMode == XG_VIEW_SKELETON)
::CheckDlgButton(hwnd, chx10, BST_CHECKED);
if (xg_bNumCroMode)
::CheckDlgButton(hwnd, chx11, BST_CHECKED);
if (xg_bLowercase)
::CheckDlgButton(hwnd, chx12, BST_CHECKED);
if (xg_bHiragana)
::CheckDlgButton(hwnd, chx13, BST_CHECKED);
if (xg_bCheckingAnswer)
::CheckDlgButton(hwnd, chx14, BST_CHECKED);
if (!xg_bSolved) {
::EnableWindow(::GetDlgItem(hwnd, chx4), FALSE);
::EnableWindow(::GetDlgItem(hwnd, chx5), FALSE);
::EnableWindow(::GetDlgItem(hwnd, chx14), FALSE);
}
// ズームを初期化。
s_strFit = XgLoadStringDx1(IDS_FITWHOLE);
::SendDlgItemMessageW(hwnd, cmb1, CB_ADDSTRING, 0, (LPARAM)s_strFit.c_str());
::SendDlgItemMessageW(hwnd, cmb1, CB_ADDSTRING, 0, (LPARAM)L"10 %");
::SendDlgItemMessageW(hwnd, cmb1, CB_ADDSTRING, 0, (LPARAM)L"30 %");
::SendDlgItemMessageW(hwnd, cmb1, CB_ADDSTRING, 0, (LPARAM)L"50 %");
::SendDlgItemMessageW(hwnd, cmb1, CB_ADDSTRING, 0, (LPARAM)L"65 %");
::SendDlgItemMessageW(hwnd, cmb1, CB_ADDSTRING, 0, (LPARAM)L"80 %");
::SendDlgItemMessageW(hwnd, cmb1, CB_ADDSTRING, 0, (LPARAM)L"90 %");
::SendDlgItemMessageW(hwnd, cmb1, CB_ADDSTRING, 0, (LPARAM)L"100 %");
::SendDlgItemMessageW(hwnd, cmb1, CB_ADDSTRING, 0, (LPARAM)L"200 %");
::SendDlgItemMessageW(hwnd, cmb1, CB_ADDSTRING, 0, (LPARAM)L"300 %");
::SetDlgItemTextW(hwnd, cmb1, (to_XGStringW(xg_nZoomRate) + L" %").c_str());
return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam))
{
case chx1:
case chx2:
case chx3:
case chx4:
case chx5:
case chx6:
case chx7:
case chx8:
case chx9:
case chx10:
case chx11:
case chx12:
case chx13:
case chx14:
if (HIWORD(wParam) == BN_CLICKED)
PropSheet_Changed(GetParent(hwnd), hwnd);
break;
case cmb1:
if (HIWORD(wParam) == CBN_EDITCHANGE ||
HIWORD(wParam) == CBN_SELCHANGE ||
HIWORD(wParam) == CBN_SELENDOK)
{
PropSheet_Changed(GetParent(hwnd), hwnd);
}
}
break;

case WM_NOTIFY:
{
NMHDR *pnmhdr = (NMHDR *)lParam;
switch (pnmhdr->code) {
case PSN_APPLY: // 適用
{
// 元に戻す情報を取得。
auto sa1 = std::make_shared<XG_UndoData_SetAll>();
sa1->Get();

// チェックボックスから設定を取得する。
xg_bShowToolBar = (::IsDlgButtonChecked(hwnd, chx1) == BST_CHECKED);
s_bShowStatusBar = (::IsDlgButtonChecked(hwnd, chx2) == BST_CHECKED);
BOOL bInputPalette = (::IsDlgButtonChecked(hwnd, chx3) == BST_CHECKED);
BOOL bHintsWnd = (::IsDlgButtonChecked(hwnd, chx4) == BST_CHECKED);
xg_bShowAnswer = (::IsDlgButtonChecked(hwnd, chx5) == BST_CHECKED);
xg_bShowNumbering = (::IsDlgButtonChecked(hwnd, chx6) == BST_CHECKED);
xg_bShowCaret = (::IsDlgButtonChecked(hwnd, chx7) == BST_CHECKED);
xg_bShowDoubleFrame = (::IsDlgButtonChecked(hwnd, chx8) == BST_CHECKED);
xg_bShowDoubleFrameLetters = (::IsDlgButtonChecked(hwnd, chx9) == BST_CHECKED);
xg_nViewMode = ((::IsDlgButtonChecked(hwnd, chx10) == BST_CHECKED) ? XG_VIEW_SKELETON : XG_VIEW_NORMAL);
xg_bNumCroMode = (::IsDlgButtonChecked(hwnd, chx11) == BST_CHECKED);
xg_bLowercase = (::IsDlgButtonChecked(hwnd, chx12) == BST_CHECKED);
xg_bHiragana = (::IsDlgButtonChecked(hwnd, chx13) == BST_CHECKED);
xg_bCheckingAnswer = (::IsDlgButtonChecked(hwnd, chx14) == BST_CHECKED);

// コンボボックスの設定を適用する。
WCHAR szText[128];
::GetDlgItemTextW(hwnd, cmb1, szText, _countof(szText));
if (s_strFit == szText) {
::SendMessageW(xg_hMainWnd, WM_COMMAND, ID_FITZOOM, 0);
} else {
WCHAR szText2[128];
::LCMapStringW(::GetUserDefaultLCID(), LCMAP_HALFWIDTH, szText, _countof(szText),
szText2, _countof(szText2));
StrTrimW(szText2, L" \t\r\n\x3000");
INT nRate = _wtoi(szText2);
if (nRate == 0)
nRate = 100;
if (nRate < 10)
nRate = 10;
if (nRate > 300)
nRate = 300;
XgSetZoomRate(xg_hMainWnd, nRate);
}

if (xg_bShowToolBar)
::ShowWindow(xg_hToolBar, SW_SHOWNOACTIVATE);
else
::ShowWindow(xg_hToolBar, SW_HIDE);

if (s_bShowStatusBar)
ShowWindow(xg_hStatusBar, SW_SHOWNOACTIVATE);
else
ShowWindow(xg_hStatusBar, SW_HIDE);

if (bInputPalette) {
if (!::IsWindow(xg_hwndInputPalette))
XgCreateInputPalette(xg_hMainWnd);
} else {
if (::IsWindow(xg_hwndInputPalette))
XgDestroyInputPalette();
}

if (bHintsWnd) {
if (!::IsWindow(xg_hHintsWnd)) {
XgShowHints(xg_hMainWnd);
xg_bShowClues = TRUE;
}
} else {
if (::IsWindow(xg_hHintsWnd)) {
::DestroyWindow(xg_hHintsWnd);
xg_hHintsWnd = nullptr;
}
xg_bShowClues = FALSE;
}

if (xg_bNumCroMode) {
XgMakeItNumCro(hwnd);
} else {
xg_mapNumCro1.clear();
xg_mapNumCro2.clear();
}

// 元に戻す情報を確定。
auto sa2 = std::make_shared<XG_UndoData_SetAll>();
sa2->Get();
xg_ubUndoBuffer.Commit(UC_SETALL, sa1, sa2);

// 表示を更新。
XgUpdateImage(xg_hMainWnd);
SendMessageW(xg_hMainWnd, WM_SIZE, 0, 0);
}
break;
}
}
break;
}
return 0;
}
#include "XgFileSettings.cpp"
#include "XgViewSettings.cpp"

// 全般設定。
void XgGeneralSettings(HWND hwnd, INT nStartPage = 0)
Expand All @@ -5937,14 +5575,14 @@ void XgGeneralSettings(HWND hwnd, INT nStartPage = 0)

// 「ファイル」設定。
psp.pszTemplate = MAKEINTRESOURCEW(IDD_FILESETTINGS);
psp.pfnDlgProc = FileSettingsDlgProc;
psp.pfnDlgProc = XgFileSettingsDlgProc;
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = xg_hInstance;
hpsp[iPage++] = ::CreatePropertySheetPageW(&psp);

// 「表示」設定。
psp.pszTemplate = MAKEINTRESOURCEW(IDD_VIEWSETTINGS);
psp.pfnDlgProc = ViewSettingsDlgProc;
psp.pfnDlgProc = XgViewSettingsDlgProc;
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = xg_hInstance;
hpsp[iPage++] = ::CreatePropertySheetPageW(&psp);
Expand Down
Loading

0 comments on commit 9251393

Please sign in to comment.