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

📄 mainfrm.h

📁 一个使用wtl写的完整的多窗口浏览器
💻 H
📖 第 1 页 / 共 4 页
字号:
// MainFrm.h : interface of the CMainFrame class
//
/////////////////////////////////////////////////////////////////////////////
#pragma once

#include "MenuControl.h"
#include "MainFrameFileDropTarget.h"

#ifdef _DEBUG
	const bool _Donut_MainFrame_traceOn = false;
	#define dmfTRACE if (_Donut_MainFrame_traceOn) ATLTRACE
#else
	#define dmfTRACE
#endif

class CMainFrame : public CMDIFrameWindowImpl<CMainFrame>,
		public CMessageFilter, public CIdleHandler,
		public CAppCommandHandler<CMainFrame>,
		public CUpdateCmdUI<CMainFrame>,
		public CWindowMenuCommandHandler<CMainFrame>,
		public CDDEMessageHandler<CMainFrame>,
		public CMDIFrameTitleUpsideDownMessageHandlerWeb<CMainFrame>,
		public CHelpMessageLine<CMainFrame>,
		public CMSMouseWheelMessageHandler<CMainFrame>,
		public CMainFrameFileDropTarget<CMainFrame>,
		public CReBarVerticalBorder<CMainFrame>
{
public:
// Declarelations
	DECLARE_FRAME_WND_CLASS(_T("WTL:Donut"), IDR_MAINFRAME)
	DECLARE_MTL_REBAR_UPDATELAYOUT()
	typedef CMDIFrameWindowImpl<CMainFrame> baseClass;

// Constants
	enum { _nPosFavoriteMenu = 3, _nPosFavGroupMenu = 2, _nPosViewMenu = 2,
		_nPosFavoriteMenuOfTab = 2, _nPosMRU = 12, _nPosWindowMenu = 5, _nWindowMenuItemCount = 14 };

// Daba members
	CCommandBarCtrl2 m_CmdBar;
	CDonutToolBar m_ToolBar;
	CDonutLinksBarCtrl<CMainFrame> m_LinkBar;
	CDonutAddressBar m_AddressBar;
	CMDITabCtrl	m_MDITab;
	CMultiPaneStatusBarCtrl m_wndStatusBar;
	CProgressBarCtrl m_wndProgress;

	CMainOption m_MainOption;
	CDonutSecurityZone m_secZone;

	CSplitterWindow m_wndSplit;
	CDonutExplorerBar m_ExplorerBar;

	CDonutFavoritesMenu<CMainFrame> m_FavoriteMenu;
	CFavoriteGroupMenu<CMainFrame> m_FavGroupMenu;

	CMenuControl m_mcCmdBar;
	CMenuControl m_mcToolBar;

	CContainedWindow m_wndMDIClient;

	// FullScreen support
	BOOL m_bStatusBarVisibleUnlessFullScreen;

	UINT m_nBackUpTimerID;
	CMenuHandle m_menuWindow;

	HWND m_hWndFocus;

	// Constructor/Destructor
	CMainFrame() :
		m_FavoriteMenu(this, ID_INSERTPOINT_FAVORITEMENU),
		m_FavGroupMenu(this, ID_INSERTPOINT_GROUPMENU),
		m_LinkBar(this, ID_INSERTPOINT_FAVORITEMENU),
		m_nBackUpTimerID(0), /*m_FavTree(this), */m_wndMDIClient(this, 1),
		CDDEMessageHandler<CMainFrame>(_T("Donut")), m_hWndFocus(NULL),
		m_ExplorerBar(m_wndSplit)
	{
	}

	~CMainFrame()
	{
		if (m_wndMDIClient.IsWindow())
			m_wndMDIClient.UnsubclassWindow();
	}

// Overrides
	virtual BOOL PreTranslateMessage(MSG* pMsg)
	{
		if (m_CmdBar.PreTranslateMessage(pMsg))
			return TRUE;
		
		BYTE ptFlag = m_AddressBar.PreTranslateMessage(pMsg);
		if (ptFlag == _MTL_TRANSLATE_HANDLE)
			return TRUE;
		else if (ptFlag == _MTL_TRANSLATE_WANT)
			return FALSE;

		ptFlag = m_ExplorerBar.PreTranslateMessage(pMsg);
		if (ptFlag == _MTL_TRANSLATE_HANDLE)
			return TRUE;
		else if (ptFlag == _MTL_TRANSLATE_WANT)
			return FALSE;

		if (baseClass::PreTranslateMessage(pMsg))
			return TRUE;

		HWND hWnd = MDIGetActive();
		if (hWnd != NULL && (BOOL)::SendMessage(hWnd, WM_FORWARDMSG, 0, (LPARAM)pMsg))
			return TRUE;
		
		return FALSE;// IsDialogMessage(pMsg);
	}

	virtual BOOL OnIdle()
	{
		// Note. under 0.01 sec (in dbg-mode on 330mhz cpu)
		CmdUIUpdateToolBars();
		CmdUIUpdateStatusBar(m_hWndStatusBar, ID_DEFAULT_PANE);
		CmdUIUpdateChildWindow(m_hWndStatusBar, IDC_PROGRESS);
		m_mcCmdBar.UpdateMDIMenuControl();
		_FocusChecker();

		if (_check_flag(MAIN_EX_KILLDIALOG, CMainOption::s_dwMainExtendedStyle))
			CDialogKiller2::KillDialog();

		return FALSE;
	}

	void _OnIdleCritical()
	{
		if (MtlIsApplicationActive(m_hWnd)) {
			CmdUIUpdateToolBars();
			CmdUIUpdateChildWindow(m_hWndStatusBar, IDC_PROGRESS);
		}

		_FocusChecker();

		if (_check_flag(MAIN_EX_KILLDIALOG, CMainOption::s_dwMainExtendedStyle))
			CDialogKiller2::KillDialog();
	}

	bool OnDDEOpenFile(const CString& strFileName)
	{
		dmfTRACE(_T("CMainFrame::OnDDEOpenFile(%s)\n"), strFileName);
		OnUserOpenFile(strFileName, DonutGetStdOpenFlag());
		return true;
	}

// Message map
BEGIN_MSG_MAP(CMainFrame)
	PASS_MSG_MAP_MENUOWNER_TO_EXPMENU(m_FavGroupMenu)
	PASS_MSG_MAP_MENUOWNER_TO_EXPMENU(m_FavoriteMenu)
	CHAIN_MSG_MAP(CUpdateCmdUI<CMainFrame>)

	MESSAGE_HANDLER(WM_CREATE, OnCreate)
	MSG_WM_CLOSE(OnClose)
	MSG_WM_DESTROY(OnDestroy)
	USER_MSG_WM_NEWINSTANCE(OnNewInstance)
	MSG_WM_USER_MDICHILD(OnMDIChild)
	MSG_WM_USER_OPENFILE(OnUserOpenFile)
	MSG_WM_USER_GET_ACTIVE_IWEBBROWSER()
	MSG_WM_USER_GET_ACTIVE_WINDOW()
	MSG_WM_USER_BROWSER_CAN_SETFOCUS(OnBrowserCanSetFocus)
	MSG_WM_ACTIVATE(OnActivate)
	
	MESSAGE_HANDLER(WM_NOTIFY, OnNotify)// map custom draw notifycation to addressbar

	HANDLE_MESSAGE(WM_MDISETMENU)
	HANDLE_MESSAGE(WM_SETFOCUS)			// default handler will set focus to server window

	MSG_WM_TIMER(OnTimer)
	MSG_WM_MOUSEWHEEL(OnMouseWheel)
//	MSG_WM_PARENTNOTIFY(OnParentNotify)
	DEBUG_CHECK_FOCUS_COMMAND_ID_HANDLER_EX()

	COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
	COMMAND_RANGE_HANDLER(ID_FILE_MRU_FIRST, ID_FILE_MRU_LAST, OnFileRecent)
	COMMAND_ID_HANDLER(ID_FILE_NEW, OnFileNew)
	COMMAND_ID_HANDLER(ID_FILE_OPEN, OnFileOpen)
	COMMAND_ID_HANDLER_EX(ID_FILE_NEW_HOME, OnFileNewHome)
	COMMAND_ID_HANDLER_EX(ID_FILE_NEW_CLIPBOARD, OnFileNewClipBoard)
	COMMAND_ID_HANDLER_EX(ID_FILE_NEW_CLIPBOARD2, OnFileNewClipBoard2)
	COMMAND_ID_HANDLER_EX(ID_FILE_NEW_CLIPBOARD_EX, OnFileNewClipBoardEx)
	COMMAND_ID_HANDLER_EX(ID_FILE_NEW_BLANK, OnFileNewBlank)
	COMMAND_ID_HANDLER_EX(ID_FILE_NEW_COPY, OnFileNewCopy)
	COMMAND_ID_HANDLER_EX(ID_FILE_WORKOFFLINE, OnFileWorkOffline)

	COMMAND_ID_HANDLER_EX(ID_EDIT_CUT, OnEditCut)
	COMMAND_ID_HANDLER_EX(ID_EDIT_COPY, OnEditCopy)
	COMMAND_ID_HANDLER_EX(ID_EDIT_PASTE, OnEditPaste)
	COMMAND_ID_HANDLER_EX(ID_EDIT_SELECT_ALL, OnEditSelectAll)
		
	COMMAND_ID_HANDLER_EX(ID_FAVORITE_GROUP_SAVE, OnFavoriteGroupSave)
	COMMAND_ID_HANDLER_EX(ID_FAVORITE_GROUP_ORGANIZE, OnFavoriteGroupOrganize)

	COMMAND_ID_HANDLER_EX(ID_VIEW_REFRESH_ALL, OnViewRefreshAll)
	COMMAND_ID_HANDLER_EX(ID_VIEW_STOP_ALL, OnViewStopAll)
	COMMAND_ID_HANDLER_EX(ID_VIEW_FULLSCREEN, OnViewFullScreen)

	COMMAND_ID_HANDLER_EX(ID_BACKUPOPTION_CHANGED, OnBackUpOptionChanged)

	COMMAND_ID_HANDLER_EX(ID_TAB_LEFT, OnTabLeft)
	COMMAND_ID_HANDLER_EX(ID_TAB_RIGHT, OnTabRight)

	COMMAND_ID_HANDLER(ID_VIEW_TOOLBAR, OnViewToolBar)
	COMMAND_ID_HANDLER(ID_VIEW_ADDRESSBAR, OnViewAddressBar)
	COMMAND_ID_HANDLER(ID_VIEW_LINKBAR, OnViewLinkBar)
	COMMAND_ID_HANDLER(ID_VIEW_TABBAR, OnViewTabBar)
	COMMAND_ID_HANDLER(ID_VIEW_STATUS_BAR, OnViewStatusBar)
	COMMAND_ID_HANDLER(ID_VIEW_GOBUTTON, OnViewGoButton)
	COMMAND_ID_HANDLER(ID_VIEW_TOOLBAR_CUST, OnViewToolBarCust)
	COMMAND_ID_HANDLER(ID_VIEW_TABBAR_MULTI, OnViewTabBarMulti)
	COMMAND_ID_HANDLER(ID_VIEW_ADDBAR_DROPDOWN, OnViewAddBarDropDown)

	COMMAND_ID_HANDLER_EX(ID_VIEW_OPTION_DONUT, OnViewOptionDonut)
	COMMAND_ID_HANDLER_EX(ID_FAVORITE_ORGANIZE, OnFavoriteOrganize)

	COMMAND_ID_HANDLER_EX(ID_SETFOCUS_ADDRESSBAR, OnSetFocusAddressBar)

	COMMAND_ID_HANDLER(ID_WINDOW_CLOSE_ALL, OnWindowCloseAll)

	COMMAND_ID_HANDLER(ID_VIEW_REFRESH_FAVBAR, OnViewRefreshFavBar)
	COMMAND_ID_HANDLER(ID_VIEW_IDLE, OnViewIdle)
	COMMAND_ID_HANDLER_EX(ID_VIEW_HOME, OnViewHome)

	COMMAND_ID_HANDLER_EX(ID_REGISTER_AS_BROWSER, OnRegisterAsBrowser)

	CHAIN_COMMANDS_MEMBER(m_MainOption)
	CHAIN_COMMANDS_MEMBER(m_secZone)
	CHAIN_COMMANDS(CWindowMenuCommandHandler<CMainFrame>)
	CHAIN_COMMANDS(CAppCommandHandler<CMainFrame>)
	CHAIN_COMMANDS_TO_EXPLORERBAR(m_ExplorerBar)

	CHAIN_MDI_CHILD_COMMANDS()
	COMMAND_ID_HANDLER_EX(ID_VIEW_OPTION, OnViewOption)

	CHAIN_MSG_MAP(CDDEMessageHandler<CMainFrame>)
	CHAIN_MSG_MAP(CMDIFrameTitleUpsideDownMessageHandlerWeb<CMainFrame>)
	CHAIN_MSG_MAP(CHelpMessageLine<CMainFrame>)
	CHAIN_MSG_MAP(CMSMouseWheelMessageHandler<CMainFrame>)
	CHAIN_MSG_MAP(CReBarVerticalBorder<CMainFrame>)

	REFLECT_CHEVRONPUSHED_NOTIFICATION()
	CHAIN_MSG_MAP(baseClass)
	REFLECT_NOTIFICATIONS()// must be last
ALT_MSG_MAP(1)
	MESSAGE_HANDLER(WM_ERASEBKGND, OnMDIClientEraseBkgnd)
	MESSAGE_HANDLER(WM_SIZE, OnMDIClientSize)
END_MSG_MAP()

// Message handlers
	// alternates OpenFile
	HWND OnUserOpenFile(LPCTSTR lpszFile, DWORD openFlag)
	{
		CString strFile(lpszFile);

		MtlRemoveStringHeaderAndFooter(strFile);
		
		if ( !MtlIsProtocol(strFile, _T("http")) &&
			 !MtlIsProtocol(strFile, _T("https")) )
		{
			if (MtlPreOpenFile(strFile))
				return NULL;// handled
		}
		
		MtlParseIntenetShortcutFile(strFile);

		if (strFile.GetLength() > INTERNET_MAX_PATH_LENGTH)
			return NULL;

		if (strFile == _T("javascript:location.reload()"))
			return NULL;

		// dfg files
		if (MtlIsExt(strFile, _T(".dfg"))) {
			if (!(CMainOption::s_dwMainExtendedStyle & MAIN_EX_NOCLOSEDFG))
				_LoadGroupOption(strFile, true);
			else
				_LoadGroupOption(strFile, false);
			return NULL;
		}


		HWND hWndActive = MDIGetActive();

		int nCmdShow = _check_flag(D_OPENFILE_ACTIVATE, openFlag) ? -1 : SW_SHOWNOACTIVATE;

		if (hWndActive == NULL) {	// no window yet
			nCmdShow = -1;			// always default
		}

		if (hWndActive != NULL && _check_flag(D_OPENFILE_NOCREATE, openFlag)) {
			CWebBrowser2 browser = DonutGetIWebBrowser2(hWndActive);
			if (!browser.IsBrowserNull()) {
				browser.Navigate2(strFile);

				if (!_check_flag(D_OPENFILE_NOSETFOCUS, openFlag)) {
					// reset focus
					::SetFocus(NULL);
					MtlSendCommand(hWndActive, ID_VIEW_SETFOCUS);
				}

				return NULL;
				//return hWndActive;
			}
		}
	
		CChildFrame* pChild = CChildFrame::NewWindow(m_hWndMDIClient, m_MDITab, m_AddressBar);
		if (pChild == NULL)
			return NULL;

		pChild->ActivateFrame(nCmdShow);

		if (!strFile.IsEmpty())
			pChild->Navigate2(strFile);

		if (!_check_flag(D_OPENFILE_NOSETFOCUS, openFlag)) {
			if (MDIGetActive() == pChild->m_hWnd) {// a new window activated, so automatically set focus
				// reset focus
				::SetFocus(NULL);
				MtlSendCommand(pChild->m_hWnd, ID_VIEW_SETFOCUS);
			}
			else {
				// It's reasonable not to touch a current focus.
			}
		}

		return pChild->m_hWnd;
	}

//////////////////////////////////////////////////////////////////
// to avoid the flicker on resizing
	LRESULT OnMDIClientEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		HWND hWndActive = MDIGetActive();
		if (CMainOption::s_bTabMode && hWndActive != NULL)
			return 1;// no need to erase it

		bHandled = FALSE;
		return 0;
	}

	LRESULT OnMDIClientSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		BOOL bMaximized = FALSE;
		HWND hWndActive = MDIGetActive(&bMaximized);
		if (CMainOption::s_bTabMode || hWndActive == NULL || bMaximized == FALSE) {// pass to default
			bHandled = FALSE;
			return 1;
		}

		// NOTE. If you do the following, you can avoid the flicker on resizing.
		//       I can't understand why it is effective...
		//
		//       But still you can get a glimpse of other mdi child window's frames.
		//       I guess it's MDI's bug, but I can't get the way MFC fixed.
		CWindow wndActive(hWndActive);
		CWindow wndView = wndActive.GetDlgItem(ID_DONUTVIEW);
		wndActive.ModifyStyle(0, WS_CLIPCHILDREN);// add WS_CLIPCHILDREN
		wndView.ModifyStyle(0, WS_CLIPCHILDREN);
		LRESULT lRet = m_wndMDIClient.DefWindowProc(uMsg, wParam, lParam);
		m_wndMDIClient.UpdateWindow();
		wndActive.ModifyStyle(WS_CLIPCHILDREN, 0);
		wndView.ModifyStyle(WS_CLIPCHILDREN, 0);
		return lRet;
	}
//////////////////////////////////////////////////////////////////
// custom draw of addressbar
	LRESULT OnNotify(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		bHandled = FALSE;

		LPNMHDR lpnmh = (LPNMHDR)lParam;
		LRESULT lRet = 0;

		if(lpnmh->code == NM_CUSTOMDRAW && lpnmh->hwndFrom == m_hWndToolBar) {// from rebar
			lRet = m_AddressBar.OnCustomDraw(0, lpnmh, bHandled);
		}

		return lRet;
	}

//////////////////////////////////////////////////////////////////
// the custom message from MDI child
	void OnMDIChild(HWND hWnd, UINT nCode)
	{
		SetMsgHandled(FALSE);
		if (nCode ==  MDICHILD_USER_ALLCLOSED) {
			m_AddressBar.SetWindowText(_T(""));
			::SetWindowText(m_hWndStatusBar, _T("儗僨傿"));
			m_CmdBar.EnableButton(_nPosWindowMenu, false);
		}
		else if (nCode == MDICHILD_USER_FIRSTCREATED) {
			m_CmdBar.EnableButton(_nPosWindowMenu, true);
		}
		else if (nCode == MDICHILD_USER_ACTIVATED) {
			OnIdle();		// make sure when cpu is busy
		}
	}

	BOOL OnBrowserCanSetFocus()
	{// asked by browser
		HWND hWndFocus = ::GetFocus();
		if (hWndFocus == NULL)
			return TRUE;

		if (::IsChild(m_hWndToolBar, hWndFocus))
			return FALSE;

		if (m_ExplorerBar.IsChild(hWndFocus))
			return FALSE;

		return TRUE;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -