From 9251393194f959fbce76a93625c50d4c9171cc02 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Tue, 2 Apr 2024 17:10:46 +0900 Subject: [PATCH] improve --- GUI.cpp | 370 +-------------------------------------------- GUI.hpp | 2 - XgFileSettings.cpp | 113 ++++++++++++++ XgViewSettings.cpp | 188 +++++++++++++++++++++++ 4 files changed, 305 insertions(+), 368 deletions(-) create mode 100644 XgFileSettings.cpp create mode 100644 XgViewSettings.cpp diff --git a/GUI.cpp b/GUI.cpp index 6650bf0..154dcae 100644 --- a/GUI.cpp +++ b/GUI.cpp @@ -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("\xFF\xFE\x00"); - str += L"\r\n"; - XG_HintsWnd::UpdateHintData(); // ヒントに変更があれば、更新する。 - XgGetHintsStr(xg_solution, xg_strHints, 2, true); - str += xg_strHints; - cb = static_cast(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; -} - ////////////////////////////////////////////////////////////////////////////// // 盤を特定の文字で埋め尽くす。 @@ -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(); - 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(); - 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) @@ -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); diff --git a/GUI.hpp b/GUI.hpp index c531a1c..d494f9f 100644 --- a/GUI.hpp +++ b/GUI.hpp @@ -14,8 +14,6 @@ void XgDestroyHintsWnd(void) noexcept; bool XgOpenHintsByWindow(HWND /*hwnd*/); // ヒントを表示する。 void XgShowHints(HWND hwnd); -// ヒントの内容をメモ帳で開く。 -bool XgOpenHintsByNotepad(HWND /*hwnd*/, bool bShowAnswer); // ヒントを表示するかどうか。 extern BOOL xg_bShowClues; diff --git a/XgFileSettings.cpp b/XgFileSettings.cpp new file mode 100644 index 0000000..dd2ff74 --- /dev/null +++ b/XgFileSettings.cpp @@ -0,0 +1,113 @@ +// [ファイル]設定。 +INT_PTR CALLBACK +XgFileSettingsDlgProc(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; +} diff --git a/XgViewSettings.cpp b/XgViewSettings.cpp new file mode 100644 index 0000000..99455ac --- /dev/null +++ b/XgViewSettings.cpp @@ -0,0 +1,188 @@ +// [表示]設定。 +INT_PTR CALLBACK +XgViewSettingsDlgProc(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(); + 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(); + sa2->Get(); + xg_ubUndoBuffer.Commit(UC_SETALL, sa1, sa2); + + // 表示を更新。 + XgUpdateImage(xg_hMainWnd); + SendMessageW(xg_hMainWnd, WM_SIZE, 0, 0); + } + break; + } + } + break; + } + return 0; +}