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

📄 mainfrm.h

📁 一个使用wtl写的完整的多窗口浏览器
💻 H
📖 第 1 页 / 共 4 页
字号:
			}
		}
	}

// Implementation
private:
	void _ReadProfile()
	{
		CIniSection pr;

		// read tab
		pr.Open(_szIniFileName, _T("MDITab"));
		MtlGetProfileMDITab(pr, m_MDITab);
		pr.Close();

		OnBackUpOptionChanged(0, 0, 0);
	}

	void _WriteProfile()
	{
		CIniSection pr;

		// save frame and status bar
		pr.Open(_szIniFileName, _T("Main"));
		MtlWriteProfileMainFrameState(pr, m_hWnd);
		MtlWriteProfileStatusBarState(pr, m_hWndStatusBar);
		pr.Close();

		// save MDI tab
		pr.Open(_szIniFileName, _T("MDITab"));
		MtlWriteProfileMDITab(pr, m_MDITab);
		pr.Close();

		// save rebar
		pr.Open(_szIniFileName, _T("ReBar"));
		MtlWriteProfileReBarBandsState(pr, m_hWndToolBar);
		pr.Close();

		// save group options
		_SaveGroupOption(CStartUpOption::GetDefaultDFGFilePath());
	}

// Overrides WTL sucks
public:
	static BOOL AddSimpleReBarBandCtrl(HWND hWndReBar, HWND hWndBand, int nID = 0, LPTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE, int cxWidth = 0, BOOL bFullWidthAlways = FALSE)
	{
		dmfTRACE(_T("CMainFrame::AddSimpleReBarBandCtrl\n"));
		ATLASSERT(::IsWindow(hWndReBar));	// must be already created
		ATLASSERT(::IsWindow(hWndBand));	// must be already created
		MTLASSERT_KINDOF(REBARCLASSNAME, hWndReBar);

		// Set band info structure
		REBARBANDINFO rbBand;
		rbBand.cbSize = sizeof(REBARBANDINFO);
#if (_WIN32_IE >= 0x0400)
		rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE | RBBIM_IDEALSIZE;
#else
		rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE;
#endif //!(_WIN32_IE >= 0x0400)
		if(lpstrTitle != NULL)
			rbBand.fMask |= RBBIM_TEXT;
#if (_WIN32_IE >= 0x0500)
		if (nID != IDC_ADDRESSBAR && nID != IDC_MDITAB)
			rbBand.fStyle = /*RBBS_CHILDEDGE | shit*/RBBS_USECHEVRON;
		else
			rbBand.fStyle = 0;//RBBS_CHILDEDGE;
#else
		rbBand.fStyle = 0;//RBBS_CHILDEDGE;
#endif //!(_WIN32_IE >= 0x0500)
		if(bNewRow)
			rbBand.fStyle |= RBBS_BREAK;

		rbBand.lpText = lpstrTitle;
		rbBand.hwndChild = hWndBand;
		rbBand.wID = nID;

		// Calculate the size of the band
		BOOL bRet;
		RECT rcTmp;
		int nBtnCount = (int)::SendMessage(hWndBand, TB_BUTTONCOUNT, 0, 0L);
		if(nBtnCount > 0)
		{
			bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, nBtnCount - 1, (LPARAM)&rcTmp);
			ATLASSERT(bRet);
			rbBand.cx = (cxWidth != 0) ? cxWidth : rcTmp.right;
			rbBand.cyMinChild = rcTmp.bottom - rcTmp.top;

			if(bFullWidthAlways)
			{
				rbBand.cxMinChild = rbBand.cx;
			}
			else if(lpstrTitle == 0)
			{
				CRect rcTmp;// check!!
				bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, 0, (LPARAM)&rcTmp);
				ATLASSERT(bRet);
				rbBand.cxMinChild = rcTmp.right;
			}
			else
			{
				rbBand.cxMinChild = 0;
			}
		}
		else	// no buttons, either not a toolbar or really has no buttons
		{
			bRet = ::GetWindowRect(hWndBand, &rcTmp);
			ATLASSERT(bRet);
			rbBand.cx = (cxWidth != 0) ? cxWidth : (rcTmp.right - rcTmp.left);
			rbBand.cxMinChild = (bFullWidthAlways) ? rbBand.cx : 0;
			rbBand.cyMinChild = rcTmp.bottom - rcTmp.top;
		}

#if (_WIN32_IE >= 0x0400)
		// NOTE: cxIdeal used for CHEVRON, if MDI cxIdeal changed dynamically.
		rbBand.cxIdeal = rcTmp.right;//rbBand.cx is not good.
#endif //(_WIN32_IE >= 0x0400)

		// Add the band
		LRESULT lRes = ::SendMessage(hWndReBar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
		if(lRes == 0)
		{
			ATLTRACE2(atlTraceUI, 0, _T("Failed to add a band to the rebar.\n"));
			return FALSE;
		}

#if (_WIN32_IE >= 0x0501)
		if (nID == IDC_LINKBAR)
			::SendMessage(hWndBand, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS);
#endif //(_WIN32_IE >= 0x0501)

		return TRUE;
	}

	struct _Function_EnumChildSaveOption
	{
		int _nIndex;
		CString _strFileName;
		HWND _hWndActive;
		int _nActiveIndex;
		_Function_EnumChildSaveOption(const CString& strFileName, HWND hWndActive, int nIndex = 0)
			: _nIndex(nIndex), _strFileName(strFileName),
			  _hWndActive(hWndActive), _nActiveIndex(-1)
		{
		}
		void operator()(HWND hWnd)
		{
			if (hWnd == _hWndActive)
				_nActiveIndex = _nIndex;				

			::SendMessage(hWnd, WM_SAVE_OPTION, (WPARAM)(LPCTSTR)_strFileName, (LPARAM)_nIndex);
			++_nIndex;
		}
	};

	void _SaveGroupOption(const CString& strFileName)
	{
		::DeleteFile(strFileName);// clean up

		BOOL bMaximized = FALSE;
		HWND hWndActive = MDIGetActive(&bMaximized);
		_Function_EnumChildSaveOption f(strFileName, hWndActive);
		f = m_MDITab.ForEachWindow(f);// MtlForEachMDIChild(m_hWndMDIClient, f);

		CIniSection pr;
		pr.Open(strFileName, _T("Header"));
		pr.SetValue(f._nIndex, _T("count"));
		pr.SetValue(f._nActiveIndex, _T("active"));// active index
		pr.SetValue(bMaximized ? 1 : 0, _T("maximized"));
		pr.Close();
	}

	void _LoadGroupOption(const CString& strFileName, bool bClose)
	{
		dmfTRACE(_T("CMainFrame::_LoadGroupOption\n"));

		CLockRedrawMDIClient lock(m_hWndMDIClient);
		CMDITabCtrl::CLockRedraw lock2(m_MDITab);
		CWaitCursor cur;

		if (bClose)
			MtlCloseAllMDIChildren(m_hWndMDIClient);

		CIniSection pr;
		pr.Open(strFileName, _T("Header"));

		DWORD dwCount = 0;
		if (pr.QueryValue(dwCount, _T("count")) != ERROR_SUCCESS)
			return;

		DWORD dwActive = 0;
		pr.QueryValue(dwActive, _T("active"));

		DWORD dwMaximized = 0;
		pr.QueryValue(dwMaximized, _T("maximized"));

		bool bActiveChildExistAlready = (MDIGetActive() == NULL) ? false : true;

		m_MDITab.m_bInsertHere = true;
		m_MDITab.m_nInsertIndex = m_MDITab.GetItemCount();

		CChildFrame* pChildActive = NULL;
		for (DWORD dw = 0; dw < dwCount; ++dw)
		{
			CChildFrame* pChild =
				CChildFrame::NewWindow(m_hWndMDIClient, m_MDITab, m_AddressBar);
				// if no active child, as there is no client edge in MDI client window,
				// so GetClientRect is different a little and a resizing will occur when switching.
				// That is, only the first child window is activated.

			if (pChild == NULL)
				continue;

			++m_MDITab.m_nInsertIndex;

			// activate now!
			pChild->ActivateFrame(MDIGetActive() != NULL ? SW_SHOWNOACTIVATE : -1);

			// if tab mode, no need to load window placement.
			pChild->m_view.m_ViewOption.GetProfile(strFileName, dw, !CMainOption::s_bTabMode);

			if (dw == dwActive)
				pChildActive = pChild;
		}

		m_MDITab.m_bInsertHere = false;
		m_MDITab.m_nInsertIndex = -1;

		if (pChildActive == NULL)
			return;

		if (!bActiveChildExistAlready) {	// there was no active window
			MDIActivate(pChildActive->m_hWnd);
			if (CMainOption::s_bTabMode || dwMaximized == 1) {	// in tab mode
				MDIMaximize(pChildActive->m_hWnd);
			}
		}
		else {								// already an active window exists
			if (!(CMainOption::s_dwMainExtendedStyle & MAIN_EX_NOACTIVATE))
				MDIActivate(pChildActive->m_hWnd);
		}
	}

	BEGIN_UPDATE_COMMAND_UI_MAP(CMainFrame)
		CHAIN_UPDATE_COMMAND_UI_MEMBER(m_MainOption)
		CHAIN_UPDATE_COMMAND_UI_MEMBER(m_secZone)
		CHAIN_UPDATE_COMMAND_UI_MEMBER(m_ExplorerBar)
		CHAIN_MDI_CHILD_UPDATE_COMMAND_UI()				// first of all

		bool bActiveChild = (MDIGetActive() != NULL);
		// File menu
			UPDATE_COMMAND_UI_SETDEFAULT_FLAG(ID_FILE_NEW_HOME, FILENEW_HOME, CFileNewOption::s_dwFlags)
			UPDATE_COMMAND_UI_SETDEFAULT_FLAG_PASS(ID_FILE_NEW_COPY, FILENEW_COPY, CFileNewOption::s_dwFlags)
			UPDATE_COMMAND_UI_SETDEFAULT_FLAG(ID_FILE_NEW_BLANK, FILENEW_BLANK, CFileNewOption::s_dwFlags)
			UPDATE_COMMAND_UI_ENABLE_IF(ID_FILE_NEW_COPY, bActiveChild)
			UPDATE_COMMAND_UI_ENABLE_IF(ID_FILE_NEW_CLIPBOARD, _IsClipboardAvailable())
			UPDATE_COMMAND_UI_SETDEFAULT_PASS(ID_FILE_NEW_CLIPBOARD2)
			UPDATE_COMMAND_UI_ENABLE_IF(ID_FILE_NEW_CLIPBOARD2, _IsClipboardAvailable())
		UPDATE_COMMAND_UI_ENABLE_IF(ID_FILE_SAVE_AS, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_FILE_PAGE_SETUP, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_FILE_PRINT, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_FILE_PROPERTIES, bActiveChild)
		UPDATE_COMMAND_UI_SETCHECK_IF(ID_FILE_WORKOFFLINE, MtlIsGlobalOffline())
		UPDATE_COMMAND_UI_ENABLE_IF(ID_FILE_CLOSE, bActiveChild)
		// Edit menu
//		UPDATE_COMMAND_UI_ENABLE_IF(ID_EDIT_CUT, bActiveChild)
//		UPDATE_COMMAND_UI_ENABLE_IF(ID_EDIT_COPY, bActiveChild)
//		UPDATE_COMMAND_UI_ENABLE_IF(ID_EDIT_PASTE, bActiveChild)
//		UPDATE_COMMAND_UI_ENABLE_IF(ID_EDIT_SELECT_ALL, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_EDIT_FIND, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_EDIT_OPEN_SELECTED_REF, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_EDIT_OPEN_SELECTED_TEXT, bActiveChild)
//		UPDATE_COMMAND_UI_ENABLE_IF(ID_VIEW_SETFOCUS, bActiveChild)
		// View menu
			UPDATE_COMMAND_UI_SETCHECK_IF(ID_VIEW_TOOLBAR, MtlIsBandVisible(m_hWndToolBar, ATL_IDW_TOOLBAR))
			UPDATE_COMMAND_UI_SETCHECK_IF(ID_VIEW_ADDRESSBAR, MtlIsBandVisible(m_hWndToolBar, IDC_ADDRESSBAR))
			UPDATE_COMMAND_UI_SETCHECK_IF(ID_VIEW_LINKBAR, MtlIsBandVisible(m_hWndToolBar, IDC_LINKBAR))
			UPDATE_COMMAND_UI_SETCHECK_FLAG(ID_VIEW_GOBUTTON, ABR_EX_GOBTNVISIBLE, m_AddressBar.GetAddressBarExtendedStyle())
			UPDATE_COMMAND_UI_SETCHECK_IF(ID_VIEW_TABBAR, MtlIsBandVisible(m_hWndToolBar, IDC_MDITAB))
			UPDATE_COMMAND_UI_SETCHECK_FLAG(ID_VIEW_TABBAR_MULTI, MTB_EX_MULTILINE, m_MDITab.GetMDITabExtendedStyle())
		UPDATE_COMMAND_UI_SETCHECK_IF(ID_VIEW_STATUS_BAR, ::IsWindowVisible(m_hWndStatusBar))

		UPDATE_COMMAND_UI_ENABLE_IF_WITH_POPUP(ID_VIEW_BACK, bActiveChild, bActiveChild)		// with popup
			UPDATE_COMMAND_UI_ENABLE_IF(ID_VIEW_FORWARD, bActiveChild)
			UPDATE_COMMAND_UI_ENABLE_IF(ID_VIEW_REFRESH, bActiveChild)

		UPDATE_COMMAND_UI_POPUP_ENABLE_IF(ID_VIEW_BACK1, bActiveChild)
		UPDATE_COMMAND_UI_POPUP_ENABLE_IF(ID_VIEW_FORWARD1, bActiveChild)

		UPDATE_COMMAND_UI_ENABLE_IF(ID_VIEW_STOP, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_VIEW_STOP_ALL, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_VIEW_REFRESH, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_VIEW_REFRESH_ALL, bActiveChild)
		UPDATE_COMMAND_UI_POPUP_ENABLE_IF(ID_AUTOREFRESH_NONE, bActiveChild)
		UPDATE_COMMAND_UI_POPUP_ENABLE_IF(ID_VIEW_FONT_LARGEST, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_VIEW_FONT_SIZE, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_VIEW_SOURCE, bActiveChild)
		UPDATE_COMMAND_UI_SETCHECK_IF(ID_VIEW_FULLSCREEN, _IsFullScreen())

		// Favorite menu
		UPDATE_COMMAND_UI_ENABLE_IF(ID_FAVORITE_ADD, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_FAVORITE_GROUP_ADD, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_FAVORITE_GROUP_SAVE, bActiveChild)
		// Tool menu
		UPDATE_COMMAND_UI_ENABLE_IF_WITH_POPUP(ID_DLCTL_DLIMAGES, bActiveChild, bActiveChild)	// with poup
			UPDATE_COMMAND_UI_ENABLE_IF(ID_DLCTL_BGSOUNDS, bActiveChild)
			UPDATE_COMMAND_UI_ENABLE_IF(ID_DLCTL_VIDEOS, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF_WITH_POPUP(ID_DLCTL_RUNACTIVEXCTLS, bActiveChild, bActiveChild)// with popup
			UPDATE_COMMAND_UI_ENABLE_IF(ID_DLCTL_DLACTIVEXCTLS, bActiveChild)
			UPDATE_COMMAND_UI_ENABLE_IF(ID_DLCTL_SCRIPTS, bActiveChild)
			UPDATE_COMMAND_UI_ENABLE_IF(ID_DLCTL_JAVA, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_DOCHOSTUI_OPENNEWWIN, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_EDIT_IGNORE, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_TITLE_COPY, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_URL_COPY, bActiveChild)
		// Window menu
		UPDATE_COMMAND_UI_ENABLE_IF(ID_WINDOW_CLOSE_ALL, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_WINDOW_CLOSE_EXCEPT, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_TAB_LEFT, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_TAB_RIGHT, bActiveChild)
		UPDATE_COMMAND_UI_ENABLE_IF_WITH_POPUP(ID_WINDOW_RESTORE, bActiveChild, bActiveChild)// with popup
			UPDATE_COMMAND_UI_ENABLE_IF(ATL_IDS_SCPREVWINDOW, bActiveChild)
			UPDATE_COMMAND_UI_ENABLE_IF(ATL_IDS_SCNEXTWINDOW, bActiveChild)
			UPDATE_COMMAND_UI_ENABLE_IF(ID_WINDOW_CASCADE, bActiveChild && !CMainOption::s_bTabMode)
			UPDATE_COMMAND_UI_ENABLE_IF(ID_WINDOW_TILE_HORZ, bActiveChild && !CMainOption::s_bTabMode)
			UPDATE_COMMAND_UI_ENABLE_IF(ID_WINDOW_TILE_VERT, bActiveChild && !CMainOption::s_bTabMode)
			UPDATE_COMMAND_UI(ID_WINDOW_ARRANGE, OnUpdateWindowArrange) // to update Window Menu
			// UPDATE_COMMAND_UI_ENABLE_IF(ID_WINDOW_ARRANGE, bActiveChild && !CMainOption::s_bTabMode)
		// Misc
//		UPDATE_COMMAND_UI_SETTEXT(ID_DEFAULT_PANE, _T("儗僨傿"))
		UPDATE_COMMAND_UI(IDC_PROGRESS, OnUpdateProgressUI)
	END_UPDATE_COMMAND_UI_MAP()

	void OnUpdateWindowArrange(CCmdUI* pCmdUI)
	{
		// toolbar has not this command button, called only on menu popuping
		MDIRefreshMenu();
		MtlCompactMDIWindowMenuDocumentList(m_menuWindow, _nWindowMenuItemCount,
			CFavoritesMenuOption::GetMaxMenuItemTextLength());

		pCmdUI->Enable(MDIGetActive() != NULL && !CMainOption::s_bTabMode);
	}

	void OnUpdateProgressUI(CCmdUI* pCmdUI)
	{
		CProgressBarCtrl progressbar = pCmdUI->m_wndOther;
		progressbar.ShowWindow(SW_HIDE);
	}

	bool _IsClipboardAvailable()
	{
		return ::IsClipboardFormatAvailable(CF_TEXT) == TRUE;

/*		CComPtr<IDataObject> spDataObject;
		HRESULT hr = ::OleGetClipboard(&spDataObject);
		if (FAILED(hr))
			return false;

		FORMATETC formatetc = { CF_TEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
		hr = spDataObject->QueryGetData(&formatetc);
		if (hr == NOERROR) {
			return true;
		}
	
		return false;
*/
	}

	void _FocusChecker()
	{
		// Note. On idle time, give focus back to browser window...
		dmfTRACE(_T("_FocusChecker\n"));

		HWND hWndActive = MDIGetActive();
		if (hWndActive == NULL)
			return;

		HWND hWndForeground = ::GetForegroundWindow();
		bool bMysteriousWindowForeground = MtlIsKindOf(hWndForeground, _T("Internet Explorer_Hidden"));
		if (bMysteriousWindowForeground && MtlIsWindowCurrentProcess(hWndForeground))
			MtlSetForegroundWindow(m_hWnd);

		if (!MtlIsApplicationActive(m_hWnd))
		{
			dmfTRACE(_T(" application is not active\n"), hWndForeground);
			return;
		}

		HWND hWndFocus = ::GetFocus();
		if (hWndFocus != NULL && !MtlIsFamily(m_hWnd, hWndFocus)) {
			dmfTRACE(_T(" not family(focus=%x)\n"), hWndFocus);
			return;
		}

		if (::IsChild(m_hWndToolBar, hWndFocus)) {
			dmfTRACE(_T(" on rebar\n"));
			return;
		}

		if (::IsChild(m_ExplorerBar, hWndFocus))
		{
			dmfTRACE(_T(" on explorer bar\n"));
			return;
		}

		if (hWndFocus == NULL || m_hWnd == hWndFocus || hWndActive == hWndFocus ||
			MtlIsKindOf(hWndFocus, _T("Shell DocObject View")))
		{
			dmfTRACE(_T(" Go!!!!!\n"));
			MtlSendCommand(hWndActive, ID_VIEW_SETFOCUS);
		}
	}
};

/////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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