From 287c48fe2a1cac7045b1c8d0bb3b24cb12cef12b Mon Sep 17 00:00:00 2001 From: sdottaka Date: Fri, 2 Aug 2024 07:41:12 +0900 Subject: [PATCH 01/14] WIP --- Src/CommandBar.cpp | 99 ++++++++++++++++++++++++++++++++++++++++++++++ Src/CommandBar.h | 31 +++++++++++++++ Src/MainFrm.cpp | 32 ++++++++++++--- Src/MainFrm.h | 10 +++++ Src/Merge.vcxproj | 2 + 5 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 Src/CommandBar.cpp create mode 100644 Src/CommandBar.h diff --git a/Src/CommandBar.cpp b/Src/CommandBar.cpp new file mode 100644 index 00000000000..82a77475a78 --- /dev/null +++ b/Src/CommandBar.cpp @@ -0,0 +1,99 @@ +/** + * @file CommandBar.cpp + * + * @brief Implementation of the CCommandBar class + */ + +#include "StdAfx.h" +#include "CommandBar.h" + +IMPLEMENT_DYNAMIC(CCommandBar, CToolBar) + +BEGIN_MESSAGE_MAP(CCommandBar, CToolBar) +END_MESSAGE_MAP() + +CCommandBar::CCommandBar() : m_hMenu(nullptr) +{ +} + +static void setTBButton(TBBUTTON& btn, int id, const TCHAR* str) +{ + btn.iBitmap = I_IMAGENONE; + btn.idCommand = id; + btn.fsState = TBSTATE_ENABLED; + btn.fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE; + btn.dwData = 0; + btn.iString = reinterpret_cast(str); +} + +BOOL CCommandBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID) +{ + bool ret = __super::CreateEx(pParentWnd, TBSTYLE_FLAT | TBSTYLE_LIST | TBSTYLE_TRANSPARENT, dwStyle, + CRect(0, 0, 0, 0), nID); + + CToolBarCtrl& toolbar = GetToolBarCtrl(); + toolbar.SetButtonStructSize(sizeof(TBBUTTON)); + + TBBUTTON btn; + setTBButton(btn, FIRST_MENUID, _T("")); + toolbar.InsertButton(0, &btn); + return ret; +} + +bool CCommandBar::AttachMenu(CMenu* pMenu) +{ + CToolBarCtrl& toolbar = GetToolBarCtrl(); + + toolbar.SetRedraw(false); + + const int nCount = toolbar.GetButtonCount(); + for (int i = 0; i < nCount; i++) + toolbar.DeleteButton(0); + + + if (pMenu && pMenu->m_hMenu) + { + m_hMenu = pMenu->m_hMenu; + + const int nItems = pMenu->GetMenuItemCount(); + std::vector btns(nItems); + std::vector menuStrings(nItems); + + for (int i = 0; i < nItems; i++) + { + TCHAR szString[256]{}; + MENUITEMINFO mii{ sizeof MENUITEMINFO }; + mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU; + mii.fType = MFT_STRING; + mii.dwTypeData = szString; + mii.cch = sizeof(szString) / sizeof(szString[0]); + pMenu->GetMenuItemInfo(i, &mii, TRUE); + menuStrings[i] = szString; + + setTBButton(btns[i], FIRST_MENUID + i, menuStrings[i].c_str()); + } + + toolbar.SendMessage(TB_ADDBUTTONSW, nItems, (LPARAM)btns.data()); + } + + toolbar.SetRedraw(true); + + return true; +} + +void CCommandBar::OnCommandBarMenuItem(UINT nID) +{ + CToolBarCtrl& toolbar = GetToolBarCtrl(); + CRect rc; + toolbar.GetItemRect(nID - 10000, &rc); + ClientToScreen(&rc); + CMenu* pMenu = CMenu::FromHandle(m_hMenu); + CMenu* pPopup = pMenu->GetSubMenu(nID - 10000); + pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rc.left, rc.bottom, GetParentFrame()); +} + +void CCommandBar::OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(); +} + diff --git a/Src/CommandBar.h b/Src/CommandBar.h new file mode 100644 index 00000000000..2e90f464163 --- /dev/null +++ b/Src/CommandBar.h @@ -0,0 +1,31 @@ +/** + * @file CommandBar.h + * + * @brief Declaration file for CCommandBar + * + */ +#pragma once + +#include +#include +#include + +class CCommandBar : public CToolBar +{ + DECLARE_DYNAMIC(CCommandBar) +public: + constexpr static int FIRST_MENUID = 10000; + + CCommandBar(); + + virtual BOOL Create(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, UINT nID = AFX_IDW_TOOLBAR); + bool AttachMenu(CMenu* pMenu); + void OnCommandBarMenuItem(UINT nID); + void OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI); + +protected: + DECLARE_MESSAGE_MAP() + + HMENU m_hMenu; + CFont m_hToolbarFont; +}; \ No newline at end of file diff --git a/Src/MainFrm.cpp b/Src/MainFrm.cpp index 366e8dc6224..867007e0bef 100644 --- a/Src/MainFrm.cpp +++ b/Src/MainFrm.cpp @@ -220,6 +220,8 @@ BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) ON_MESSAGE(WM_COPYDATA, OnCopyData) ON_MESSAGE(WM_USER+1, OnUser1) ON_WM_ACTIVATEAPP() + ON_COMMAND_RANGE(CCommandBar::FIRST_MENUID, CCommandBar::FIRST_MENUID + 10, OnCommandBarMenuItem) + ON_UPDATE_COMMAND_UI_RANGE(CCommandBar::FIRST_MENUID, CCommandBar::FIRST_MENUID + 10, OnUpdateCommandBarMenuItem) // [File] menu ON_COMMAND(ID_FILE_NEW, (OnFileNew<2, ID_MERGE_COMPARE_TEXT>)) ON_COMMAND(ID_FILE_NEW_TABLE, (OnFileNew<2, ID_MERGE_COMPARE_TABLE>)) @@ -446,6 +448,16 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) return 0; } +void CMainFrame::OnCommandBarMenuItem(UINT nID) +{ + m_wndCommandBar.OnCommandBarMenuItem(nID); +} + +void CMainFrame::OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI) +{ + m_wndCommandBar.OnUpdateCommandBarMenuItem(pCmdUI); +} + void CMainFrame::OnTimer(UINT_PTR nIDEvent) { __super::OnTimer(nIDEvent); @@ -2470,26 +2482,32 @@ void CMainFrame::OnActivateApp(BOOL bActive, DWORD dwThreadID) BOOL CMainFrame::CreateToolbar() { - if (!m_wndToolBar.CreateEx(this) || + if (!m_wndCommandBar.Create(this)) + { + return FALSE; + } + + if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { return FALSE; } - if (!m_wndReBar.Create(this, RBS_BANDBORDERS, + if (!m_wndReBar.Create(this, 0, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_ALIGN_TOP)) { return FALSE; } - VERIFY(m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT|TBSTYLE_TRANSPARENT)); - // Remove this if you don't want tool tips or a resizable toolbar + m_wndCommandBar.SetBarStyle(m_wndCommandBar.GetBarStyle() | + CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS); - m_wndReBar.AddBar(&m_wndToolBar); + m_wndReBar.AddBar(&m_wndCommandBar); + m_wndReBar.AddBar(&m_wndToolBar, nullptr, nullptr, RBBS_GRIPPERALWAYS | RBBS_FIXEDBMP | RBBS_BREAK); LoadToolbarImages(); @@ -2508,6 +2526,8 @@ BOOL CMainFrame::CreateToolbar() __super::ShowControlBar(&m_wndToolBar, false, 0); } + __super::ShowControlBar(&m_wndCommandBar, true, 0); + return TRUE; } @@ -2542,7 +2562,7 @@ void CMainFrame::LoadToolbarImages() REBARBANDINFO rbbi = { sizeof REBARBANDINFO }; rbbi.fMask = RBBIM_CHILDSIZE; rbbi.cyMinChild = sizeButton.cy; - m_wndReBar.GetReBarCtrl().SetBandInfo(0, &rbbi); + m_wndReBar.GetReBarCtrl().SetBandInfo(1, &rbbi); } diff --git a/Src/MainFrm.h b/Src/MainFrm.h index a638ea6a05a..91f883a23f2 100644 --- a/Src/MainFrm.h +++ b/Src/MainFrm.h @@ -14,6 +14,7 @@ #include #include #include +#include "CommandBar.h" #include "MDITabBar.h" #include "BasicFlatStatusBar.h" #include "PathContext.h" @@ -222,6 +223,7 @@ class CMainFrame : public CMDIFrameWnd DirWatcher* GetDirWatcher() { return m_pDirWatcher.get(); } void WatchDocuments(IMergeDoc* pMergeDoc); void UnwatchDocuments(IMergeDoc* pMergeDoc); + CCommandBar* GetCommandBar() { return &m_wndCommandBar; } CToolBar* GetToolbar() { return &m_wndToolBar; } static void WaitAndDoMessageLoop(bool& completed, int ms); @@ -249,6 +251,7 @@ class CMainFrame : public CMDIFrameWnd // control bar embedded members CBasicFlatStatusBar m_wndStatusBar; CReBar m_wndReBar; + CCommandBar m_wndCommandBar; CToolBar m_wndToolBar; CMDITabBar m_wndTabBar; CTypedPtrArray m_arrChild; @@ -274,6 +277,11 @@ class CMainFrame : public CMDIFrameWnd } break; } + case WM_MDISETMENU: + GetMainFrame()->SetMenuBarState(AFX_MBS_HIDDEN); + GetMainFrame()->GetCommandBar()->AttachMenu(CMenu::FromHandle(reinterpret_cast(wParam))); + return TRUE; + break; case WM_TIMER: if (wParam == m_nRedrawTimer) { @@ -418,6 +426,8 @@ class CMainFrame : public CMDIFrameWnd afx_msg LRESULT OnChildFrameRemoved(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnChildFrameActivate(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnChildFrameActivated(WPARAM wParam, LPARAM lParam); + afx_msg void OnCommandBarMenuItem(UINT nID); + afx_msg void OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI); //}}AFX_MSG DECLARE_MESSAGE_MAP() diff --git a/Src/Merge.vcxproj b/Src/Merge.vcxproj index 646eebf143d..01c8eb19205 100644 --- a/Src/Merge.vcxproj +++ b/Src/Merge.vcxproj @@ -1445,6 +1445,7 @@ + @@ -1657,6 +1658,7 @@ + From ac34f6be5bde621603ee3ee07fb5833ead02f459 Mon Sep 17 00:00:00 2001 From: Takashi Sawanaka Date: Sun, 4 Aug 2024 10:50:25 +0900 Subject: [PATCH 02/14] WIP --- Src/CommandBar.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Src/CommandBar.cpp b/Src/CommandBar.cpp index 82a77475a78..146443ff036 100644 --- a/Src/CommandBar.cpp +++ b/Src/CommandBar.cpp @@ -37,6 +37,16 @@ BOOL CCommandBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID) TBBUTTON btn; setTBButton(btn, FIRST_MENUID, _T("")); toolbar.InsertButton(0, &btn); + + TEXTMETRIC tm; + CClientDC dc(this); + CFont* pOldFont = dc.SelectObject(toolbar.GetFont()); + dc.GetTextMetrics(&tm); + const int lpx = dc.GetDeviceCaps(LOGPIXELSX); + auto pointToPixel = [lpx](float point) -> int { return static_cast(point * lpx / 72.0f); }; + const int cy = pointToPixel(1.5); + toolbar.SetButtonSize(CSize(tm.tmHeight + cy * 2, tm.tmHeight + cy * 2)); + dc.SelectObject(pOldFont); return ret; } @@ -57,7 +67,7 @@ bool CCommandBar::AttachMenu(CMenu* pMenu) const int nItems = pMenu->GetMenuItemCount(); std::vector btns(nItems); - std::vector menuStrings(nItems); + std::vector> menuStrings(nItems); for (int i = 0; i < nItems; i++) { @@ -68,7 +78,7 @@ bool CCommandBar::AttachMenu(CMenu* pMenu) mii.dwTypeData = szString; mii.cch = sizeof(szString) / sizeof(szString[0]); pMenu->GetMenuItemInfo(i, &mii, TRUE); - menuStrings[i] = szString; + menuStrings[i] = std::basic_string(L" ") + szString + L" "; setTBButton(btns[i], FIRST_MENUID + i, menuStrings[i].c_str()); } From e84264360296bee4b620d0b0f83c1d80cb5277d3 Mon Sep 17 00:00:00 2001 From: sdottaka Date: Tue, 6 Aug 2024 07:59:27 +0900 Subject: [PATCH 03/14] WIP --- Src/CommandBar.cpp | 77 ++++++++++++++++++++++++++++++++++++++++------ Src/CommandBar.h | 5 +++ 2 files changed, 72 insertions(+), 10 deletions(-) diff --git a/Src/CommandBar.cpp b/Src/CommandBar.cpp index 146443ff036..bd3c19fb8e9 100644 --- a/Src/CommandBar.cpp +++ b/Src/CommandBar.cpp @@ -12,8 +12,14 @@ IMPLEMENT_DYNAMIC(CCommandBar, CToolBar) BEGIN_MESSAGE_MAP(CCommandBar, CToolBar) END_MESSAGE_MAP() -CCommandBar::CCommandBar() : m_hMenu(nullptr) +HHOOK CCommandBar::m_hHook = nullptr; +CCommandBar* CCommandBar::m_pThis = nullptr; + +CCommandBar::CCommandBar() + : m_hMenu(nullptr) + , m_bActive(false) { + m_pThis = this; } static void setTBButton(TBBUTTON& btn, int id, const TCHAR* str) @@ -44,9 +50,13 @@ BOOL CCommandBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID) dc.GetTextMetrics(&tm); const int lpx = dc.GetDeviceCaps(LOGPIXELSX); auto pointToPixel = [lpx](float point) -> int { return static_cast(point * lpx / 72.0f); }; - const int cy = pointToPixel(1.5); + const int cy = pointToPixel(3); toolbar.SetButtonSize(CSize(tm.tmHeight + cy * 2, tm.tmHeight + cy * 2)); dc.SelectObject(pOldFont); + + if (!m_hHook) + m_hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, AfxGetInstanceHandle(), GetCurrentThreadId()); + return ret; } @@ -60,7 +70,6 @@ bool CCommandBar::AttachMenu(CMenu* pMenu) for (int i = 0; i < nCount; i++) toolbar.DeleteButton(0); - if (pMenu && pMenu->m_hMenu) { m_hMenu = pMenu->m_hMenu; @@ -72,11 +81,7 @@ bool CCommandBar::AttachMenu(CMenu* pMenu) for (int i = 0; i < nItems; i++) { TCHAR szString[256]{}; - MENUITEMINFO mii{ sizeof MENUITEMINFO }; - mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU; - mii.fType = MFT_STRING; - mii.dwTypeData = szString; - mii.cch = sizeof(szString) / sizeof(szString[0]); + MENUITEMINFO mii{ sizeof MENUITEMINFO, MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU, MFT_STRING, 0, 0, nullptr, nullptr, nullptr, 0, szString, sizeof(szString) / sizeof(szString[0]) }; pMenu->GetMenuItemInfo(i, &mii, TRUE); menuStrings[i] = std::basic_string(L" ") + szString + L" "; @@ -95,10 +100,10 @@ void CCommandBar::OnCommandBarMenuItem(UINT nID) { CToolBarCtrl& toolbar = GetToolBarCtrl(); CRect rc; - toolbar.GetItemRect(nID - 10000, &rc); + toolbar.GetItemRect(nID - FIRST_MENUID, &rc); ClientToScreen(&rc); CMenu* pMenu = CMenu::FromHandle(m_hMenu); - CMenu* pPopup = pMenu->GetSubMenu(nID - 10000); + CMenu* pPopup = pMenu->GetSubMenu(nID - FIRST_MENUID); pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rc.left, rc.bottom, GetParentFrame()); } @@ -107,3 +112,55 @@ void CCommandBar::OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI) pCmdUI->Enable(); } +LRESULT CALLBACK CCommandBar::GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + if (nCode == HC_ACTION && wParam == PM_REMOVE) + { + MSG* pMsg = reinterpret_cast(lParam); + if (pMsg->message == WM_SYSKEYDOWN || pMsg->message == WM_SYSKEYUP) + { + CToolBarCtrl& toolbar = m_pThis->GetToolBarCtrl(); + UINT uId = 0; + if (pMsg->wParam == VK_F10 || pMsg->wParam == VK_MENU) + { + if (pMsg->message == WM_SYSKEYUP) + { + toolbar.SetHotItem(!m_pThis->m_bActive ? 0 : -1); + m_pThis->m_bActive = !m_pThis->m_bActive; + } + } + else if (toolbar.MapAccelerator(static_cast(pMsg->wParam), &uId) != 0) + { + m_pThis->OnCommandBarMenuItem(uId); + return -1; + } + } + else if(pMsg->message == WM_KEYDOWN) + { + CToolBarCtrl& toolbar = m_pThis->GetToolBarCtrl(); + if ((m_pThis->m_bActive) && (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_LEFT || pMsg->wParam == VK_RIGHT || pMsg->wParam == VK_UP || pMsg->wParam == VK_DOWN || pMsg->wParam == VK_RETURN)) + { + const int nCount = toolbar.GetButtonCount(); + const int nHotItem = toolbar.GetHotItem(); + if (pMsg->wParam == VK_ESCAPE) + { + toolbar.SetHotItem(-1); + m_pThis->m_bActive = !m_pThis->m_bActive; + } + else if (pMsg->wParam == VK_LEFT && nHotItem != -1 && nHotItem != 0) + { + toolbar.SetHotItem(nHotItem - 1); + } + else if (pMsg->wParam == VK_RIGHT && nHotItem != -1 && nHotItem < nCount) + { + toolbar.SetHotItem(nHotItem + 1); + } + else if ((pMsg->wParam == VK_RETURN || pMsg->wParam == VK_DOWN) && nHotItem >= 0) + { + m_pThis->OnCommandBarMenuItem(FIRST_MENUID + nHotItem); + } + } + } + } + return CallNextHookEx(m_hHook, nCode, wParam, lParam); +} diff --git a/Src/CommandBar.h b/Src/CommandBar.h index 2e90f464163..3c6ee30d561 100644 --- a/Src/CommandBar.h +++ b/Src/CommandBar.h @@ -26,6 +26,11 @@ class CCommandBar : public CToolBar protected: DECLARE_MESSAGE_MAP() + static LRESULT CALLBACK GetMsgProc(int code, WPARAM wp, LPARAM lp); + HMENU m_hMenu; CFont m_hToolbarFont; + bool m_bActive; + static HHOOK m_hHook; + static CCommandBar* m_pThis; }; \ No newline at end of file From d07f58dddb851a3d873b57aad6a38b6f4051fb8a Mon Sep 17 00:00:00 2001 From: Takashi Sawanaka Date: Sun, 11 Aug 2024 07:02:52 +0900 Subject: [PATCH 04/14] WIP --- Src/CommandBar.cpp | 18 ++++++++++++++++++ Src/CommandBar.h | 3 +++ 2 files changed, 21 insertions(+) diff --git a/Src/CommandBar.cpp b/Src/CommandBar.cpp index bd3c19fb8e9..70f4fdcc375 100644 --- a/Src/CommandBar.cpp +++ b/Src/CommandBar.cpp @@ -10,6 +10,7 @@ IMPLEMENT_DYNAMIC(CCommandBar, CToolBar) BEGIN_MESSAGE_MAP(CCommandBar, CToolBar) + ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) END_MESSAGE_MAP() HHOOK CCommandBar::m_hHook = nullptr; @@ -96,6 +97,23 @@ bool CCommandBar::AttachMenu(CMenu* pMenu) return true; } +void CCommandBar::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) +{ + LPNMTBCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); + if (pNMCD->nmcd.dwDrawStage == CDDS_PREPAINT) + { + *pResult = CDRF_NOTIFYITEMDRAW; + return; + } + else if (pNMCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) + { + pNMCD->clrText = GetSysColor(COLOR_MENUTEXT); + *pResult = CDRF_DODEFAULT | TBCDRF_USECDCOLORS; + return; + } + *pResult = 0; +} + void CCommandBar::OnCommandBarMenuItem(UINT nID) { CToolBarCtrl& toolbar = GetToolBarCtrl(); diff --git a/Src/CommandBar.h b/Src/CommandBar.h index 3c6ee30d561..f36d7460250 100644 --- a/Src/CommandBar.h +++ b/Src/CommandBar.h @@ -24,6 +24,9 @@ class CCommandBar : public CToolBar void OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI); protected: + //{{AFX_MSG(CCommandBar) + afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); + //}}AFX_MSG DECLARE_MESSAGE_MAP() static LRESULT CALLBACK GetMsgProc(int code, WPARAM wp, LPARAM lp); From 67fc5351a0d370f27e2a77efdf39f5bfa9d24e2d Mon Sep 17 00:00:00 2001 From: sdottaka Date: Tue, 13 Aug 2024 18:09:53 +0900 Subject: [PATCH 05/14] WIP --- Src/BasicFlatStatusBar.cpp | 2 + Src/CommandBar.cpp | 346 ++++++++++++++++++++++++++++++------- Src/CommandBar.h | 23 ++- Src/MainFrm.cpp | 13 +- Src/MainFrm.h | 1 - Src/Merge.rc | 2 + Src/Merge.vcxproj.filters | 6 + 7 files changed, 320 insertions(+), 73 deletions(-) diff --git a/Src/BasicFlatStatusBar.cpp b/Src/BasicFlatStatusBar.cpp index 608ca719134..45f24d3db37 100644 --- a/Src/BasicFlatStatusBar.cpp +++ b/Src/BasicFlatStatusBar.cpp @@ -1,3 +1,5 @@ +// Copyright (c) 2024 Takashi Sawanaka +// SPDX-License-Identifier: BSL-1.0 /** * @file BasicFlatStatusBar.cpp * diff --git a/Src/CommandBar.cpp b/Src/CommandBar.cpp index 70f4fdcc375..c617e0c2904 100644 --- a/Src/CommandBar.cpp +++ b/Src/CommandBar.cpp @@ -1,3 +1,5 @@ +// Copyright (c) 2024 Takashi Sawanaka +// SPDX-License-Identifier: BSL-1.0 /** * @file CommandBar.cpp * @@ -7,30 +9,42 @@ #include "StdAfx.h" #include "CommandBar.h" +static const UINT UWM_SHOWPOPUPMENU = WM_APP + 1; +HHOOK CCommandBar::m_hHook = nullptr; +CCommandBar* CCommandBar::m_pThis = nullptr; + IMPLEMENT_DYNAMIC(CCommandBar, CToolBar) BEGIN_MESSAGE_MAP(CCommandBar, CToolBar) ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) + ON_WM_KILLFOCUS() + ON_WM_SETFOCUS() + ON_WM_MOUSEMOVE() + ON_WM_MOUSELEAVE() + ON_WM_LBUTTONDOWN() + ON_WM_LBUTTONUP() + ON_MESSAGE(UWM_SHOWPOPUPMENU, OnShowPopupMenu) END_MESSAGE_MAP() -HHOOK CCommandBar::m_hHook = nullptr; -CCommandBar* CCommandBar::m_pThis = nullptr; - CCommandBar::CCommandBar() : m_hMenu(nullptr) , m_bActive(false) + , m_bMouseTracking(false) + , m_nMDIButtonDown(-1) + , m_hwndOldFocus(nullptr) + , m_nCurrentMenuItemFlags(0) + , m_nCurrentHotItem(-1) + , m_hCurrentPopupMenu(nullptr) + , m_bShowKeyboardCues(false) { m_pThis = this; } -static void setTBButton(TBBUTTON& btn, int id, const TCHAR* str) +static TBBUTTON makeTBButton(int id, const TCHAR* str) { - btn.iBitmap = I_IMAGENONE; - btn.idCommand = id; - btn.fsState = TBSTATE_ENABLED; - btn.fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE; - btn.dwData = 0; + TBBUTTON btn{ I_IMAGENONE, id, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_DROPDOWN | BTNS_AUTOSIZE }; btn.iString = reinterpret_cast(str); + return btn; } BOOL CCommandBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID) @@ -39,12 +53,6 @@ BOOL CCommandBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID) CRect(0, 0, 0, 0), nID); CToolBarCtrl& toolbar = GetToolBarCtrl(); - toolbar.SetButtonStructSize(sizeof(TBBUTTON)); - - TBBUTTON btn; - setTBButton(btn, FIRST_MENUID, _T("")); - toolbar.InsertButton(0, &btn); - TEXTMETRIC tm; CClientDC dc(this); CFont* pOldFont = dc.SelectObject(toolbar.GetFont()); @@ -52,11 +60,13 @@ BOOL CCommandBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID) const int lpx = dc.GetDeviceCaps(LOGPIXELSX); auto pointToPixel = [lpx](float point) -> int { return static_cast(point * lpx / 72.0f); }; const int cy = pointToPixel(3); - toolbar.SetButtonSize(CSize(tm.tmHeight + cy * 2, tm.tmHeight + cy * 2)); dc.SelectObject(pOldFont); - if (!m_hHook) - m_hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, AfxGetInstanceHandle(), GetCurrentThreadId()); + TBBUTTON btn = makeTBButton(FIRST_MENUID, _T("")); + toolbar.SetButtonStructSize(sizeof(TBBUTTON)); + toolbar.SetDrawTextFlags(DT_HIDEPREFIX, DT_HIDEPREFIX); + toolbar.InsertButton(0, &btn); + toolbar.SetButtonSize(CSize(tm.tmHeight + cy * 2, tm.tmHeight + cy * 2)); return ret; } @@ -86,7 +96,7 @@ bool CCommandBar::AttachMenu(CMenu* pMenu) pMenu->GetMenuItemInfo(i, &mii, TRUE); menuStrings[i] = std::basic_string(L" ") + szString + L" "; - setTBButton(btns[i], FIRST_MENUID + i, menuStrings[i].c_str()); + btns[i] = makeTBButton(FIRST_MENUID + i, menuStrings[i].c_str()); } toolbar.SendMessage(TB_ADDBUTTONSW, nItems, (LPARAM)btns.data()); @@ -97,32 +107,196 @@ bool CCommandBar::AttachMenu(CMenu* pMenu) return true; } +void CCommandBar::DrawMDIButtons(HDC hDC) +{ + const int nTypes[3] = { + DFCS_CAPTIONMIN | DFCS_FLAT | (m_nMDIButtonDown == 0 ? DFCS_PUSHED : 0), + DFCS_CAPTIONRESTORE | DFCS_FLAT | (m_nMDIButtonDown == 1 ? DFCS_PUSHED : 0), + DFCS_CAPTIONCLOSE | DFCS_FLAT | (m_nMDIButtonDown == 2 ? DFCS_PUSHED : 0) + }; + CRect rcButtons = GetMDIButtonsRect(); + CRect rcItem; + GetToolBarCtrl().GetItemRect(0, &rcItem); + const int bw = rcItem.Height(); + const int w = rcButtons.Height(); + CRect rc{ rcButtons.left, rcButtons.top + (w - bw) / 2, rcButtons.left + bw, rcButtons.top + (w + bw) / 2}; + for (int i = 0; i < 3; ++i) + { + ::DrawFrameControl(hDC, rc, DFC_CAPTION, nTypes[i]); + rc.left += w; + rc.right += w; + } +} + +int CCommandBar::GetMDIButtonIndexFromPoint(CPoint pt) const +{ + CRect rcButtons = GetMDIButtonsRect(); + if (!rcButtons.PtInRect(pt)) + return -1; + for (int i = 0; i < 3; ++i) + { + if (GetMDIButtonRect(i).PtInRect(pt)) + return i; + } + return -1; +} + +CRect CCommandBar::GetMDIButtonsRect() const +{ + CRect rcClient; + GetClientRect(&rcClient); + return { rcClient.right - rcClient.Height() * 3, rcClient.top, rcClient.right, rcClient.bottom }; +} + +CRect CCommandBar::GetMDIButtonRect(int nItem) const +{ + CRect rcButtons = GetMDIButtonsRect(); + const int w = rcButtons.Height(); + return { rcButtons.left + w * nItem, rcButtons.top, rcButtons.left + w * nItem + w, rcButtons.bottom }; +} + +static bool IsMDIChildMaximized() +{ + CMDIFrameWnd* pMDIFrameWnd = DYNAMIC_DOWNCAST(CMDIFrameWnd, AfxGetMainWnd()); + if (!pMDIFrameWnd) + return false; + BOOL bMaximized = FALSE; + pMDIFrameWnd->MDIGetActive(&bMaximized); + return bMaximized; +} + +void CCommandBar::LoseFocus() +{ + m_bActive = false; + m_hwndOldFocus = nullptr; + m_bShowKeyboardCues = false; + GetToolBarCtrl().SetDrawTextFlags(DT_HIDEPREFIX, DT_HIDEPREFIX); + GetToolBarCtrl().SetHotItem(-1); + Invalidate(); +} + +void CCommandBar::OnSetFocus(CWnd* pOldWnd) +{ + m_bActive = true; + m_hwndOldFocus = pOldWnd->m_hWnd; + __super::OnSetFocus(pOldWnd); +} + +void CCommandBar::OnKillFocus(CWnd* pNewWnd) +{ + LoseFocus(); + __super::OnKillFocus(pNewWnd); +} + void CCommandBar::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { LPNMTBCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); - if (pNMCD->nmcd.dwDrawStage == CDDS_PREPAINT) + DWORD dwDrawState = pNMCD->nmcd.dwDrawStage; + if (dwDrawState == CDDS_PREPAINT) { - *pResult = CDRF_NOTIFYITEMDRAW; + *pResult = CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYPOSTPAINT; return; } - else if (pNMCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) + else if (dwDrawState == CDDS_ITEMPREPAINT) { pNMCD->clrText = GetSysColor(COLOR_MENUTEXT); *pResult = CDRF_DODEFAULT | TBCDRF_USECDCOLORS; return; } + else if (dwDrawState == CDDS_POSTPAINT && + (m_bMouseTracking && IsMDIChildMaximized())) + { + DrawMDIButtons(pNMCD->nmcd.hdc); + } *pResult = 0; } +void CCommandBar::OnMouseMove(UINT nFlags, CPoint point) +{ + CRect rcMDIButtons = GetMDIButtonsRect(); + InvalidateRect(&rcMDIButtons); + if (!m_bMouseTracking) + { + TRACKMOUSEEVENT tme = { sizeof TRACKMOUSEEVENT, TME_LEAVE, m_hWnd }; + TrackMouseEvent(&tme); + m_bMouseTracking = true; + } + __super::OnMouseMove(nFlags, point); +} + +void CCommandBar::OnMouseLeave() +{ + TRACKMOUSEEVENT tme = { sizeof(TRACKMOUSEEVENT), TME_LEAVE | TME_CANCEL, m_hWnd }; + TrackMouseEvent(&tme); + m_bMouseTracking = false; + CRect rcButtons = GetMDIButtonsRect(); + InvalidateRect(&rcButtons); + m_nMDIButtonDown = -1; + __super::OnMouseLeave(); +} + +void CCommandBar::OnLButtonDown(UINT nFlags, CPoint point) +{ + CRect rcButtons = GetMDIButtonsRect(); + if (rcButtons.PtInRect(point)) + { + m_nMDIButtonDown = GetMDIButtonIndexFromPoint(point); + InvalidateRect(rcButtons); + return; + } + __super::OnLButtonDown(nFlags, point); +} + +void CCommandBar::OnLButtonUp(UINT nFlags, CPoint point) +{ + CRect rcButtons = GetMDIButtonsRect(); + if (m_nMDIButtonDown != -1 && rcButtons.PtInRect(point)) + { + CMDIFrameWnd* pMDIFrameWnd = DYNAMIC_DOWNCAST(CMDIFrameWnd, AfxGetMainWnd()); + if (pMDIFrameWnd) + { + CFrameWnd* pFrameWnd = pMDIFrameWnd->GetActiveFrame(); + switch (GetMDIButtonIndexFromPoint(point)) + { + case 0: + pFrameWnd->ShowWindow(SW_MINIMIZE); + break; + case 1: + ::SendMessage(pMDIFrameWnd->m_hWndMDIClient, WM_MDIRESTORE, (WPARAM)(pFrameWnd->m_hWnd), 0); + break; + case 2: + pFrameWnd->PostMessage(WM_CLOSE); + break; + } + } + } + InvalidateRect(rcButtons); + m_nMDIButtonDown = -1; + __super::OnLButtonUp(nFlags, point); +} + void CCommandBar::OnCommandBarMenuItem(UINT nID) { + const int nHotItem = nID - FIRST_MENUID; + CMenu* pPopup = CMenu::FromHandle(::GetSubMenu(m_hMenu, nHotItem)); + if (!pPopup) + return; + CToolBarCtrl& toolbar = GetToolBarCtrl(); + toolbar.SetHotItem(nHotItem); + m_nCurrentMenuItemFlags = 0; + m_nCurrentHotItem = nHotItem; + m_hCurrentPopupMenu = pPopup->m_hMenu; + m_pThis = this; + + m_hHook = SetWindowsHookEx(WH_MSGFILTER, MsgFilterProc, nullptr, GetCurrentThreadId()); + CRect rc; - toolbar.GetItemRect(nID - FIRST_MENUID, &rc); + toolbar.GetItemRect(nHotItem, &rc); ClientToScreen(&rc); - CMenu* pMenu = CMenu::FromHandle(m_hMenu); - CMenu* pPopup = pMenu->GetSubMenu(nID - FIRST_MENUID); - pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rc.left, rc.bottom, GetParentFrame()); + pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rc.left, rc.bottom, AfxGetMainWnd()); + + UnhookWindowsHookEx(m_hHook); } void CCommandBar::OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI) @@ -130,54 +304,98 @@ void CCommandBar::OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI) pCmdUI->Enable(); } -LRESULT CALLBACK CCommandBar::GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) +LRESULT CCommandBar::OnShowPopupMenu(WPARAM wParam, LPARAM lParam) +{ + OnCommandBarMenuItem(static_cast(wParam)); + return 0; +} + +BOOL CCommandBar::PreTranslateMessage(MSG* pMsg) { - if (nCode == HC_ACTION && wParam == PM_REMOVE) + if (pMsg->message == WM_SYSKEYDOWN || pMsg->message == WM_SYSKEYUP) { - MSG* pMsg = reinterpret_cast(lParam); - if (pMsg->message == WM_SYSKEYDOWN || pMsg->message == WM_SYSKEYUP) + if (pMsg->wParam == VK_F10 || pMsg->wParam == VK_MENU) { - CToolBarCtrl& toolbar = m_pThis->GetToolBarCtrl(); - UINT uId = 0; - if (pMsg->wParam == VK_F10 || pMsg->wParam == VK_MENU) + if (pMsg->message == WM_SYSKEYDOWN) { - if (pMsg->message == WM_SYSKEYUP) - { - toolbar.SetHotItem(!m_pThis->m_bActive ? 0 : -1); - m_pThis->m_bActive = !m_pThis->m_bActive; - } + m_bShowKeyboardCues = true; + GetToolBarCtrl().SetDrawTextFlags(DT_HIDEPREFIX, 0); + Invalidate(); } - else if (toolbar.MapAccelerator(static_cast(pMsg->wParam), &uId) != 0) + else if (pMsg->message == WM_SYSKEYUP && m_bShowKeyboardCues) { - m_pThis->OnCommandBarMenuItem(uId); - return -1; + if (!m_bActive) + SetFocus(); + else if (m_hwndOldFocus != nullptr && IsWindow(m_hwndOldFocus)) + ::SetFocus(m_hwndOldFocus); } + return TRUE; } - else if(pMsg->message == WM_KEYDOWN) + UINT uId = 0; + if ((pMsg->message == WM_SYSKEYDOWN) && GetToolBarCtrl().MapAccelerator(static_cast(pMsg->wParam), &uId) != 0) { + OnCommandBarMenuItem(uId); + return TRUE; + } + } + else if (pMsg->message == WM_KEYDOWN && m_bActive && (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN)) + { + if (pMsg->wParam == VK_ESCAPE) + { + if (m_hwndOldFocus != nullptr && IsWindow(m_hwndOldFocus)) + ::SetFocus(m_hwndOldFocus); + } + else if (pMsg->wParam == VK_RETURN) + { + OnCommandBarMenuItem(FIRST_MENUID + GetToolBarCtrl().GetHotItem()); + } + return TRUE; + } + return FALSE; +} + +LRESULT CALLBACK CCommandBar::MsgFilterProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + if (nCode != MSGF_MENU) + return CallNextHookEx(m_hHook, nCode, wParam, lParam); + MSG* pMsg = reinterpret_cast(lParam); + if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_LEFT || pMsg->wParam == VK_RIGHT)) + { + if ((pMsg->wParam == VK_LEFT && ::GetSubMenu(m_pThis->m_hMenu, m_pThis->m_nCurrentHotItem) == m_pThis->m_hCurrentPopupMenu) || + (pMsg->wParam == VK_RIGHT && (m_pThis->m_nCurrentMenuItemFlags & MF_POPUP) == 0)) + { + AfxGetMainWnd()->PostMessage(WM_CANCELMODE); CToolBarCtrl& toolbar = m_pThis->GetToolBarCtrl(); - if ((m_pThis->m_bActive) && (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_LEFT || pMsg->wParam == VK_RIGHT || pMsg->wParam == VK_UP || pMsg->wParam == VK_DOWN || pMsg->wParam == VK_RETURN)) - { - const int nCount = toolbar.GetButtonCount(); - const int nHotItem = toolbar.GetHotItem(); - if (pMsg->wParam == VK_ESCAPE) - { - toolbar.SetHotItem(-1); - m_pThis->m_bActive = !m_pThis->m_bActive; - } - else if (pMsg->wParam == VK_LEFT && nHotItem != -1 && nHotItem != 0) - { - toolbar.SetHotItem(nHotItem - 1); - } - else if (pMsg->wParam == VK_RIGHT && nHotItem != -1 && nHotItem < nCount) - { - toolbar.SetHotItem(nHotItem + 1); - } - else if ((pMsg->wParam == VK_RETURN || pMsg->wParam == VK_DOWN) && nHotItem >= 0) - { - m_pThis->OnCommandBarMenuItem(FIRST_MENUID + nHotItem); - } - } + const int nCount = toolbar.GetButtonCount(); + int nHotItem = toolbar.GetHotItem(); + nHotItem = (nHotItem + nCount + ((pMsg->wParam == VK_RIGHT) ? 1 : -1)) % nCount; + m_pThis->PostMessage(UWM_SHOWPOPUPMENU, FIRST_MENUID + nHotItem); + return 0; + } + } + else if (pMsg->message == WM_MOUSEMOVE) + { + CRect rc; + m_pThis->GetWindowRect(&rc); + CPoint pt{ GET_X_LPARAM(pMsg->lParam) - rc.left, GET_Y_LPARAM(pMsg->lParam) - rc.top }; + const int nItem = m_pThis->GetToolBarCtrl().HitTest(&pt); + if (nItem >= 0 && m_pThis->m_nCurrentHotItem != nItem) + { + AfxGetMainWnd()->PostMessage(WM_CANCELMODE); + m_pThis->PostMessage(UWM_SHOWPOPUPMENU, FIRST_MENUID + nItem); + return 0; + } + } + else if (pMsg->message == WM_MENUSELECT) + { + m_pThis->m_nCurrentMenuItemFlags = HIWORD(pMsg->wParam); + m_pThis->m_hCurrentPopupMenu = reinterpret_cast(pMsg->lParam); + if (m_pThis->m_nCurrentMenuItemFlags == 0xffff && m_pThis->m_hCurrentPopupMenu == nullptr) // Menu closing + { + if (m_pThis->m_hwndOldFocus && IsWindow(m_pThis->m_hwndOldFocus)) + ::SetFocus(m_pThis->m_hwndOldFocus); + else + m_pThis->LoseFocus(); } } return CallNextHookEx(m_hHook, nCode, wParam, lParam); diff --git a/Src/CommandBar.h b/Src/CommandBar.h index f36d7460250..182774d132a 100644 --- a/Src/CommandBar.h +++ b/Src/CommandBar.h @@ -22,18 +22,37 @@ class CCommandBar : public CToolBar bool AttachMenu(CMenu* pMenu); void OnCommandBarMenuItem(UINT nID); void OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI); + BOOL PreTranslateMessage(MSG* pMsg); protected: //{{AFX_MSG(CCommandBar) afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnSetFocus(CWnd* pOldWnd); + afx_msg void OnKillFocus(CWnd* pNewWnd); + afx_msg void OnMouseMove(UINT nFlags, CPoint point); + afx_msg void OnMouseLeave(); + afx_msg void OnLButtonDown(UINT nFlags, CPoint point); + afx_msg void OnLButtonUp(UINT nFlags, CPoint point); + afx_msg LRESULT OnShowPopupMenu(WPARAM wParam, LPARAM lParam); //}}AFX_MSG DECLARE_MESSAGE_MAP() - static LRESULT CALLBACK GetMsgProc(int code, WPARAM wp, LPARAM lp); + static LRESULT CALLBACK MsgFilterProc(int code, WPARAM wp, LPARAM lp); + void DrawMDIButtons(HDC hDC); + int GetMDIButtonIndexFromPoint(CPoint pt) const; + CRect GetMDIButtonsRect() const; + CRect GetMDIButtonRect(int nItem) const; + void LoseFocus(); HMENU m_hMenu; - CFont m_hToolbarFont; bool m_bActive; + bool m_bMouseTracking; + bool m_bShowKeyboardCues; + int m_nMDIButtonDown; + HWND m_hwndOldFocus; + int m_nCurrentHotItem; + UINT m_nCurrentMenuItemFlags; + HMENU m_hCurrentPopupMenu; static HHOOK m_hHook; static CCommandBar* m_pThis; }; \ No newline at end of file diff --git a/Src/MainFrm.cpp b/Src/MainFrm.cpp index 867007e0bef..0d506e11461 100644 --- a/Src/MainFrm.cpp +++ b/Src/MainFrm.cpp @@ -220,7 +220,6 @@ BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) ON_MESSAGE(WM_COPYDATA, OnCopyData) ON_MESSAGE(WM_USER+1, OnUser1) ON_WM_ACTIVATEAPP() - ON_COMMAND_RANGE(CCommandBar::FIRST_MENUID, CCommandBar::FIRST_MENUID + 10, OnCommandBarMenuItem) ON_UPDATE_COMMAND_UI_RANGE(CCommandBar::FIRST_MENUID, CCommandBar::FIRST_MENUID + 10, OnUpdateCommandBarMenuItem) // [File] menu ON_COMMAND(ID_FILE_NEW, (OnFileNew<2, ID_MERGE_COMPARE_TEXT>)) @@ -448,11 +447,6 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) return 0; } -void CMainFrame::OnCommandBarMenuItem(UINT nID) -{ - m_wndCommandBar.OnCommandBarMenuItem(nID); -} - void CMainFrame::OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI) { m_wndCommandBar.OnUpdateCommandBarMenuItem(pCmdUI); @@ -2179,6 +2173,8 @@ void CMainFrame::SelectFilter() */ BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { + if (m_wndCommandBar.PreTranslateMessage(pMsg)) + return TRUE; // Check if we got 'ESC pressed' -message if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_ESCAPE)) { @@ -2954,6 +2950,11 @@ void CMainFrame::OnToolbarButtonDropDown(NMHDR* pNMHDR, LRESULT* pResult) id = IDR_POPUP_SAVE; break; default: + if (pToolBar->iItem >= CCommandBar::FIRST_MENUID && pToolBar->iItem < CCommandBar::FIRST_MENUID + 10) + { + m_wndCommandBar.OnCommandBarMenuItem(pToolBar->iItem); + return; + } id = IDR_POPUP_DIFF_OPTIONS; break; } diff --git a/Src/MainFrm.h b/Src/MainFrm.h index 91f883a23f2..d95b4672148 100644 --- a/Src/MainFrm.h +++ b/Src/MainFrm.h @@ -426,7 +426,6 @@ class CMainFrame : public CMDIFrameWnd afx_msg LRESULT OnChildFrameRemoved(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnChildFrameActivate(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnChildFrameActivated(WPARAM wParam, LPARAM lParam); - afx_msg void OnCommandBarMenuItem(UINT nID); afx_msg void OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI); //}}AFX_MSG DECLARE_MESSAGE_MAP() diff --git a/Src/Merge.rc b/Src/Merge.rc index 241a7606321..a527f9581a6 100644 --- a/Src/Merge.rc +++ b/Src/Merge.rc @@ -1690,6 +1690,7 @@ BEGIN CONTROL "C&ustom folder:",IDC_STATIC,"Button",BS_AUTORADIOBUTTON,17,114,253,10 EDITTEXT IDC_TMPFOLDER_NAME,27,126,191,14,ES_AUTOHSCROLL | WS_GROUP PUSHBUTTON "Br&owse...",IDC_TMPFOLDER_BROWSE,224,126,50,14 + PUSHBUTTON "Defaults", IDC_COMPARE_DEFAULTS, 191, 228, 88, 14 END IDD_GENERATE_PATCH DIALOGEX 0, 0, 340, 190 @@ -2277,6 +2278,7 @@ BEGIN LTEXT "Backup filename:",IDC_STATIC,7,96,269,10 CONTROL "&Append .bak extension",IDC_BACKUP_APPEND_BAK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,108,259,10 CONTROL "A&ppend timestamp",IDC_BACKUP_APPEND_TIME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,120,259,10 + PUSHBUTTON "Defaults", IDC_COMPARE_DEFAULTS, 191, 228, 88, 14 END IDD_CONFIRM_COPY DIALOGEX 0, 0, 285, 115 diff --git a/Src/Merge.vcxproj.filters b/Src/Merge.vcxproj.filters index 40704962b1b..29c634ad893 100644 --- a/Src/Merge.vcxproj.filters +++ b/Src/Merge.vcxproj.filters @@ -729,6 +729,9 @@ MFCGui\Common\Source Files + + MFCGui\Common\Source Files + @@ -1394,6 +1397,9 @@ MFCGui\Common\Header Files + + MFCGui\Common\Header Files + From c4b9f482e8069267600c1bbafe2b071dc6d49b29 Mon Sep 17 00:00:00 2001 From: sdottaka Date: Tue, 13 Aug 2024 18:37:13 +0900 Subject: [PATCH 06/14] WIP --- Src/CommandBar.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Src/CommandBar.cpp b/Src/CommandBar.cpp index c617e0c2904..9c2cd41c998 100644 --- a/Src/CommandBar.cpp +++ b/Src/CommandBar.cpp @@ -13,6 +13,10 @@ static const UINT UWM_SHOWPOPUPMENU = WM_APP + 1; HHOOK CCommandBar::m_hHook = nullptr; CCommandBar* CCommandBar::m_pThis = nullptr; +#ifndef TBCDRF_USECDCOLORS +#define TBCDRF_USECDCOLORS 0x00800000 +#endif + IMPLEMENT_DYNAMIC(CCommandBar, CToolBar) BEGIN_MESSAGE_MAP(CCommandBar, CToolBar) From 5f69d873c777a3320086347eb068bb867730ff8a Mon Sep 17 00:00:00 2001 From: sdottaka Date: Tue, 13 Aug 2024 20:34:43 +0900 Subject: [PATCH 07/14] WIP --- Src/CommandBar.cpp | 22 ++++++++++++++++------ Src/CommandBar.h | 1 + 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Src/CommandBar.cpp b/Src/CommandBar.cpp index 9c2cd41c998..3b436f9af40 100644 --- a/Src/CommandBar.cpp +++ b/Src/CommandBar.cpp @@ -169,14 +169,19 @@ static bool IsMDIChildMaximized() return bMaximized; } +void CCommandBar::ShowKeyboardCues(bool show) +{ + m_bShowKeyboardCues = show; + GetToolBarCtrl().SetDrawTextFlags(DT_HIDEPREFIX, show ? 0 : DT_HIDEPREFIX); + Invalidate(); +} + void CCommandBar::LoseFocus() { m_bActive = false; m_hwndOldFocus = nullptr; - m_bShowKeyboardCues = false; - GetToolBarCtrl().SetDrawTextFlags(DT_HIDEPREFIX, DT_HIDEPREFIX); + ShowKeyboardCues(false); GetToolBarCtrl().SetHotItem(-1); - Invalidate(); } void CCommandBar::OnSetFocus(CWnd* pOldWnd) @@ -293,6 +298,12 @@ void CCommandBar::OnCommandBarMenuItem(UINT nID) m_hCurrentPopupMenu = pPopup->m_hMenu; m_pThis = this; + if (m_bShowKeyboardCues) + { + AfxGetMainWnd()->PostMessage(WM_KEYDOWN, VK_DOWN, 0); + AfxGetMainWnd()->PostMessage(WM_KEYUP, VK_DOWN, 0); + } + m_hHook = SetWindowsHookEx(WH_MSGFILTER, MsgFilterProc, nullptr, GetCurrentThreadId()); CRect rc; @@ -322,9 +333,7 @@ BOOL CCommandBar::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_SYSKEYDOWN) { - m_bShowKeyboardCues = true; - GetToolBarCtrl().SetDrawTextFlags(DT_HIDEPREFIX, 0); - Invalidate(); + ShowKeyboardCues(true); } else if (pMsg->message == WM_SYSKEYUP && m_bShowKeyboardCues) { @@ -338,6 +347,7 @@ BOOL CCommandBar::PreTranslateMessage(MSG* pMsg) UINT uId = 0; if ((pMsg->message == WM_SYSKEYDOWN) && GetToolBarCtrl().MapAccelerator(static_cast(pMsg->wParam), &uId) != 0) { + ShowKeyboardCues(true); OnCommandBarMenuItem(uId); return TRUE; } diff --git a/Src/CommandBar.h b/Src/CommandBar.h index 182774d132a..d52749495b2 100644 --- a/Src/CommandBar.h +++ b/Src/CommandBar.h @@ -42,6 +42,7 @@ class CCommandBar : public CToolBar int GetMDIButtonIndexFromPoint(CPoint pt) const; CRect GetMDIButtonsRect() const; CRect GetMDIButtonRect(int nItem) const; + void ShowKeyboardCues(bool show); void LoseFocus(); HMENU m_hMenu; From a406814be101e54278613c7b24a6970520019f26 Mon Sep 17 00:00:00 2001 From: sdottaka Date: Tue, 13 Aug 2024 22:41:47 +0900 Subject: [PATCH 08/14] WIP --- Src/CommandBar.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Src/CommandBar.cpp b/Src/CommandBar.cpp index 3b436f9af40..9e95c7ba652 100644 --- a/Src/CommandBar.cpp +++ b/Src/CommandBar.cpp @@ -119,11 +119,10 @@ void CCommandBar::DrawMDIButtons(HDC hDC) DFCS_CAPTIONCLOSE | DFCS_FLAT | (m_nMDIButtonDown == 2 ? DFCS_PUSHED : 0) }; CRect rcButtons = GetMDIButtonsRect(); - CRect rcItem; - GetToolBarCtrl().GetItemRect(0, &rcItem); - const int bw = rcItem.Height(); - const int w = rcButtons.Height(); - CRect rc{ rcButtons.left, rcButtons.top + (w - bw) / 2, rcButtons.left + bw, rcButtons.top + (w + bw) / 2}; + const int bw = GetSystemMetrics(SM_CXSMICON); + const int w = bw + GetSystemMetrics(SM_CXBORDER) * 2; + const int h = rcButtons.Height(); + CRect rc{ rcButtons.left, rcButtons.top + (h - bw) / 2, rcButtons.left + bw, rcButtons.top + (h + bw) / 2}; for (int i = 0; i < 3; ++i) { ::DrawFrameControl(hDC, rc, DFC_CAPTION, nTypes[i]); @@ -149,13 +148,14 @@ CRect CCommandBar::GetMDIButtonsRect() const { CRect rcClient; GetClientRect(&rcClient); - return { rcClient.right - rcClient.Height() * 3, rcClient.top, rcClient.right, rcClient.bottom }; + const int w = GetSystemMetrics(SM_CXSMICON) + GetSystemMetrics(SM_CXBORDER) * 2; + return { rcClient.right - w * 3, rcClient.top, rcClient.right, rcClient.bottom }; } CRect CCommandBar::GetMDIButtonRect(int nItem) const { CRect rcButtons = GetMDIButtonsRect(); - const int w = rcButtons.Height(); + const int w = GetSystemMetrics(SM_CXSMICON) + GetSystemMetrics(SM_CXBORDER) * 2; return { rcButtons.left + w * nItem, rcButtons.top, rcButtons.left + w * nItem + w, rcButtons.bottom }; } From e8071cc89af0e75178c8f31fb505865ead985261 Mon Sep 17 00:00:00 2001 From: sdottaka Date: Wed, 14 Aug 2024 18:42:38 +0900 Subject: [PATCH 09/14] WIP --- Src/MainFrm.cpp | 34 +++++++------ Src/MainFrm.h | 14 +++--- Src/{CommandBar.cpp => MenuBar.cpp} | 76 +++++++++++++++-------------- Src/{CommandBar.h => MenuBar.h} | 21 ++++---- Src/Merge.vcxproj | 6 ++- Src/Merge.vcxproj.filters | 10 +++- Src/MyReBar.cpp | 72 +++++++++++++++++++++++++++ Src/MyReBar.h | 16 ++++++ Src/OptionsDef.h | 1 + Src/OptionsInit.cpp | 1 + 10 files changed, 181 insertions(+), 70 deletions(-) rename Src/{CommandBar.cpp => MenuBar.cpp} (83%) rename Src/{CommandBar.h => MenuBar.h} (78%) create mode 100644 Src/MyReBar.cpp create mode 100644 Src/MyReBar.h diff --git a/Src/MainFrm.cpp b/Src/MainFrm.cpp index 0d506e11461..707f03a639b 100644 --- a/Src/MainFrm.cpp +++ b/Src/MainFrm.cpp @@ -220,7 +220,7 @@ BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) ON_MESSAGE(WM_COPYDATA, OnCopyData) ON_MESSAGE(WM_USER+1, OnUser1) ON_WM_ACTIVATEAPP() - ON_UPDATE_COMMAND_UI_RANGE(CCommandBar::FIRST_MENUID, CCommandBar::FIRST_MENUID + 10, OnUpdateCommandBarMenuItem) + ON_UPDATE_COMMAND_UI_RANGE(CMenuBar::FIRST_MENUID, CMenuBar::FIRST_MENUID + 10, OnUpdateMenuBarMenuItem) // [File] menu ON_COMMAND(ID_FILE_NEW, (OnFileNew<2, ID_MERGE_COMPARE_TEXT>)) ON_COMMAND(ID_FILE_NEW_TABLE, (OnFileNew<2, ID_MERGE_COMPARE_TABLE>)) @@ -289,6 +289,7 @@ BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) ON_COMMAND(ID_LASTFILE, OnLastFile) ON_UPDATE_COMMAND_UI(ID_LASTFILE, OnUpdateLastFile) // Tool bar drop-down menu + ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_MENUBAR, OnMenubarButtonDropDown) ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarButtonDropDown) ON_COMMAND_RANGE(ID_DIFF_OPTIONS_WHITESPACE_COMPARE, ID_DIFF_OPTIONS_WHITESPACE_IGNOREALL, OnDiffWhitespace) ON_UPDATE_COMMAND_UI_RANGE(ID_DIFF_OPTIONS_WHITESPACE_COMPARE, ID_DIFF_OPTIONS_WHITESPACE_IGNOREALL, OnUpdateDiffWhitespace) @@ -447,9 +448,9 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) return 0; } -void CMainFrame::OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI) +void CMainFrame::OnUpdateMenuBarMenuItem(CCmdUI* pCmdUI) { - m_wndCommandBar.OnUpdateCommandBarMenuItem(pCmdUI); + m_wndMenuBar.OnUpdateMenuBarMenuItem(pCmdUI); } void CMainFrame::OnTimer(UINT_PTR nIDEvent) @@ -1688,6 +1689,8 @@ void CMainFrame::OnClose() theApp.WriteProfileInt(_T("Settings"), _T("MainBottom"),wp.rcNormalPosition.bottom); theApp.WriteProfileInt(_T("Settings"), _T("MainMax"), (wp.showCmd == SW_MAXIMIZE)); + GetOptionsMgr()->SaveOption(OPT_REBAR_STATE, m_wndReBar.MakeStateString()); + for (auto pFrame: GetAllImgMergeFrames()) { if (!pFrame->CloseNow()) @@ -2173,7 +2176,7 @@ void CMainFrame::SelectFilter() */ BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { - if (m_wndCommandBar.PreTranslateMessage(pMsg)) + if (m_wndMenuBar.PreTranslateMessage(pMsg)) return TRUE; // Check if we got 'ESC pressed' -message if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_ESCAPE)) @@ -2478,7 +2481,7 @@ void CMainFrame::OnActivateApp(BOOL bActive, DWORD dwThreadID) BOOL CMainFrame::CreateToolbar() { - if (!m_wndCommandBar.Create(this)) + if (!m_wndMenuBar.Create(this)) { return FALSE; } @@ -2496,13 +2499,13 @@ BOOL CMainFrame::CreateToolbar() } // Remove this if you don't want tool tips or a resizable toolbar - m_wndCommandBar.SetBarStyle(m_wndCommandBar.GetBarStyle() | - CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); + m_wndMenuBar.SetBarStyle(m_wndMenuBar.GetBarStyle() | + CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS); - m_wndReBar.AddBar(&m_wndCommandBar); + m_wndReBar.AddBar(&m_wndMenuBar); m_wndReBar.AddBar(&m_wndToolBar, nullptr, nullptr, RBBS_GRIPPERALWAYS | RBBS_FIXEDBMP | RBBS_BREAK); LoadToolbarImages(); @@ -2522,7 +2525,9 @@ BOOL CMainFrame::CreateToolbar() __super::ShowControlBar(&m_wndToolBar, false, 0); } - __super::ShowControlBar(&m_wndCommandBar, true, 0); + __super::ShowControlBar(&m_wndMenuBar, true, 0); + + m_wndReBar.SetStateString(GetOptionsMgr()->GetString(OPT_REBAR_STATE).c_str()); return TRUE; } @@ -2932,6 +2937,12 @@ void CMainFrame::OnPluginsList() dlg.DoModal(); } +void CMainFrame::OnMenubarButtonDropDown(NMHDR* pNMHDR, LRESULT* pResult) +{ + m_wndMenuBar.OnMenuBarMenuItem(reinterpret_cast(pNMHDR)->iItem); + *pResult = 0; +} + void CMainFrame::OnToolbarButtonDropDown(NMHDR* pNMHDR, LRESULT* pResult) { LPNMTOOLBAR pToolBar = reinterpret_cast(pNMHDR); @@ -2950,11 +2961,6 @@ void CMainFrame::OnToolbarButtonDropDown(NMHDR* pNMHDR, LRESULT* pResult) id = IDR_POPUP_SAVE; break; default: - if (pToolBar->iItem >= CCommandBar::FIRST_MENUID && pToolBar->iItem < CCommandBar::FIRST_MENUID + 10) - { - m_wndCommandBar.OnCommandBarMenuItem(pToolBar->iItem); - return; - } id = IDR_POPUP_DIFF_OPTIONS; break; } diff --git a/Src/MainFrm.h b/Src/MainFrm.h index d95b4672148..c1b4046959a 100644 --- a/Src/MainFrm.h +++ b/Src/MainFrm.h @@ -14,7 +14,8 @@ #include #include #include -#include "CommandBar.h" +#include "MyReBar.h" +#include "MenuBar.h" #include "MDITabBar.h" #include "BasicFlatStatusBar.h" #include "PathContext.h" @@ -223,7 +224,7 @@ class CMainFrame : public CMDIFrameWnd DirWatcher* GetDirWatcher() { return m_pDirWatcher.get(); } void WatchDocuments(IMergeDoc* pMergeDoc); void UnwatchDocuments(IMergeDoc* pMergeDoc); - CCommandBar* GetCommandBar() { return &m_wndCommandBar; } + CMenuBar* GetMenuBar() { return &m_wndMenuBar; } CToolBar* GetToolbar() { return &m_wndToolBar; } static void WaitAndDoMessageLoop(bool& completed, int ms); @@ -250,8 +251,8 @@ class CMainFrame : public CMDIFrameWnd protected: // control bar embedded members CBasicFlatStatusBar m_wndStatusBar; - CReBar m_wndReBar; - CCommandBar m_wndCommandBar; + CMyReBar m_wndReBar; + CMenuBar m_wndMenuBar; CToolBar m_wndToolBar; CMDITabBar m_wndTabBar; CTypedPtrArray m_arrChild; @@ -279,7 +280,7 @@ class CMainFrame : public CMDIFrameWnd } case WM_MDISETMENU: GetMainFrame()->SetMenuBarState(AFX_MBS_HIDDEN); - GetMainFrame()->GetCommandBar()->AttachMenu(CMenu::FromHandle(reinterpret_cast(wParam))); + GetMainFrame()->GetMenuBar()->AttachMenu(CMenu::FromHandle(reinterpret_cast(wParam))); return TRUE; break; case WM_TIMER: @@ -391,6 +392,7 @@ class CMainFrame : public CMDIFrameWnd afx_msg void OnUpdatePluginName(CCmdUI* pCmdUI); afx_msg void OnUpdateStatusNum(CCmdUI* pCmdUI); afx_msg void OnToolbarButtonDropDown(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnMenubarButtonDropDown(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnDiffWhitespace(UINT nID); afx_msg void OnUpdateDiffWhitespace(CCmdUI* pCmdUI); afx_msg void OnDiffIgnoreBlankLines(); @@ -426,7 +428,7 @@ class CMainFrame : public CMDIFrameWnd afx_msg LRESULT OnChildFrameRemoved(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnChildFrameActivate(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnChildFrameActivated(WPARAM wParam, LPARAM lParam); - afx_msg void OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI); + afx_msg void OnUpdateMenuBarMenuItem(CCmdUI* pCmdUI); //}}AFX_MSG DECLARE_MESSAGE_MAP() diff --git a/Src/CommandBar.cpp b/Src/MenuBar.cpp similarity index 83% rename from Src/CommandBar.cpp rename to Src/MenuBar.cpp index 9e95c7ba652..6651f90bff6 100644 --- a/Src/CommandBar.cpp +++ b/Src/MenuBar.cpp @@ -1,25 +1,25 @@ // Copyright (c) 2024 Takashi Sawanaka // SPDX-License-Identifier: BSL-1.0 /** - * @file CommandBar.cpp + * @file MenuBar.cpp * - * @brief Implementation of the CCommandBar class + * @brief Implementation of the CMenuBar class */ #include "StdAfx.h" -#include "CommandBar.h" +#include "MenuBar.h" static const UINT UWM_SHOWPOPUPMENU = WM_APP + 1; -HHOOK CCommandBar::m_hHook = nullptr; -CCommandBar* CCommandBar::m_pThis = nullptr; +HHOOK CMenuBar::m_hHook = nullptr; +CMenuBar* CMenuBar::m_pThis = nullptr; #ifndef TBCDRF_USECDCOLORS #define TBCDRF_USECDCOLORS 0x00800000 #endif -IMPLEMENT_DYNAMIC(CCommandBar, CToolBar) +IMPLEMENT_DYNAMIC(CMenuBar, CToolBar) -BEGIN_MESSAGE_MAP(CCommandBar, CToolBar) +BEGIN_MESSAGE_MAP(CMenuBar, CToolBar) ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) ON_WM_KILLFOCUS() ON_WM_SETFOCUS() @@ -30,7 +30,7 @@ BEGIN_MESSAGE_MAP(CCommandBar, CToolBar) ON_MESSAGE(UWM_SHOWPOPUPMENU, OnShowPopupMenu) END_MESSAGE_MAP() -CCommandBar::CCommandBar() +CMenuBar::CMenuBar() : m_hMenu(nullptr) , m_bActive(false) , m_bMouseTracking(false) @@ -51,10 +51,10 @@ static TBBUTTON makeTBButton(int id, const TCHAR* str) return btn; } -BOOL CCommandBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID) +BOOL CMenuBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID) { - bool ret = __super::CreateEx(pParentWnd, TBSTYLE_FLAT | TBSTYLE_LIST | TBSTYLE_TRANSPARENT, dwStyle, - CRect(0, 0, 0, 0), nID); + bool ret = __super::CreateEx(pParentWnd, TBSTYLE_FLAT | TBSTYLE_LIST | TBSTYLE_TRANSPARENT, + dwStyle, CRect(0, 0, 0, 0), nID); CToolBarCtrl& toolbar = GetToolBarCtrl(); TEXTMETRIC tm; @@ -75,7 +75,7 @@ BOOL CCommandBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID) return ret; } -bool CCommandBar::AttachMenu(CMenu* pMenu) +bool CMenuBar::AttachMenu(CMenu* pMenu) { CToolBarCtrl& toolbar = GetToolBarCtrl(); @@ -111,7 +111,7 @@ bool CCommandBar::AttachMenu(CMenu* pMenu) return true; } -void CCommandBar::DrawMDIButtons(HDC hDC) +void CMenuBar::DrawMDIButtons(HDC hDC) { const int nTypes[3] = { DFCS_CAPTIONMIN | DFCS_FLAT | (m_nMDIButtonDown == 0 ? DFCS_PUSHED : 0), @@ -131,7 +131,7 @@ void CCommandBar::DrawMDIButtons(HDC hDC) } } -int CCommandBar::GetMDIButtonIndexFromPoint(CPoint pt) const +int CMenuBar::GetMDIButtonIndexFromPoint(CPoint pt) const { CRect rcButtons = GetMDIButtonsRect(); if (!rcButtons.PtInRect(pt)) @@ -144,7 +144,7 @@ int CCommandBar::GetMDIButtonIndexFromPoint(CPoint pt) const return -1; } -CRect CCommandBar::GetMDIButtonsRect() const +CRect CMenuBar::GetMDIButtonsRect() const { CRect rcClient; GetClientRect(&rcClient); @@ -152,7 +152,7 @@ CRect CCommandBar::GetMDIButtonsRect() const return { rcClient.right - w * 3, rcClient.top, rcClient.right, rcClient.bottom }; } -CRect CCommandBar::GetMDIButtonRect(int nItem) const +CRect CMenuBar::GetMDIButtonRect(int nItem) const { CRect rcButtons = GetMDIButtonsRect(); const int w = GetSystemMetrics(SM_CXSMICON) + GetSystemMetrics(SM_CXBORDER) * 2; @@ -169,14 +169,14 @@ static bool IsMDIChildMaximized() return bMaximized; } -void CCommandBar::ShowKeyboardCues(bool show) +void CMenuBar::ShowKeyboardCues(bool show) { m_bShowKeyboardCues = show; GetToolBarCtrl().SetDrawTextFlags(DT_HIDEPREFIX, show ? 0 : DT_HIDEPREFIX); Invalidate(); } -void CCommandBar::LoseFocus() +void CMenuBar::LoseFocus() { m_bActive = false; m_hwndOldFocus = nullptr; @@ -184,20 +184,20 @@ void CCommandBar::LoseFocus() GetToolBarCtrl().SetHotItem(-1); } -void CCommandBar::OnSetFocus(CWnd* pOldWnd) +void CMenuBar::OnSetFocus(CWnd* pOldWnd) { m_bActive = true; m_hwndOldFocus = pOldWnd->m_hWnd; __super::OnSetFocus(pOldWnd); } -void CCommandBar::OnKillFocus(CWnd* pNewWnd) +void CMenuBar::OnKillFocus(CWnd* pNewWnd) { LoseFocus(); __super::OnKillFocus(pNewWnd); } -void CCommandBar::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) +void CMenuBar::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { LPNMTBCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); DWORD dwDrawState = pNMCD->nmcd.dwDrawStage; @@ -220,7 +220,7 @@ void CCommandBar::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) *pResult = 0; } -void CCommandBar::OnMouseMove(UINT nFlags, CPoint point) +void CMenuBar::OnMouseMove(UINT nFlags, CPoint point) { CRect rcMDIButtons = GetMDIButtonsRect(); InvalidateRect(&rcMDIButtons); @@ -233,7 +233,7 @@ void CCommandBar::OnMouseMove(UINT nFlags, CPoint point) __super::OnMouseMove(nFlags, point); } -void CCommandBar::OnMouseLeave() +void CMenuBar::OnMouseLeave() { TRACKMOUSEEVENT tme = { sizeof(TRACKMOUSEEVENT), TME_LEAVE | TME_CANCEL, m_hWnd }; TrackMouseEvent(&tme); @@ -244,7 +244,7 @@ void CCommandBar::OnMouseLeave() __super::OnMouseLeave(); } -void CCommandBar::OnLButtonDown(UINT nFlags, CPoint point) +void CMenuBar::OnLButtonDown(UINT nFlags, CPoint point) { CRect rcButtons = GetMDIButtonsRect(); if (rcButtons.PtInRect(point)) @@ -256,7 +256,7 @@ void CCommandBar::OnLButtonDown(UINT nFlags, CPoint point) __super::OnLButtonDown(nFlags, point); } -void CCommandBar::OnLButtonUp(UINT nFlags, CPoint point) +void CMenuBar::OnLButtonUp(UINT nFlags, CPoint point) { CRect rcButtons = GetMDIButtonsRect(); if (m_nMDIButtonDown != -1 && rcButtons.PtInRect(point)) @@ -284,7 +284,7 @@ void CCommandBar::OnLButtonUp(UINT nFlags, CPoint point) __super::OnLButtonUp(nFlags, point); } -void CCommandBar::OnCommandBarMenuItem(UINT nID) +void CMenuBar::OnMenuBarMenuItem(UINT nID) { const int nHotItem = nID - FIRST_MENUID; CMenu* pPopup = CMenu::FromHandle(::GetSubMenu(m_hMenu, nHotItem)); @@ -296,6 +296,7 @@ void CCommandBar::OnCommandBarMenuItem(UINT nID) m_nCurrentMenuItemFlags = 0; m_nCurrentHotItem = nHotItem; m_hCurrentPopupMenu = pPopup->m_hMenu; + m_ptCurrentCursor = {}; m_pThis = this; if (m_bShowKeyboardCues) @@ -309,23 +310,23 @@ void CCommandBar::OnCommandBarMenuItem(UINT nID) CRect rc; toolbar.GetItemRect(nHotItem, &rc); ClientToScreen(&rc); - pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rc.left, rc.bottom, AfxGetMainWnd()); + pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rc.left, rc.bottom, AfxGetMainWnd()); UnhookWindowsHookEx(m_hHook); } -void CCommandBar::OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI) +void CMenuBar::OnUpdateMenuBarMenuItem(CCmdUI* pCmdUI) { pCmdUI->Enable(); } -LRESULT CCommandBar::OnShowPopupMenu(WPARAM wParam, LPARAM lParam) +LRESULT CMenuBar::OnShowPopupMenu(WPARAM wParam, LPARAM lParam) { - OnCommandBarMenuItem(static_cast(wParam)); + OnMenuBarMenuItem(static_cast(wParam)); return 0; } -BOOL CCommandBar::PreTranslateMessage(MSG* pMsg) +BOOL CMenuBar::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_SYSKEYDOWN || pMsg->message == WM_SYSKEYUP) { @@ -348,7 +349,7 @@ BOOL CCommandBar::PreTranslateMessage(MSG* pMsg) if ((pMsg->message == WM_SYSKEYDOWN) && GetToolBarCtrl().MapAccelerator(static_cast(pMsg->wParam), &uId) != 0) { ShowKeyboardCues(true); - OnCommandBarMenuItem(uId); + OnMenuBarMenuItem(uId); return TRUE; } } @@ -361,14 +362,14 @@ BOOL CCommandBar::PreTranslateMessage(MSG* pMsg) } else if (pMsg->wParam == VK_RETURN) { - OnCommandBarMenuItem(FIRST_MENUID + GetToolBarCtrl().GetHotItem()); + OnMenuBarMenuItem(FIRST_MENUID + GetToolBarCtrl().GetHotItem()); } return TRUE; } return FALSE; } -LRESULT CALLBACK CCommandBar::MsgFilterProc(int nCode, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK CMenuBar::MsgFilterProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode != MSGF_MENU) return CallNextHookEx(m_hHook, nCode, wParam, lParam); @@ -391,8 +392,11 @@ LRESULT CALLBACK CCommandBar::MsgFilterProc(int nCode, WPARAM wParam, LPARAM lPa { CRect rc; m_pThis->GetWindowRect(&rc); - CPoint pt{ GET_X_LPARAM(pMsg->lParam) - rc.left, GET_Y_LPARAM(pMsg->lParam) - rc.top }; - const int nItem = m_pThis->GetToolBarCtrl().HitTest(&pt); + CPoint ptPrev = m_pThis->m_ptCurrentCursor; + m_pThis->m_ptCurrentCursor = { GET_X_LPARAM(pMsg->lParam) - rc.left, GET_Y_LPARAM(pMsg->lParam) - rc.top }; + if (ptPrev == CPoint{} || ptPrev == m_pThis->m_ptCurrentCursor) + return 0; + const int nItem = m_pThis->GetToolBarCtrl().HitTest(&m_pThis->m_ptCurrentCursor); if (nItem >= 0 && m_pThis->m_nCurrentHotItem != nItem) { AfxGetMainWnd()->PostMessage(WM_CANCELMODE); diff --git a/Src/CommandBar.h b/Src/MenuBar.h similarity index 78% rename from Src/CommandBar.h rename to Src/MenuBar.h index d52749495b2..ee4d29f33e5 100644 --- a/Src/CommandBar.h +++ b/Src/MenuBar.h @@ -1,7 +1,7 @@ /** - * @file CommandBar.h + * @file MenuBar.h * - * @brief Declaration file for CCommandBar + * @brief Declaration file for CMenuBar * */ #pragma once @@ -10,22 +10,22 @@ #include #include -class CCommandBar : public CToolBar +class CMenuBar : public CToolBar { - DECLARE_DYNAMIC(CCommandBar) + DECLARE_DYNAMIC(CMenuBar) public: constexpr static int FIRST_MENUID = 10000; - CCommandBar(); + CMenuBar(); - virtual BOOL Create(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, UINT nID = AFX_IDW_TOOLBAR); + virtual BOOL Create(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, UINT nID = AFX_IDW_MENUBAR); bool AttachMenu(CMenu* pMenu); - void OnCommandBarMenuItem(UINT nID); - void OnUpdateCommandBarMenuItem(CCmdUI* pCmdUI); + void OnMenuBarMenuItem(UINT nID); + void OnUpdateMenuBarMenuItem(CCmdUI* pCmdUI); BOOL PreTranslateMessage(MSG* pMsg); protected: - //{{AFX_MSG(CCommandBar) + //{{AFX_MSG(CMenuBar) afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnSetFocus(CWnd* pOldWnd); afx_msg void OnKillFocus(CWnd* pNewWnd); @@ -54,6 +54,7 @@ class CCommandBar : public CToolBar int m_nCurrentHotItem; UINT m_nCurrentMenuItemFlags; HMENU m_hCurrentPopupMenu; + CPoint m_ptCurrentCursor; static HHOOK m_hHook; - static CCommandBar* m_pThis; + static CMenuBar* m_pThis; }; \ No newline at end of file diff --git a/Src/Merge.vcxproj b/Src/Merge.vcxproj index 01c8eb19205..17dc1c6a1bb 100644 --- a/Src/Merge.vcxproj +++ b/Src/Merge.vcxproj @@ -946,6 +946,7 @@ $(IntDir)$(TargetName)2.pch + @@ -1445,7 +1446,7 @@ - + @@ -1465,6 +1466,7 @@ + @@ -1658,7 +1660,7 @@ - + diff --git a/Src/Merge.vcxproj.filters b/Src/Merge.vcxproj.filters index 29c634ad893..7d185baf24c 100644 --- a/Src/Merge.vcxproj.filters +++ b/Src/Merge.vcxproj.filters @@ -729,7 +729,10 @@ MFCGui\Common\Source Files - + + MFCGui\Common\Source Files + + MFCGui\Common\Source Files @@ -1397,7 +1400,10 @@ MFCGui\Common\Header Files - + + MFCGui\Common\Header Files + + MFCGui\Common\Header Files diff --git a/Src/MyReBar.cpp b/Src/MyReBar.cpp new file mode 100644 index 00000000000..a19478970d1 --- /dev/null +++ b/Src/MyReBar.cpp @@ -0,0 +1,72 @@ +#include "StdAfx.h" +#include "MyReBar.h" + +BEGIN_MESSAGE_MAP(CMyReBar, CReBar) + ON_WM_ERASEBKGND() +END_MESSAGE_MAP() + +CMyReBar::CMyReBar() +{ +} + +BOOL CMyReBar::OnEraseBkgnd(CDC* pDC) +{ + CRect rect; + GetClientRect(&rect); + pDC->FillSolidRect(&rect, GetSysColor(COLOR_3DHIGHLIGHT)); + return TRUE; +} + +void CMyReBar::SetStateString(const CString& state) +{ + constexpr int BARCOUNT_MAX = 4; + unsigned count = 0; + unsigned id[BARCOUNT_MAX]{}; + int cx[BARCOUNT_MAX]{-1, -1}; + _stscanf_s(state, _T("%u,%u,%d,%u,%d,%u,%d,%u,%d"), &count, &id[0], &cx[0], &id[1], &cx[1], &id[2], &cx[2], &id[3], &cx[3]); + count = (count > BARCOUNT_MAX) ? BARCOUNT_MAX : count; + CReBarCtrl& rebar = GetReBarCtrl(); + const unsigned nBarCount = rebar.GetBandCount(); + for (unsigned i = 0; i < count; ++i) + { + for (unsigned j = i; j < nBarCount; ++j) + { + REBARBANDINFO rbi{ sizeof(REBARBANDINFO), RBBIM_CHILD | RBBIM_SIZE | RBBIM_STYLE }; + rebar.GetBandInfo(j, &rbi); + if (id[i] != 0 && id[i] == static_cast(GetWindowLong(rbi.hwndChild, GWL_ID))) + { + if (j != i) + rebar.MoveBand(j, i); + if (cx[i] < 0) + { + rbi.fStyle |= RBBS_BREAK; + rbi.cx = -cx[i]; + } + else + { + rbi.fStyle &= ~RBBS_BREAK; + rbi.cx = cx[i]; + } + rbi.fMask &= ~RBBIM_CHILD; + rebar.SetBandInfo(i, &rbi); + } + } + } +} + +CString CMyReBar::MakeStateString() +{ + CReBarCtrl& rebar = GetReBarCtrl(); + const unsigned nCount = rebar.GetBandCount(); + CString state; + state.AppendFormat(_T("%d"), nCount); + for (unsigned i = 0; i < nCount; ++i) + { + REBARBANDINFO rbi{ sizeof(REBARBANDINFO), RBBIM_CHILD | RBBIM_SIZE | RBBIM_STYLE }; + rebar.GetBandInfo(i, &rbi); + state.AppendFormat(_T(",%u,%d"), + GetWindowLong(rbi.hwndChild, GWL_ID), + ((rbi.fStyle & RBBS_BREAK) != 0) ? -static_cast(rbi.cx) : rbi.cx); + } + return state; +} \ No newline at end of file diff --git a/Src/MyReBar.h b/Src/MyReBar.h new file mode 100644 index 00000000000..45e44814408 --- /dev/null +++ b/Src/MyReBar.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +class CMyReBar : public CReBar +{ +public: + CMyReBar(); + void SetStateString(const CString& state); + CString MakeStateString(); + +protected: + afx_msg BOOL OnEraseBkgnd(CDC* pDC); + DECLARE_MESSAGE_MAP() +}; \ No newline at end of file diff --git a/Src/OptionsDef.h b/Src/OptionsDef.h index 2ab3fbb5901..397157726bb 100644 --- a/Src/OptionsDef.h +++ b/Src/OptionsDef.h @@ -30,6 +30,7 @@ inline const String OPT_TREE_MODE {_T("Settings/TreeMode"s)}; inline const String OPT_SHOW_TOOLBAR {_T("Settings/ShowToolbar"s)}; inline const String OPT_SHOW_STATUSBAR {_T("Settings/ShowStatusbar"s)}; inline const String OPT_SHOW_TABBAR {_T("Settings/ShowTabbar"s)}; +inline const String OPT_REBAR_STATE {_T("Settings/ReBarState"s)}; inline const String OPT_TOOLBAR_SIZE {_T("Settings/ToolbarSize"s)}; inline const String OPT_RESIZE_PANES {_T("Settings/AutoResizePanes"s)}; diff --git a/Src/OptionsInit.cpp b/Src/OptionsInit.cpp index 63b605e1618..c3c10defca4 100644 --- a/Src/OptionsInit.cpp +++ b/Src/OptionsInit.cpp @@ -64,6 +64,7 @@ void Init(COptionsMgr *pOptions) pOptions->InitOption(OPT_SHOW_TOOLBAR, true); pOptions->InitOption(OPT_SHOW_STATUSBAR, true); pOptions->InitOption(OPT_SHOW_TABBAR, true); + pOptions->InitOption(OPT_REBAR_STATE, _T("")); pOptions->InitOption(OPT_TOOLBAR_SIZE, 0, 0, 2); pOptions->InitOption(OPT_RESIZE_PANES, false); From 9d37e043039431c822bae15860bc18af0f59c6cf Mon Sep 17 00:00:00 2001 From: sdottaka Date: Wed, 14 Aug 2024 20:19:26 +0900 Subject: [PATCH 10/14] WIP --- Src/MenuBar.cpp | 36 +++++++++++++++++++++--------------- Src/MenuBar.h | 1 + 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Src/MenuBar.cpp b/Src/MenuBar.cpp index 6651f90bff6..606aa5539d1 100644 --- a/Src/MenuBar.cpp +++ b/Src/MenuBar.cpp @@ -35,6 +35,7 @@ CMenuBar::CMenuBar() , m_bActive(false) , m_bMouseTracking(false) , m_nMDIButtonDown(-1) + , m_nMDIButtonHot(-1) , m_hwndOldFocus(nullptr) , m_nCurrentMenuItemFlags(0) , m_nCurrentHotItem(-1) @@ -113,11 +114,7 @@ bool CMenuBar::AttachMenu(CMenu* pMenu) void CMenuBar::DrawMDIButtons(HDC hDC) { - const int nTypes[3] = { - DFCS_CAPTIONMIN | DFCS_FLAT | (m_nMDIButtonDown == 0 ? DFCS_PUSHED : 0), - DFCS_CAPTIONRESTORE | DFCS_FLAT | (m_nMDIButtonDown == 1 ? DFCS_PUSHED : 0), - DFCS_CAPTIONCLOSE | DFCS_FLAT | (m_nMDIButtonDown == 2 ? DFCS_PUSHED : 0) - }; + int nTypes[3] = { DFCS_CAPTIONMIN | DFCS_FLAT, DFCS_CAPTIONRESTORE | DFCS_FLAT, DFCS_CAPTIONCLOSE | DFCS_FLAT }; CRect rcButtons = GetMDIButtonsRect(); const int bw = GetSystemMetrics(SM_CXSMICON); const int w = bw + GetSystemMetrics(SM_CXBORDER) * 2; @@ -125,6 +122,10 @@ void CMenuBar::DrawMDIButtons(HDC hDC) CRect rc{ rcButtons.left, rcButtons.top + (h - bw) / 2, rcButtons.left + bw, rcButtons.top + (h + bw) / 2}; for (int i = 0; i < 3; ++i) { + if (m_nMDIButtonDown == i) + nTypes[i] |= DFCS_PUSHED; + if (m_nMDIButtonHot == i) + nTypes[i] |= DFCS_HOT; ::DrawFrameControl(hDC, rc, DFC_CAPTION, nTypes[i]); rc.left += w; rc.right += w; @@ -224,6 +225,7 @@ void CMenuBar::OnMouseMove(UINT nFlags, CPoint point) { CRect rcMDIButtons = GetMDIButtonsRect(); InvalidateRect(&rcMDIButtons); + m_nMDIButtonHot = rcMDIButtons.PtInRect(point) ? GetMDIButtonIndexFromPoint(point) : -1; if (!m_bMouseTracking) { TRACKMOUSEEVENT tme = { sizeof TRACKMOUSEEVENT, TME_LEAVE, m_hWnd }; @@ -241,6 +243,7 @@ void CMenuBar::OnMouseLeave() CRect rcButtons = GetMDIButtonsRect(); InvalidateRect(&rcButtons); m_nMDIButtonDown = -1; + m_nMDIButtonHot = -1; __super::OnMouseLeave(); } @@ -265,17 +268,20 @@ void CMenuBar::OnLButtonUp(UINT nFlags, CPoint point) if (pMDIFrameWnd) { CFrameWnd* pFrameWnd = pMDIFrameWnd->GetActiveFrame(); - switch (GetMDIButtonIndexFromPoint(point)) + if (pFrameWnd) { - case 0: - pFrameWnd->ShowWindow(SW_MINIMIZE); - break; - case 1: - ::SendMessage(pMDIFrameWnd->m_hWndMDIClient, WM_MDIRESTORE, (WPARAM)(pFrameWnd->m_hWnd), 0); - break; - case 2: - pFrameWnd->PostMessage(WM_CLOSE); - break; + switch (GetMDIButtonIndexFromPoint(point)) + { + case 0: + pFrameWnd->ShowWindow(SW_MINIMIZE); + break; + case 1: + ::SendMessage(pMDIFrameWnd->m_hWndMDIClient, WM_MDIRESTORE, (WPARAM)(pFrameWnd->m_hWnd), 0); + break; + case 2: + pFrameWnd->PostMessage(WM_CLOSE); + break; + } } } } diff --git a/Src/MenuBar.h b/Src/MenuBar.h index ee4d29f33e5..8ee299059d5 100644 --- a/Src/MenuBar.h +++ b/Src/MenuBar.h @@ -50,6 +50,7 @@ class CMenuBar : public CToolBar bool m_bMouseTracking; bool m_bShowKeyboardCues; int m_nMDIButtonDown; + int m_nMDIButtonHot; HWND m_hwndOldFocus; int m_nCurrentHotItem; UINT m_nCurrentMenuItemFlags; From fefe7e900fcd321feb5bd6956082626b72fbfd51 Mon Sep 17 00:00:00 2001 From: sdottaka Date: Wed, 14 Aug 2024 20:31:49 +0900 Subject: [PATCH 11/14] WIP --- Src/MenuBar.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Src/MenuBar.cpp b/Src/MenuBar.cpp index 606aa5539d1..5ec04c56a74 100644 --- a/Src/MenuBar.cpp +++ b/Src/MenuBar.cpp @@ -209,8 +209,9 @@ void CMenuBar::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) } else if (dwDrawState == CDDS_ITEMPREPAINT) { + pNMCD->clrHighlightHotTrack = GetSysColor(COLOR_3DFACE); pNMCD->clrText = GetSysColor(COLOR_MENUTEXT); - *pResult = CDRF_DODEFAULT | TBCDRF_USECDCOLORS; + *pResult = CDRF_DODEFAULT | TBCDRF_USECDCOLORS | TBCDRF_HILITEHOTTRACK; return; } else if (dwDrawState == CDDS_POSTPAINT && From 7fff29cbe92cf534f8abd8774721e80f6f44b545 Mon Sep 17 00:00:00 2001 From: sdottaka Date: Wed, 14 Aug 2024 20:50:25 +0900 Subject: [PATCH 12/14] WIPMerge remote-tracking branch 'origin/syscolor-hook' into darkmode # Conflicts: # Src/Merge.vcxproj.filters --- Src/MainFrm.cpp | 4 ++-- Src/MyReBar.cpp | 4 ++-- Src/MyReBar.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Src/MainFrm.cpp b/Src/MainFrm.cpp index 707f03a639b..7d5ec5f8b2c 100644 --- a/Src/MainFrm.cpp +++ b/Src/MainFrm.cpp @@ -1689,7 +1689,7 @@ void CMainFrame::OnClose() theApp.WriteProfileInt(_T("Settings"), _T("MainBottom"),wp.rcNormalPosition.bottom); theApp.WriteProfileInt(_T("Settings"), _T("MainMax"), (wp.showCmd == SW_MAXIMIZE)); - GetOptionsMgr()->SaveOption(OPT_REBAR_STATE, m_wndReBar.MakeStateString()); + GetOptionsMgr()->SaveOption(OPT_REBAR_STATE, m_wndReBar.GenerateStateString()); for (auto pFrame: GetAllImgMergeFrames()) { @@ -2527,7 +2527,7 @@ BOOL CMainFrame::CreateToolbar() __super::ShowControlBar(&m_wndMenuBar, true, 0); - m_wndReBar.SetStateString(GetOptionsMgr()->GetString(OPT_REBAR_STATE).c_str()); + m_wndReBar.LoadStateFromString(GetOptionsMgr()->GetString(OPT_REBAR_STATE).c_str()); return TRUE; } diff --git a/Src/MyReBar.cpp b/Src/MyReBar.cpp index a19478970d1..eb55cec3e0c 100644 --- a/Src/MyReBar.cpp +++ b/Src/MyReBar.cpp @@ -17,7 +17,7 @@ BOOL CMyReBar::OnEraseBkgnd(CDC* pDC) return TRUE; } -void CMyReBar::SetStateString(const CString& state) +void CMyReBar::LoadStateFromString(const CString& state) { constexpr int BARCOUNT_MAX = 4; unsigned count = 0; @@ -54,7 +54,7 @@ void CMyReBar::SetStateString(const CString& state) } } -CString CMyReBar::MakeStateString() +CString CMyReBar::GenerateStateString() { CReBarCtrl& rebar = GetReBarCtrl(); const unsigned nCount = rebar.GetBandCount(); diff --git a/Src/MyReBar.h b/Src/MyReBar.h index 45e44814408..3b3462d50ef 100644 --- a/Src/MyReBar.h +++ b/Src/MyReBar.h @@ -7,8 +7,8 @@ class CMyReBar : public CReBar { public: CMyReBar(); - void SetStateString(const CString& state); - CString MakeStateString(); + void LoadStateFromString(const CString& state); + CString GenerateStateString(); protected: afx_msg BOOL OnEraseBkgnd(CDC* pDC); From 897609efa5cf61ce3a5e353d80fb25c2df51c8b9 Mon Sep 17 00:00:00 2001 From: Takashi Sawanaka Date: Thu, 15 Aug 2024 16:52:13 +0900 Subject: [PATCH 13/14] WIP --- Src/MenuBar.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Src/MenuBar.cpp b/Src/MenuBar.cpp index 5ec04c56a74..1f2b9b3b97b 100644 --- a/Src/MenuBar.cpp +++ b/Src/MenuBar.cpp @@ -69,7 +69,7 @@ BOOL CMenuBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID) TBBUTTON btn = makeTBButton(FIRST_MENUID, _T("")); toolbar.SetButtonStructSize(sizeof(TBBUTTON)); - toolbar.SetDrawTextFlags(DT_HIDEPREFIX, DT_HIDEPREFIX); + SendMessage(WM_UPDATEUISTATE, MAKEWPARAM(UIS_SET, UISF_HIDEACCEL|DT_HIDEPREFIX), 0); toolbar.InsertButton(0, &btn); toolbar.SetButtonSize(CSize(tm.tmHeight + cy * 2, tm.tmHeight + cy * 2)); @@ -173,8 +173,7 @@ static bool IsMDIChildMaximized() void CMenuBar::ShowKeyboardCues(bool show) { m_bShowKeyboardCues = show; - GetToolBarCtrl().SetDrawTextFlags(DT_HIDEPREFIX, show ? 0 : DT_HIDEPREFIX); - Invalidate(); + SendMessage(WM_UPDATEUISTATE, MAKEWPARAM(show ? UIS_CLEAR : UIS_SET, UISF_HIDEACCEL|UISF_HIDEFOCUS), 0); } void CMenuBar::LoseFocus() From 18e51775c324d3a6e2243f7736f05947bda79745 Mon Sep 17 00:00:00 2001 From: Takashi Sawanaka Date: Thu, 15 Aug 2024 19:34:59 +0900 Subject: [PATCH 14/14] WIP --- Src/MainFrm.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Src/MainFrm.cpp b/Src/MainFrm.cpp index 7d5ec5f8b2c..6d0c801970c 100644 --- a/Src/MainFrm.cpp +++ b/Src/MainFrm.cpp @@ -2499,8 +2499,6 @@ BOOL CMainFrame::CreateToolbar() } // Remove this if you don't want tool tips or a resizable toolbar - m_wndMenuBar.SetBarStyle(m_wndMenuBar.GetBarStyle() | - CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);