From e8433042d6047d99b001c61ea4ff352005ff909b Mon Sep 17 00:00:00 2001 From: inovia Date: Tue, 2 Jan 2024 15:40:07 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=BB=E3=82=A8=E3=82=A2=E3=83=AD=E3=82=B9?= =?UTF-8?q?=E3=83=8A=E3=83=83=E3=83=97=E3=81=AE=E7=B7=A9=E5=92=8C=E7=AD=96?= =?UTF-8?q?=E3=82=92=E9=81=A9=E7=94=A8=20=E3=83=BB=E3=82=A2=E3=82=A4?= =?UTF-8?q?=E3=82=B3=E3=83=B3=E3=82=B3=E3=83=B3=E3=83=90=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=81=AE=E3=83=AA=E3=82=B5=E3=82=A4=E3=82=BA=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=81=8C=E5=8B=95=E4=BD=9C=E3=81=97=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E3=81=AE=E3=81=A7=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20=E3=83=BBHSP=E3=81=AE=E3=83=A1=E3=83=8B=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E7=B3=BB=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE?= =?UTF-8?q?=E3=82=B3=E3=83=9F=E3=83=83=E3=83=88=E5=BF=98=E3=82=8C=20?= =?UTF-8?q?=E3=83=BB=E3=83=80=E3=83=BC=E3=82=AF=E3=83=A2=E3=83=BC=E3=83=89?= =?UTF-8?q?=E6=99=82=E3=81=AE=E3=82=B9=E3=83=86=E3=83=BC=E3=82=BF=E3=82=B9?= =?UTF-8?q?=E3=83=90=E3=83=BC=E3=81=AE=E6=8F=8F=E7=94=BB=E4=B8=8D=E5=85=B7?= =?UTF-8?q?=E5=90=88=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iconcnv/iconcnv.cpp | 7 +++ sakura_core/_main/WinMain.cpp | 4 ++ sakura_core/config/system_constants.h | 7 +++ sakura_core/env/CShareData.cpp | 1 + sakura_core/env/CShareData_IO.cpp | 3 + sakura_core/env/CommonSetting.h | 3 +- sakura_core/hsp/CHsp3.cpp | 4 +- sakura_core/hsp/CHsp3.h | 10 ++++ sakura_core/hsp/CHsp3MenuItemParser.cpp | 76 +++++++++++++++++++++++++ sakura_core/hsp/CHsp3MenuItemParser.h | 36 ++++++++++++ sakura_core/prop/CPropComHSP.cpp | 6 ++ sakura_core/sakura_rc.h | 2 +- sakura_core/sakura_rc.rc | 42 ++++++++------ sakura_core/window/CEditWnd.cpp | 69 +++++++++++++--------- sakura_core/window/CMainStatusBar.cpp | 9 +++ sakura_core/window/CMainStatusBar.h | 29 ++++++++++ 16 files changed, 260 insertions(+), 48 deletions(-) create mode 100644 sakura_core/hsp/CHsp3MenuItemParser.cpp create mode 100644 sakura_core/hsp/CHsp3MenuItemParser.h diff --git a/iconcnv/iconcnv.cpp b/iconcnv/iconcnv.cpp index a10851a939..f04a3b832a 100644 --- a/iconcnv/iconcnv.cpp +++ b/iconcnv/iconcnv.cpp @@ -113,6 +113,13 @@ vector ConvertImageToARGB( ::GlobalUnlock(hg); } stream->Release(); + + //// Debug + //pBitmap->Save(L"C:\\Temp\\test.png", &pngClsid, nullptr); + + //std::ofstream file(L"C:\\Temp\\test2.png", std::ios::out | std::ios::binary); + //file.write(reinterpret_cast(pngData.data()), pngData.size()); + //file.close(); } return pngData; diff --git a/sakura_core/_main/WinMain.cpp b/sakura_core/_main/WinMain.cpp index 449551a0ef..339006fc17 100644 --- a/sakura_core/_main/WinMain.cpp +++ b/sakura_core/_main/WinMain.cpp @@ -33,6 +33,7 @@ #include "util/std_macro.h" #include "env/DLLSHAREDATA.h" #include "hsp/CHsp3DarkMode.h" +#include "config/system_constants.h" /*! Windows Entry point @@ -77,6 +78,9 @@ int WINAPI wWinMain( CHsp3DarkMode::PreferredAppMode::APPMODE_ALLOWDARK); DarkMode.RefreshImmersiveColorPolicyState(); } + + // AppUserModelID + ::SetCurrentProcessExplicitAppUserModelID( GSTR_APP_USER_MODEL_ID); } //開発情報 diff --git a/sakura_core/config/system_constants.h b/sakura_core/config/system_constants.h index cbced7cf59..927d984765 100644 --- a/sakura_core/config/system_constants.h +++ b/sakura_core/config/system_constants.h @@ -604,6 +604,13 @@ //! ビュー #define GSTR_VIEWNAME (L"HSPSakuraEditorSakuraView" _T(STR_SHAREDATA_VERSION)) +// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // +// AppUserModelID // +// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // + +//! AppUserModelID +#define GSTR_APP_USER_MODEL_ID (L"HSPSakuraEditor.Id" _T(CON_SKR_MACHINE_SUFFIX_) _T(_CODE_SUFFIX_) _T(_DEBUG_SUFFIX_) _T(STR_SHAREDATA_VERSION)) + // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // リソース // // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // diff --git a/sakura_core/env/CShareData.cpp b/sakura_core/env/CShareData.cpp index 0cf0a4563d..3cc15ebe64 100644 --- a/sakura_core/env/CShareData.cpp +++ b/sakura_core/env/CShareData.cpp @@ -683,6 +683,7 @@ bool CShareData::InitShareData() sHSP.m_bHspAssistantAutoStartEnabled = true; sHSP.m_bUseLegacyLabelAnalysis = false; sHSP.m_bAutoSaveBeforeCompile = false; + sHSP.m_bAeroSnapMitigation = false; sHSP.m_bShowDebugWindow = false; sHSP.m_szCommandLineOption[0] = L'\0'; sHSP.m_szExecuteExternalFile_Name[0] = L'\0'; diff --git a/sakura_core/env/CShareData_IO.cpp b/sakura_core/env/CShareData_IO.cpp index ac22296c43..36d94980fa 100644 --- a/sakura_core/env/CShareData_IO.cpp +++ b/sakura_core/env/CShareData_IO.cpp @@ -2315,6 +2315,8 @@ void CShareData_IO::IO_HSP(CDataProfile& cProfile, CommonSetting_HSP& hsp) hsp.m_bUseLegacyLabelAnalysis = false; if (!cProfile.IOProfileData(pszSecName, LTEXT("AutoSaveBeforeCompile"), hsp.m_bAutoSaveBeforeCompile)) hsp.m_bAutoSaveBeforeCompile = false; + if (!cProfile.IOProfileData(pszSecName, LTEXT("AeroSnapMitigation"), hsp.m_bAeroSnapMitigation)) + hsp.m_bAeroSnapMitigation = false; } else { @@ -2323,6 +2325,7 @@ void CShareData_IO::IO_HSP(CDataProfile& cProfile, CommonSetting_HSP& hsp) cProfile.IOProfileData(pszSecName, LTEXT("AssistantAutoStartEnabled"), hsp.m_bHspAssistantAutoStartEnabled); cProfile.IOProfileData(pszSecName, LTEXT("UseLegacyLabelAnalysis"), hsp.m_bUseLegacyLabelAnalysis); cProfile.IOProfileData(pszSecName, LTEXT("AutoSaveBeforeCompile"), hsp.m_bAutoSaveBeforeCompile); + cProfile.IOProfileData(pszSecName, LTEXT("AeroSnapMitigation"), hsp.m_bAeroSnapMitigation); } } diff --git a/sakura_core/env/CommonSetting.h b/sakura_core/env/CommonSetting.h index 8b2bf2cea5..17c5adb75e 100644 --- a/sakura_core/env/CommonSetting.h +++ b/sakura_core/env/CommonSetting.h @@ -726,7 +726,8 @@ struct CommonSetting_HSP bool m_bUseLegacyLabelAnalysis; //!< 従来方式のラベル解析を優先する(HSP 3.6互換) bool m_bAutoSaveBeforeCompile; //!< コンパイル時、未保存のファイルを自動保存する bool m_bHspAssistantAutoStartFlag; //!< (未保存)HSPアシスタントを自動起動管理フラグ(別プロセスでstaticできないのでここで) - bool m_PADDING[1]; //!< (未保存)未使用: Padding領域 + bool m_bAeroSnapMitigation; //!< エアロスナップの緩和策を適用する + bool m_PADDING[256]; //!< (未保存)未使用: Padding領域 }; // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // diff --git a/sakura_core/hsp/CHsp3.cpp b/sakura_core/hsp/CHsp3.cpp index 3924d304a1..524cf42810 100644 --- a/sakura_core/hsp/CHsp3.cpp +++ b/sakura_core/hsp/CHsp3.cpp @@ -961,10 +961,10 @@ bool CHsp3::RunIconConverter(HWND hParent) const args += L"/OUTPUT \"" + fileSavePath + L"\" "; // /RESIZE フラグを追加 - args += L"/RESIZE"; + args += L"/RESIZE "; // /FORCE32BIT フラグを追加 - args += L"/FORCE32BIT"; + args += L"/FORCE32BIT "; } // 実行 diff --git a/sakura_core/hsp/CHsp3.h b/sakura_core/hsp/CHsp3.h index 7d297f4916..e7227fe12a 100644 --- a/sakura_core/hsp/CHsp3.h +++ b/sakura_core/hsp/CHsp3.h @@ -191,6 +191,16 @@ class CHsp3 GetDllShareData().m_Common.m_sHSP.m_bAutoSaveBeforeCompile = bAutoSaveBeforeCompile; } + inline const bool IsAeroSnapMitigation() const + { + return GetDllShareData().m_Common.m_sHSP.m_bAeroSnapMitigation; + } + + inline void SetAeroSnapMitigation(bool bAeroSnapMitigation) const + { + GetDllShareData().m_Common.m_sHSP.m_bAutoSaveBeforeCompile = bAeroSnapMitigation; + } + bool InitKeyword(CKeyWordSetMgr& keywordMgr) const; private: diff --git a/sakura_core/hsp/CHsp3MenuItemParser.cpp b/sakura_core/hsp/CHsp3MenuItemParser.cpp new file mode 100644 index 0000000000..5828e49eb6 --- /dev/null +++ b/sakura_core/hsp/CHsp3MenuItemParser.cpp @@ -0,0 +1,76 @@ +// CHsp3MenuItemParser.cpp + +#include "StdAfx.h" +#include "CHsp3MenuItemParser.h" +#include +#include +#include + +// 文字列の先頭と末尾のスペースやタブを除去する関数 +std::wstring CHsp3MenuItemParser::trim(const std::wstring& str) +{ + size_t first = str.find_first_not_of(L" \t"); + if (first == std::wstring::npos) return L""; + size_t last = str.find_last_not_of(L" \t"); + return str.substr(first, (last - first + 1)); +} + +// CSVファイルをパースする関数 +ErrorCode CHsp3MenuItemParser::parse(const std::wstring& filePath, std::vector& items) +{ + // Shift_JISでファイルを開く + std::ifstream file(filePath, std::ios::binary); + if (!file.is_open()) + { + return FILE_OPEN_ERROR; // ファイルが開けなかった場合はエラーコードを返す + } + + // ファイルの内容をShift_JISで読み取る + std::string sjisContent((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + file.close(); + + // Shift_JISからUTF-16に変換 + int requiredSize = MultiByteToWideChar( + CP_ACP, 0, sjisContent.c_str(), sjisContent.size(), nullptr, 0); + std::wstring utf16Content(requiredSize, 0); + MultiByteToWideChar( + CP_ACP, 0, sjisContent.c_str(), sjisContent.size(), &utf16Content[0], requiredSize); + + // 各行をパースする + std::wstringstream ss(utf16Content); + std::wstring line; + while (std::getline(ss, line, L'\n')) + { + // CRLFの場合、'\r'を除去する + if (!line.empty() && line.back() == L'\r') + { + line.pop_back(); + } + + // 各行のカンマの数をチェック + size_t numCommas = std::count(line.begin(), line.end(), L','); + if (numCommas != 2) + { + return PARSE_ERROR; // カンマの数が想定と異なる場合はエラーを返す + } + + std::wstringstream lineStream(line); + std::wstring menuName, runtimeName, axFileName; + + // カンマで区切られた各項目を取得 + if (!std::getline(lineStream, menuName, L',') || + !std::getline(lineStream, runtimeName, L',') || + !std::getline(lineStream, axFileName, L',')) + { + return PARSE_ERROR; // 項目の取得に失敗した場合はエラーを返す + } + + // トリムして結果のベクタに追加 + items.push_back( + { + trim(menuName), trim(runtimeName), trim(axFileName) + }); + } + + return SUCCESS; // 正常に終了 +} \ No newline at end of file diff --git a/sakura_core/hsp/CHsp3MenuItemParser.h b/sakura_core/hsp/CHsp3MenuItemParser.h new file mode 100644 index 0000000000..a8335fbba1 --- /dev/null +++ b/sakura_core/hsp/CHsp3MenuItemParser.h @@ -0,0 +1,36 @@ +// CHsp3MenuItemParser.h + +#pragma once + +#include +#include +#include + +// メニューアイテムを表す構造体 +struct MenuItem +{ + // もし、メンバを入れ替える際は注意してください。 + // C++20 以前の構造体の初期化を使っているところがあります。 + + std::wstring menuName; // メニュー名 + std::wstring runtimeName; // ランタイム名 + std::wstring axFileName; // AXファイル名 +}; + +// エラーコードの列挙型 +enum ErrorCode +{ + SUCCESS = 0, // 成功 + FILE_OPEN_ERROR, // ファイルオープンのエラー + FILE_READ_ERROR, // ファイルの読み取りエラー + PARSE_ERROR // パースのエラー +}; + +class CHsp3MenuItemParser +{ +public: + ErrorCode parse(const std::wstring& filePath, std::vector& items); + +private: + std::wstring trim(const std::wstring& str); +}; \ No newline at end of file diff --git a/sakura_core/prop/CPropComHSP.cpp b/sakura_core/prop/CPropComHSP.cpp index 05ea192175..34d63a4020 100644 --- a/sakura_core/prop/CPropComHSP.cpp +++ b/sakura_core/prop/CPropComHSP.cpp @@ -111,6 +111,9 @@ void CPropHSP::SetData( HWND hwndDlg ) /* コンパイル時、未保存のファイルを自動保存する(&S) */ ::CheckDlgButtonBool(hwndDlg, IDC_CHECK_bAutoSaveBeforeCompile, m_Common.m_sHSP.m_bAutoSaveBeforeCompile); + + /* エアロスナップの緩和策を適用する(&M) */ + ::CheckDlgButtonBool(hwndDlg, IDC_CHECK_bAeroSnapMitigation, m_Common.m_sHSP.m_bAeroSnapMitigation); return; } @@ -130,5 +133,8 @@ int CPropHSP::GetData( HWND hwndDlg ) /* コンパイル時、未保存のファイルを自動保存する(&S) */ m_Common.m_sHSP.m_bAutoSaveBeforeCompile = ::IsDlgButtonCheckedBool(hwndDlg, IDC_CHECK_bAutoSaveBeforeCompile); + /* エアロスナップの緩和策を適用する(&M) */ + m_Common.m_sHSP.m_bAeroSnapMitigation = ::IsDlgButtonCheckedBool(hwndDlg, IDC_CHECK_bAeroSnapMitigation); + return TRUE; } diff --git a/sakura_core/sakura_rc.h b/sakura_core/sakura_rc.h index 3383058214..2a312dfeca 100644 --- a/sakura_core/sakura_rc.h +++ b/sakura_core/sakura_rc.h @@ -797,8 +797,8 @@ #define IDC_HSP_CHECK2 1740 #define IDC_CHECK_bAutoRunHSPAssistant 1740 #define IDC_CHECK_bUseLegacyLabelAnalysis 1741 -#define IDC_CHECK_bUseLegacyLabelAnalysis2 1742 #define IDC_CHECK_bAutoSaveBeforeCompile 1742 +#define IDC_CHECK_bAeroSnapMitigation 1743 #define IDS_AUTHOR_PAGE 4054 #define IDS_ABOUT_DESCRIPTION 4056 #define IDD_TYPELIST 5000 diff --git a/sakura_core/sakura_rc.rc b/sakura_core/sakura_rc.rc index 813ba944be..a59aa9fb50 100644 --- a/sakura_core/sakura_rc.rc +++ b/sakura_core/sakura_rc.rc @@ -1731,11 +1731,13 @@ FONT 9, "MS Pゴシック", 0, 0, 0x1 BEGIN CONTROL "HSPアシスタントを自動起動する(&A)",IDC_CHECK_bAutoRunHSPAssistant, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,14,206,10 - GROUPBOX "",-1,3,3,218,66,WS_GROUP + GROUPBOX "",-1,3,3,218,118,WS_GROUP CONTROL "従来方式のラベル解析を優先する(HSP 3.6互換)(&L)",IDC_CHECK_bUseLegacyLabelAnalysis, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,29,205,10 CONTROL "コンパイル時、未保存のファイルを自動保存する(&S)",IDC_CHECK_bAutoSaveBeforeCompile, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,43,205,10 + CONTROL "エアロスナップの緩和策を適用する(&M)",IDC_CHECK_bAeroSnapMitigation, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,57,205,10 END @@ -2421,9 +2423,24 @@ BEGIN F_OPEN_POWERSHELL_AS_ADMIN "管理者としてPowerShellを開く" F_HSP_LABEL_LIST "HSPのラベル・関数一覧..." F_HSP_COMPILE_RUN "コンパイル + 実行" +END + +STRINGTABLE +BEGIN + F_HSP_OPEN_PAINT_TOOL "ペイントツールを開く..." + F_HSP_SEARCH_KEYWORD "HSPキーワード検索..." + F_HSP_OPEN_PG_MANUAL "HSPプログラミング・マニュアルを開く..." + F_HSP_OPEN_FUNC_REF "HSP命令リファレンスを開く..." + F_HSP_OPEN_MANUAL_INDEX "HSPマニュアル目次..." + F_HSP_OPEN_HELP_SOURCE_EDITOR "Help Source Editorを開く..." + F_HSP_RUN_ICON_CONVERTER "アイコンコンバーター起動..." F_HSP_OPEN_DOCUMENT "ドキュメントを開く" F_HSP_JUMP_DEFINITION "定義へ移動" F_HSP_JUMP_ALL_REFERENCES "すべての参照を検索" + F_HSP_RUN_HSP3_UPDATER "機能の追加と削除..." + F_CUSTMENU_1 "カスタムメニュー1" + F_CUSTMENU_2 "カスタムメニュー2" + F_CUSTMENU_3 "カスタムメニュー3" END STRINGTABLE @@ -2972,21 +2989,6 @@ BEGIN F_HSP_OPEN_HGIMG4_TOOL "HGIMG4ツールを開く..." END -STRINGTABLE -BEGIN - F_HSP_OPEN_PAINT_TOOL "ペイントツールを開く..." - F_HSP_SEARCH_KEYWORD "HSPキーワード検索..." - F_HSP_OPEN_PG_MANUAL "HSPプログラミング・マニュアルを開く..." - F_HSP_OPEN_FUNC_REF "HSP命令リファレンスを開く..." - F_HSP_OPEN_MANUAL_INDEX "HSPマニュアル目次..." - F_HSP_OPEN_HELP_SOURCE_EDITOR "Help Source Editorを開く..." - F_HSP_RUN_ICON_CONVERTER "アイコンコンバーター起動..." - F_HSP_RUN_HSP3_UPDATER "機能の追加と削除..." - F_CUSTMENU_1 "カスタムメニュー1" - F_CUSTMENU_2 "カスタムメニュー2" - F_CUSTMENU_3 "カスタムメニュー3" -END - STRINGTABLE BEGIN F_MENU_RBUTTON "右クリックメニュー" @@ -3040,7 +3042,7 @@ BEGIN F_CUSTMENU_LIST "カスタムメニューリスト" F_USERMACRO_LIST "登録済みマクロリスト" F_PLUGIN_LIST "プラグインコマンドリスト" - F_HSPINIMENU_LIST "HSP用Menu.txtリスト" + F_HSPINIMENU_LIST "HSP用Menu.txtリスト" END STRINGTABLE @@ -3895,7 +3897,11 @@ BEGIN STR_PROPCOMMON_EDITING "編集" STR_PROPCOMMON_FILE "ファイル" STR_PROPCOMMON_BACKUP "バックアップ" - STR_PROPCOMMON_HSP "HSP" +END + +STRINGTABLE +BEGIN + STR_PROPCOMMON_HSP "HSP" END STRINGTABLE diff --git a/sakura_core/window/CEditWnd.cpp b/sakura_core/window/CEditWnd.cpp index 68fe8ca4b6..50bb72ca43 100644 --- a/sakura_core/window/CEditWnd.cpp +++ b/sakura_core/window/CEditWnd.cpp @@ -661,14 +661,6 @@ HWND CEditWnd::Create( DarkMode.SetDarkModeTitleBar19(hWnd); DarkMode.SetDarkModeTitleBar(hWnd); } - //::SetClassLongPtr( hWnd, GCLP_HBRBACKGROUND, (LONG_PTR)::GetStockObject(BLACK_BRUSH)); - //DarkMode.SetDarkModeHwnd(hWnd); - //DarkMode.SetPreferredAppMode(CHsp3DarkMode::APPMODE_ALLOWDARK); - //DarkMode.FlushMenuThemes(); - //DarkMode.RefreshImmersiveColorPolicyState(); - - //DarkMode.AllowDarkModeForWindow(hWnd, true); - //DarkMode.SetDarkModeHwnd(hWnd); // 初回アイドリング検出用のゼロ秒タイマーをセットする // 2008.04.19 ryoji // ゼロ秒タイマーが発動(初回アイドリング検出)したら MYWM_FIRST_IDLE を起動元プロセスにポストする。 @@ -1281,28 +1273,15 @@ LRESULT CEditWnd::DispatchEvent( if ( DarkMode.IsSystemUseDarkMode()) { - // ステータスバーの指定した項目が SBT_OWNERDRAW かどうかを確認 - LPARAM result = SendMessage(lpdis->hwndItem, SB_GETTEXTLENGTH, (WPARAM)lpdis->itemID, 0); - // auto bOwnerDraw = HIWORD(result) & SBT_OWNERDRAW; - if (lpdis->itemID != 5/* && (lpdis->itemAction & ODA_DRAWENTIRE) == ODA_DRAWENTIRE*/) { - ::SetTextColor(lpdis->hDC, DarkMode.GetSysColor(COLOR_BTNTEXT)); - ::SetBkMode(lpdis->hDC, TRANSPARENT); + ::SetTextColor( lpdis->hDC, DarkMode.GetSysColor(COLOR_BTNTEXT)); + ::SetBkMode( lpdis->hDC, TRANSPARENT); // テキストを取得 - LPCTSTR lpszText = (LPCTSTR)lpdis->itemData; - ::DrawText(lpdis->hDC, lpszText, -1, &lpdis->rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE); + const auto& text = m_cStatusBar.GetStatusBarTextCache( lpdis->itemID); + ::DrawText( lpdis->hDC, text.c_str(), -1, &lpdis->rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE); } - //else if (0 == lpdis->itemID) - //{ - // ::SetTextColor(lpdis->hDC, DarkMode.GetSysColor(COLOR_BTNTEXT)); - // ::SetBkMode(lpdis->hDC, TRANSPARENT); - - // // テキストを取得 - // LPCTSTR lpszText = (LPCTSTR)lpdis->itemData; - // ::DrawText(lpdis->hDC, lpszText, -1, &lpdis->rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE); - //} } if( 5 == lpdis->itemID ){ // 2003.08.26 Moca idがずれて作画されなかった @@ -1329,7 +1308,7 @@ LRESULT CEditWnd::DispatchEvent( ::TextOut( lpdis->hDC, lpdis->rcItem.left + 1, y, L"REC", wcslen( L"REC" ) ); } } - return 0; + return TRUE; }else{ switch( lpdis->CtlType ){ case ODT_MENU: /* オーナー描画メニュー */ @@ -1404,6 +1383,44 @@ LRESULT CEditWnd::DispatchEvent( } return 0L; + case WM_WINDOWPOSCHANGING: + { + // エアロスナップの緩和策を適用 + if ( m_pShareData->m_Common.m_sHSP.m_bAeroSnapMitigation) + { + // + RECT rc = { 0 }; + WINDOWPLACEMENT wp = { 0 }; + wp.length = sizeof(WINDOWPLACEMENT); + + bool bAeroSnap = false; + { + ::GetWindowPlacement( hwnd, &wp); + if ( wp.showCmd == SW_SHOWNORMAL) + { + ::GetWindowRect( hwnd, &rc); + + bAeroSnap = + (rc.left != wp.rcNormalPosition.left || + rc.top != wp.rcNormalPosition.top || + rc.right != wp.rcNormalPosition.right || + rc.bottom != wp.rcNormalPosition.bottom); + } + } + + if ( bAeroSnap) + { + MYTRACE( L"Snap!!\n"); + wp.rcNormalPosition = rc; + ::SetWindowPlacement(hwnd, &wp); + } + else { + MYTRACE(L"Not Snap!!\n"); + } + } + + return DefWindowProc( hwnd, uMsg, wParam, lParam); + } case WM_WINDOWPOSCHANGED: // ポップアップウィンドウの表示切替指示をポストする // 2007.10.22 ryoji // ・WM_SHOWWINDOWはすべての表示切替で呼ばれるわけではないのでWM_WINDOWPOSCHANGEDで処理 diff --git a/sakura_core/window/CMainStatusBar.cpp b/sakura_core/window/CMainStatusBar.cpp index 750fba70f0..f6ba5259c9 100644 --- a/sakura_core/window/CMainStatusBar.cpp +++ b/sakura_core/window/CMainStatusBar.cpp @@ -195,6 +195,15 @@ bool CMainStatusBar::SetStatusText(int nIndex, int nOption, const WCHAR* pszText } }while (false); if (bDraw) { + + // ダークモード時自前描画を行うが、DRAWITEMSTRUCT 内の文字列が壊れているときがあるため + // ステータスバーで描画すべきテキストを別途管理する + const auto& DarkMode = CHsp3DarkMode::GetInstance(); + if ( DarkMode.IsSystemUseDarkMode()) + { + SetStatusBarTextCache(nIndex, (pszText == nullptr) ? L"" : pszText); + } + StatusBar_SetText(m_hwndStatusBar, nIndex | nOption, pszText); } return bDraw; diff --git a/sakura_core/window/CMainStatusBar.h b/sakura_core/window/CMainStatusBar.h index 2cdaac4393..ee72187b74 100644 --- a/sakura_core/window/CMainStatusBar.h +++ b/sakura_core/window/CMainStatusBar.h @@ -57,9 +57,38 @@ class CMainStatusBar : public CDocListenerEx{ //設定 bool SetStatusText(int nIndex, int nOption, const WCHAR* pszText, size_t textLen = SIZE_MAX); void ShowProgressBar(bool bShow) const; + + // 指定されたインデックスにテキストを設定する + inline void SetStatusBarTextCache(int index, const std::wstring& text) + { + m_texts[index] = text; + } + + // 指定されたインデックスのテキストを取得する + inline std::wstring GetStatusBarTextCache(int index) const + { + auto it = m_texts.find(index); + if (it != m_texts.end()) + { + return it->second; + } + return L""; // テキストが見つからない場合は空のwstringを返す + } + + // すべてのテキストをクリアする + inline void ClearStatusBarTextCache() + { + m_texts.clear(); + } + private: CEditWnd* m_pOwner; HWND m_hwndStatusBar; HWND m_hwndProgressBar; + + // インデックスとテキストを保存するマップ +private: + std::map m_texts; + }; #endif /* SAKURA_CMAINSTATUSBAR_E2FC11D7_4513_4F96_BDCC_E9B278ED0718_H_ */