📄 donutexplorerbar.h
字号:
#pragma once
#define DEB_EX_FAVBAR 0x00000001L
#define DEB_EX_CLPBAR 0X00000002L
#define CHAIN_COMMANDS_TO_EXPLORERBAR(x) CHAIN_COMMANDS_ALT_MEMBER(x, 1)
class CDonutExplorerBar : public CPaneContainerImpl<CDonutExplorerBar>
{
public:
DECLARE_WND_CLASS_EX(_T("Donut_ExplorerBar"), 0, -1)
typedef CPaneContainerImpl<CDonutExplorerBar> baseClass;
// Data members
CSplitterWindow& m_wndSplit;
CDonutFavoritesBar m_FavBar;
CDonutClipboardBar m_ClpBar;
DWORD m_dwExStyle;
// Ctor
CDonutExplorerBar(CSplitterWindow& wndSplit)
: m_wndSplit(wndSplit), m_dwExStyle(DEB_EX_FAVBAR)
{
}
void DonutExplorerBar_Init(HWND hWndMDIClient)
{
_CreateNoOnDemandBar();
_GetProfile(hWndMDIClient);
}
// Message map and handlers
BEGIN_MSG_MAP(CDonutExplorerBar)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
CHAIN_MSG_MAP(baseClass)
ALT_MSG_MAP(1) // As CPaneContainer has FORWARD_NOTIFICATIONS, you have to separate a map.
COMMAND_ID_HANDLER(ID_VIEW_FAVEXPBAR, OnViewFavExpBar)
COMMAND_ID_HANDLER(ID_VIEW_CLIPBOARDBAR, OnViewClipboardBar)
COMMAND_ID_HANDLER(ID_PANE_CLOSE, OnIDPaneClose)
COMMAND_ID_HANDLER(ID_VIEW_EXPBAR_SETFOCUS, OnViewExpBarSetFocus)
END_MSG_MAP()
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
bHandled = FALSE;
_WriteProfile();
return 0;
}
LRESULT OnViewFavExpBar(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if (IsExplorerBarHidden()) {
ShowBar(DEB_EX_FAVBAR, true);
}
else if (!IsFavBarVisible()) {
ShowBar(DEB_EX_FAVBAR);
}
else {
HideBar();
}
return 0;
}
LRESULT OnViewClipboardBar(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if (IsExplorerBarHidden()) {
ShowBar(DEB_EX_CLPBAR, true);
}
else if (!IsClpBarVisible()) {
ShowBar(DEB_EX_CLPBAR);
}
else {
HideBar();
}
return 0;
}
LRESULT OnIDPaneClose(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
HideBar();
return 0;
}
LRESULT OnViewExpBarSetFocus(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
SetFocus();
return 0;
}
// Methods
BYTE PreTranslateMessage(MSG* pMsg)
{
if (IsFavBarVisible())
return m_FavBar.PreTranslateMessage(pMsg);
else if (IsClpBarVisible())
return m_ClpBar.PreTranslateMessage(pMsg);
else
return _MTL_TRANSLATE_PASS;
}
// Attributes
bool IsFavBarVisible()
{
return _check_flag(DEB_EX_FAVBAR, m_dwExStyle);
}
bool IsClpBarVisible()
{
return _check_flag(DEB_EX_CLPBAR, m_dwExStyle);
}
bool IsExplorerBarHidden()
{
return (m_wndSplit.GetSinglePaneMode() == SPLIT_PANE_RIGHT);
}
void ShowBar(DWORD dwExStyle, bool bShowSplitter = false)
{
_CreateOnDemandBar(dwExStyle);
_SwitchClient(dwExStyle);
m_dwExStyle = dwExStyle;
if (bShowSplitter)
m_wndSplit.SetSinglePaneMode();
}
void HideBar()
{
m_dwExStyle = 0;
m_wndSplit.SetSinglePaneMode(SPLIT_PANE_RIGHT);
}
void _SwitchClient(DWORD dwStyle)
{
if (_check_flag(DEB_EX_FAVBAR, dwStyle)) { // fav bar
_HideOtherBars();
m_FavBar.ShowWindow(SW_SHOW);
SetClient(m_FavBar.m_hWnd);
SetTitle(MtlGetWindowText(m_FavBar.m_hWnd) + _T("(&C)"));
}
else if (_check_flag(DEB_EX_CLPBAR, dwStyle)) { // clp bar
_HideOtherBars();
m_ClpBar.ShowWindow(SW_SHOW);
SetClient(m_ClpBar.m_hWnd);
SetTitle(MtlGetWindowText(m_ClpBar.m_hWnd) + _T("(&C)"));
}
}
void _HideOtherBars()
{
if (m_FavBar.m_hWnd != NULL)
m_FavBar.ShowWindow(SW_HIDE);
if (m_ClpBar.m_hWnd != NULL)
m_ClpBar.ShowWindow(SW_HIDE);
}
void _CreateNoOnDemandBar()
{
m_ClpBar.Create(m_hWnd);
m_ClpBar.SetWindowText(_T("Clipboard"));
}
void _CreateOnDemandBar(DWORD dwExStyle)
{
if (_check_flag(DEB_EX_FAVBAR, dwExStyle)) {// on demand
if (m_FavBar.m_hWnd == NULL) {
m_FavBar.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0);
m_FavBar.InitToolBar(ID_FAVORITE_ADD, ID_FAVORITE_ORGANIZE, ID_FAVORITE_PLACEMENT, IDB_FAVBAR, IDB_FAVBAR_HOT, 16, 16, RGB(255, 0, 255));
m_FavBar.SetWindowText(_T("Favorites"));
}
}
}
void _WriteProfile()
{
CIniSection pr;
pr.Open(_szIniFileName, _T("Explorer_Bar"));
pr.SetValue(m_dwExStyle, _T("Extended_Style"));
pr.SetValue(m_wndSplit.GetSplitterPos(), _T("cxLeftSplitter"));
DWORD dwSplitterVisible = (m_wndSplit.GetSinglePaneMode() == SPLIT_PANE_RIGHT) ? FALSE : TRUE;
pr.SetValue(dwSplitterVisible, _T("bLeftVisible"));
}
void _GetProfile(HWND hWndMDIClient)
{
CIniSection pr;
pr.Open(_szIniFileName, _T("Explorer_Bar"));
DWORD dwcxLeftSplitter = 160;
pr.QueryValue(dwcxLeftSplitter, _T("cxLeftSplitter"));
DWORD dwSplitterVisible = FALSE;
pr.QueryValue(dwSplitterVisible, _T("bLeftVisible"));
DWORD dwExStyle = DEB_EX_FAVBAR;
pr.QueryValue(dwExStyle, _T("Extended_Style"));
m_wndSplit.SetSplitterPanes(m_hWnd, hWndMDIClient);
m_wndSplit.SetSplitterPaneParents(NULL, GetTopLevelParent());
m_wndSplit.m_xySplitterPos = dwcxLeftSplitter;
if (dwSplitterVisible == FALSE) {
HideBar();
}
else {
ShowBar(dwExStyle);
}
}
// Update command UI and handlers
BEGIN_UPDATE_COMMAND_UI_MAP(CDonutExplorerBar)
UPDATE_COMMAND_UI_SETCHECK_IF(ID_VIEW_FAVEXPBAR, IsFavBarVisible())
UPDATE_COMMAND_UI_SETCHECK_IF(ID_VIEW_CLIPBOARDBAR, IsClpBarVisible())
END_UPDATE_COMMAND_UI_MAP()
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -