⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 donutexplorerbar.h

📁 一个使用wtl写的完整的多窗口浏览器
💻 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 + -