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

📄 childfrm.h

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

	struct _Function_OpenSelectedRef
	{
		HWND m_hWnd;
		_Function_OpenSelectedRef(HWND hWnd) : m_hWnd(hWnd) { }

		void operator()(IHTMLDocument2* pDocument)
		{
			CComPtr<IHTMLSelectionObject> spSelection;
			HRESULT hr = pDocument->get_selection(&spSelection);
			if (FAILED(hr))
				return;

			CComPtr<IDispatch> spDisp;
			hr = spSelection->createRange(&spDisp);
			if (FAILED(hr))
				return;
		
			CComQIPtr<IHTMLTxtRange> spTxtRange = spDisp;
			if (!spTxtRange)
				return;

			CComBSTR bstrText;
			hr = spTxtRange->get_htmlText(&bstrText);
			if (FAILED(hr) || !bstrText)
				return;

			CComBSTR bstrLocationUrl;
			hr = pDocument->get_URL(&bstrLocationUrl);
			if (FAILED(hr))
				return;

			dcfTRACE(_T(" Selected:%s\n"), CString(bstrText).Left(200));

			CSimpleArray<CString> arrUrl;
			MtlCreateHrefUrlArray(arrUrl, CString(bstrText), CString(bstrLocationUrl));
			for (int i = 0; i < arrUrl.GetSize(); ++i) {
				CString str(arrUrl[i]);
				DonutOpenFile(m_hWnd, arrUrl[i]);
			}
		}
	};

	void OnBrowserClose()
	{
		dcfTRACE(_T("CChildFrame::OnBrowserClose\n"));
		SetMsgHandled(FALSE);
		m_bClosing = true;
		PostMessage(WM_CLOSE);
	}

	void OnSaveOption(LPCTSTR lpszFileName, int nIndex)
	{
		m_view.m_ViewOption.WriteProfile(lpszFileName, nIndex);
	}

	void OnViewBackX(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/)
	{
		int nStep = 0;

		switch (wID) {
		case ID_VIEW_BACK5:
			nStep = 5;
			break;
		case ID_VIEW_BACK4:
			nStep = 4;
			break;
		case ID_VIEW_BACK3:
			nStep = 3;
			break;
		case ID_VIEW_BACK2:
			nStep = 2;
			break;
		case ID_VIEW_BACK1:
			nStep = 1;
			break;
		default:
			ATLASSERT(FALSE);
		}

//		CLockRedraw lock(m_hWnd);
		for (int i = 0; i < nStep; ++i)
			GoBack();
	}

	void OnViewForwardX(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/)
	{
		int nStep = 0;

		switch (wID) {
		case ID_VIEW_FORWARD5:
			nStep = 5;
			break;
		case ID_VIEW_FORWARD4:
			nStep = 4;
			break;
		case ID_VIEW_FORWARD3:
			nStep = 3;
			break;
		case ID_VIEW_FORWARD2:
			nStep = 2;
			break;
		case ID_VIEW_FORWARD1:
			nStep = 1;
			break;
		default:
			ATLASSERT(FALSE);
		}

//		CLockRedraw lock(m_hWnd);
		for (int i = 0; i < nStep; ++i)
			GoForward();
	}

	void OnTitleCopy(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/)
	{
		MtlSetClipboardText(MtlGetWindowText(m_hWnd), m_hWnd);
	}

	void OnUrlCopy(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/)
	{
		MtlSetClipboardText(GetLocationURL(), m_hWnd);
	}

	// It will be a template method.
	void OnMDIActivate(HWND hwndChildDeact, HWND hwndChildAct)
	{
		dcfTRACE(_T("CChildFrame::OnMDIActivate\n"));
		SetMsgHandled(FALSE);
			
		if (hwndChildAct == m_hWnd) {	// I'm activated
			m_AddressBar.SetWindowText(GetLocationURL());
			_SetPageFocus();
			_RestoreFocus();
			return;
		}
		
		if (hwndChildDeact == m_hWnd) {		// I'm deactivated
			_SaveFocus();
		}
	}

// Event handlers
	void OnStatusTextChange(const CString& strText)
	{
		m_strStatusBar = strText;

		if (MDIGetActive() == m_hWnd) {
			CWindow wndFrame = GetTopLevelParent();
			CWindow wndStatus = wndFrame.GetDlgItem(ATL_IDW_STATUS_BAR);
			MtlSetWindowText(wndStatus.m_hWnd, strText);
		}
	}

	void OnDocumentComplete(IDispatch* pDisp, const CString& strURL)
	{
		if (IsPageIWebBrowser(pDisp)) {	// it means a page complete downloading
			dcfTRACE(_T("CChildFrame::OnDocumentComplete\n"));
			m_bWaitNavigateLock = false;// you are allowed!

			if (MDIGetActive() == m_hWnd && DonutBrowserCanSetFocus(m_hWnd)) {
				_SetPageFocus();
			}
		}
	}

	void OnBeforeNavigate2(IDispatch* pDisp, const CString& strURL, DWORD nFlags,
		const CString& strTargetFrameName, CSimpleArray<BYTE>& baPostedData, const CString& strHeaders, bool& bCancel)
	{
		dcfTRACE(_T("CChildFrame::BeforeNavigate2 url(%s) frame(%s)\n"), strURL.Left(100), strTargetFrameName);

		if (m_bClosing) {
			bCancel = true;
			return;
		}

		// deter popups
		if (m_bNewWindow2 && IsPageIWebBrowser(pDisp) && CIgnoredURLsOption::SearchString(strURL)) {// close ignored url
			bCancel = true;
			m_bNewWindow2 = false;
			m_bClosing = true;
			PostMessage(WM_CLOSE);// It's possible to post twice, but don't care.
			return;
		}

		// Navigate lock
		if (_check_flag(DVS_EX_OPENNEWWIN, m_view.m_ViewOption.m_dwExStyle) &&
			m_bWaitNavigateLock == false &&	!IsRefreshBeforeNavigate2(pDisp))
		{
			dcfTRACE(_T(" Locked, open new window\n"));
			CChildFrame* pChild = CChildFrame::NewWindow(m_hWndMDIClient, m_MDITab, m_AddressBar,
														 false, _GetInheritedDLControlFlags());
			if (pChild) {
				pChild->ActivateFrameForNewWindowDelayed();
				pChild->Navigate2(strURL);
			}
			bCancel = true;
			return;
		}

		// Note: Some ActivateFrame would go mad, because MDI client window not setup yet.
		if (m_bNewWindow2) {// delayed activation if OnNewWindow2 called
			ActivateFrameForNewWindowDelayed();
			m_bNewWindow2 = false;
		}
	}

	void OnProgressChange(long progress, long progressMax)
	{
		m_nProgress = progress;
		m_nProgressMax = progressMax;
	}

	void OnCommandStateChange(long Command, bool bEnable)
	{
		if (Command == CSC_NAVIGATEBACK) {
			m_bNavigateBack = bEnable ? TRUE : FALSE;
		}		
		else if (Command == CSC_NAVIGATEFORWARD) {
			m_bNavigateForward = bEnable ? TRUE : FALSE;
		}
		else if (Command == CSC_UPDATECOMMANDS) {
		}
	}

	void OnDownloadComplete()
	{
		dcfTRACE(_T("CChildFrame::OnDownloadComplete\n"));

		if (m_bMozilla) {
			m_MDITab.SetComplete(m_hWnd);
			// required for mozilla cuz OnTitleChange seems to be not supported yet
			m_nProgress = m_nProgressMax = 0;
			SetWindowText(GetLocationName());

			// change address bar
			if (MDIGetActive() == m_hWnd)
				m_AddressBar.SetWindowText(GetLocationURL());
		}
	}

	void OnTitleChange(const CString& strTitle)
	{
		CString strURL = GetLocationURL();

		if (CCloseTitlesOption::SearchString(strTitle)) {
			m_bClosing = true;
			PostMessage(WM_CLOSE);
			return;
		}

		dcfTRACE(_T("OnTitleChange : %s\n"), strTitle.Left(100));
		// change title
		SetWindowText(MtlCompactString(strTitle, 255));

		// change address bar
		if (MDIGetActive() == m_hWnd)
			m_AddressBar.SetWindowText(strURL);
	}

	void OnNewWindow2(IDispatch** ppDisp, bool& bCancel)
	{
		dcfTRACE(_T("OnNewWindow2\n"));
		if (CMainOption::s_bAppClosing) {
			dcfTRACE(_T(" application closing, ignore this event\n"));
			bCancel = true;
			return;
		}


		CChildFrame* pChild = CChildFrame::NewWindow(m_hWndMDIClient, m_MDITab, m_AddressBar, true, _GetInheritedDLControlFlags());
		// Note: In this case, must be activated in BeforeNavigate2 strangely
		// pChild->ActivateFrameForNewWindowDelayed();
		if (pChild == NULL) {
			bCancel = true;
			return;
		}

		pChild->m_spBrowser->QueryInterface(IID_IDispatch, (void**)ppDisp);
		ATLASSERT(ppDisp != NULL);
	}

	DWORD _GetInheritedDLControlFlags()
	{
		DWORD dwDLFlags;
		if (_check_flag(MAIN_EX_INHERIT_OPTIONS, CMainOption::s_dwMainExtendedStyle))
			dwDLFlags = m_view._GetDLControlFlags();
		else
			dwDLFlags = CDLControlOption::s_dwDLControlFlags;// default

		return dwDLFlags;
	}

	void OnStateConnecting()
	{
		m_MDITab.SetConnecting(m_hWnd);
	}
	void OnStateDownloading()
	{
		m_MDITab.SetDownloading(m_hWnd);
	}
	void OnStateCompleted()
	{
		m_MDITab.SetComplete(m_hWnd);
	}

// Implementation
private:
	void _SaveFocus()
	{
		m_hWndFocus = ::GetFocus();
	}

	void _RestoreFocus()
	{
		if (m_hWndFocus && IsChild(m_hWndFocus) && ::GetFocus() != m_hWndFocus) {
			::SetFocus(m_hWndFocus);
		}
	}

	void _SetPageFocus()
	{
		dcfTRACE(_T("CChildFrame::_SetPageFocus(src:%d)\n"), ::GetFocus());
		if (m_bPageFocusInitialized)
			return;

		if (!MtlIsApplicationActive(m_hWnd))
			return;

		if (IsBrowserNull())
			return;

		CComPtr<IDispatch> spDisp;
		HRESULT hr = m_spBrowser->get_Document(&spDisp);
		if (FAILED(hr))
			return;

		CComQIPtr<IHTMLDocument2> spDoc = spDisp;
		if (!spDoc) // document not initialized yet
			return;

		CComPtr<IHTMLWindow2> spWnd;
		hr = spDoc->get_parentWindow(&spWnd);
		if (!spWnd)
			return;

		m_bPageFocusInitialized = true;	// avoid the endless loop
		hr = spWnd->focus();		// makes mainframe active
	}

	void _SetupWindowCloseHook()
	{
		HWND hWndBrowser;
		::EnumChildWindows(m_view.m_hWnd, (WNDENUMPROC)_EnumProc, (LPARAM)&hWndBrowser);
		ATLASSERT(::IsWindow(hWndBrowser));
		m_wndBrowser.SubclassWindow(hWndBrowser);
	}

	static BOOL CALLBACK _EnumProc(HWND hWnd, LPARAM lParam)
	{
		HWND* phWnd = (HWND*)lParam;
		*phWnd = hWnd;
		return FALSE;
	}

public:
// Update Command UI Map
	BEGIN_UPDATE_COMMAND_UI_MAP(CChildFrame)
		CHAIN_UPDATE_COMMAND_UI_MEMBER(m_view)

		UPDATE_COMMAND_UI_ENABLE_IF_WITH_POPUP(ID_VIEW_BACK, m_bNavigateBack, true)	// with popup
		UPDATE_COMMAND_UI_ENABLE_IF(ID_VIEW_FORWARD, m_bNavigateForward)

		UPDATE_COMMAND_UI_SETDEFAULT_PASS(ID_VIEW_BACK1)
		UPDATE_COMMAND_UI_SETDEFAULT_PASS(ID_VIEW_FORWARD1)

		UPDATE_COMMAND_UI_POPUP_ENABLE_IF(ID_VIEW_BACK1, m_bNavigateBack)	
		UPDATE_COMMAND_UI_POPUP_ENABLE_IF(ID_VIEW_FORWARD1, m_bNavigateForward)
		
		UPDATE_COMMAND_UI(ID_VIEW_FONT_SMALLEST, OnUpdateFontSmallestUI)
		UPDATE_COMMAND_UI(ID_VIEW_FONT_SMALLER, OnUpdateFontSmallerUI)
		UPDATE_COMMAND_UI(ID_VIEW_FONT_MEDIUM, OnUpdateFontMediumUI)
		UPDATE_COMMAND_UI(ID_VIEW_FONT_LARGER, OnUpdateFontLargerUI)
		UPDATE_COMMAND_UI(ID_VIEW_FONT_LARGEST, OnUpdateFontLargestUI)				// with popup

		UPDATE_COMMAND_UI(ID_DEFAULT_PANE, OnUpdateStatusBarUI)
		UPDATE_COMMAND_UI(IDC_PROGRESS, OnUpdateProgressUI)

		UPDATE_COMMAND_UI_ENABLE_IF_WITH_POPUP(ID_WINDOW_RESTORE, _GetShowCmd() != SW_SHOWNORMAL && !CMainOption::s_bTabMode, true)	// with popup
		UPDATE_COMMAND_UI_ENABLE_IF(ID_WINDOW_MOVE, _GetShowCmd() != SW_SHOWMAXIMIZED && !CMainOption::s_bTabMode)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_WINDOW_SIZE, _GetShowCmd() != SW_SHOWMAXIMIZED && _GetShowCmd() != SW_SHOWMINIMIZED && !CMainOption::s_bTabMode)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_WINDOW_MINIMIZE, _GetShowCmd() != SW_SHOWMINIMIZED && !CMainOption::s_bTabMode)
		UPDATE_COMMAND_UI_ENABLE_IF(ID_WINDOW_MAXIMIZE, _GetShowCmd() != SW_SHOWMAXIMIZED && !CMainOption::s_bTabMode)
	END_UPDATE_COMMAND_UI_MAP()

// Update Command UI Handlers
	void OnUpdateFontSmallestUI(CCmdUI* pCmdUI)
	{
		CComVariant var;
		ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
			NULL, &var);

		pCmdUI->SetRadio(var == CComVariant(0L) ? true : false);
	}

	void OnUpdateFontSmallerUI(CCmdUI* pCmdUI)
	{
		CComVariant var;
		ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
			NULL, &var);

		pCmdUI->SetRadio(var == CComVariant(1L) ? true : false);
	}

	void OnUpdateFontMediumUI(CCmdUI* pCmdUI)
	{
		CComVariant var;
		ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
			NULL, &var);

		pCmdUI->SetRadio(var == CComVariant(2L) ? true : false);
	}

	void OnUpdateFontLargerUI(CCmdUI* pCmdUI)
	{
		CComVariant var;
		ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
			NULL, &var);

		pCmdUI->SetRadio(var == CComVariant(3L) ? true : false);
	}

	void OnUpdateFontLargestUI(CCmdUI* pCmdUI)
	{
		if (pCmdUI->m_menuSub.m_hMenu) {// popup menu
			pCmdUI->m_menu.EnableMenuItem(pCmdUI->m_nIndex, MF_BYPOSITION | MF_ENABLED);
		}
		else {
			CComVariant var;
			ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
				NULL, &var);

			pCmdUI->SetRadio(var == CComVariant(4L) ? true : false);
		}
	}

	void OnUpdateStatusBarUI(CCmdUI* pCmdUI)
	{
		pCmdUI->SetText(m_strStatusBar);
	}

	void OnUpdateProgressUI(CCmdUI* pCmdUI)
	{
		CProgressBarCtrl progressbar = pCmdUI->m_wndOther;
		CStatusBarCtrl statusbar = pCmdUI->m_wndOther.GetParent();

		if (m_nProgress == -1 ||
			(m_nProgress == 0 && m_nProgressMax == 0)) {
			progressbar.ShowWindow(SW_HIDE);
			return;
		}

		CRect rcProgressPart;
		statusbar.GetRect(1, rcProgressPart);
		rcProgressPart.DeflateRect(2, 2);
		progressbar.MoveWindow(rcProgressPart, TRUE);
		progressbar.SetRange32(0, m_nProgressMax);
		progressbar.SetPos(m_nProgress);
		progressbar.ShowWindow(SW_SHOWNORMAL);
	}

	int _GetShowCmd()
	{
		CWindowPlacement wndpl;
		if (m_hWnd && ::GetWindowPlacement(m_hWnd, &wndpl)) {
			return wndpl.showCmd;
		}

		return -1;
	}
};

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

⌨️ 快捷键说明

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