mainfrm.h

来自「一个使用wtl写的完整的多窗口浏览器」· C头文件 代码 · 共 1,660 行 · 第 1/4 页

H
1,660
字号
	void OnParentNotify(UINT fwEvent, UINT idChild, LPARAM lParam)
	{
		if (fwEvent != WM_RBUTTONDOWN)
			return;

		CPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
		ClientToScreen(&pt);	
		
		CRect rc;
		::GetClientRect(m_hWndToolBar, &rc);
		CPoint ptRebar = pt; ::ScreenToClient(m_hWndToolBar, &ptRebar);
		if (!rc.PtInRect(ptRebar))			// not on rebar
			return;

		HWND hWnd = ::WindowFromPoint(pt);
		if (hWnd == m_MDITab.m_hWnd) {	// on tab bar
			CPoint ptTab = pt; m_MDITab.ScreenToClient(&ptTab);
			if (m_MDITab.HitTest(ptTab) != -1)
				return;
		}

/*		if (idChild == IDC_MDITAB) {
			CPoint pt2 = pt;
			ClientToScreen(&pt2);
			m_MDITab.ScreenToClient(&pt2);

			if (m_MDITab.HitTest(pt2) != -1)
				return;
		}
*/
		CMenuHandle menuView = ::GetSubMenu(m_CmdBar.GetMenu(), _nPosViewMenu);
		CMenuHandle menu = menuView.GetSubMenu(0);
	
//		CPoint ptCursor; ::GetCursorPos(&ptCursor);
		menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd, NULL);
	}

	void OnDestroy()
	{
		SetMsgHandled(FALSE);

		MtlSendCommand(m_hWnd, ID_VIEW_STOP_ALL);// added by DOGSTORE

		// Note. The script error dialog makes the app hung up.
		//       I can't find the reason, but I can avoid it by closing
		//       windows explicitly.
		MtlCloseAllMDIChildren(m_hWndMDIClient);

		CCriticalIdleTimer::UninstallCriticalIdleTimer();

		// what can I trust?
		ATLASSERT(::IsMenu(m_hMenu));
		::DestroyMenu(m_hMenu);

		RevokeDragDrop();
	}

	void OnActivate(UINT nState, BOOL bMinimized, HWND hWndOther)
	{
		if (nState == WA_INACTIVE) {
			m_hWndFocus = ::GetFocus();
		}
		else {
			if (m_hWndFocus)
				::SetFocus(m_hWndFocus);
		}
	}

	LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		CFavoritesMenuOption::Add(m_hWnd);
	
		//////////////////////////////////////////////////////////////////
		// initialize menus' infomation
		CMenuHandle menu = m_hMenu;
		CMenuHandle menuFav = menu.GetSubMenu(_nPosFavoriteMenu);
		m_FavoriteMenu.InstallExplorerMenu(menuFav);

		CMenuHandle menuGroup = menuFav.GetSubMenu(_nPosFavGroupMenu);
		m_FavGroupMenu.InstallExplorerMenu(menuGroup);

		// MRU list
		CMainOption::SetMRUMenuHandle(menu, _nPosMRU);

		//////////////////////////////////////////////////////////////////
		// create command bar window
		SetMenu(NULL);// remove menu
		HWND hWndCmdBar = m_CmdBar.Create(m_hWnd, rcDefault, NULL, MTL_SIMPLE_CMDBAR2_PANE_STYLE, 0, ATL_IDW_COMMAND_BAR);
		m_CmdBar.AttachMenu(m_hMenu);
		m_CmdBar.EnableButton(_nPosWindowMenu, false);

		//////////////////////////////////////////////////////////////////
		// create toolbar
		HWND hWndToolBar = m_ToolBar.DonutToolBar_Create(m_hWnd);
		ATLASSERT(::IsWindow(hWndToolBar));
		m_ToolBar.DonutToolBar_SetFavoritesMenu(menuFav);

		//////////////////////////////////////////////////////////////////
		// create addressbar
		HWND hWndAddressBar = m_AddressBar.Create(m_hWnd, IDC_ADDRESSBAR, ID_VIEW_GO,
			IDB_GOBUTTON, IDB_GOBUTTON_HOT, 16, 16, RGB(255, 0, 255));
		ATLASSERT(::IsWindow(hWndAddressBar));
		
		//////////////////////////////////////////////////////////////////
		// create tabctrl
		HWND hWndMDITab = m_MDITab.Create(m_hWnd, CRect(0, 0, 200, 20), _T("Donut MDITab"),
			WS_CHILD | WS_VISIBLE, NULL, IDC_MDITAB);
		m_MDITab.LoadMenu(IDR_MENU_TAB);
		m_MDITab.LoadConnectingAndDownloadingImageList(IDB_MDITAB, 6, 6, RGB(255, 255, 255));

		//////////////////////////////////////////////////////////////////
		// create link bar
		HWND hWndLinkBar = m_LinkBar.Create(m_hWnd, rcDefault, NULL, ATL_SIMPLE_TOOLBAR_PANE_STYLE, 0, IDC_LINKBAR);

		//////////////////////////////////////////////////////////////////
		// create rebar
		CreateSimpleReBar(MTL_SIMPLE_REBAR_STYLE | RBS_DBLCLKTOGGLE);
//		CWindow(m_hWndToolBar).ModifyStyleEx(0, WS_EX_CLIENTEDGE);

		//////////////////////////////////////////////////////////////////
		// create statusbar //CreateSimpleStatusBar();
		m_wndStatusBar.Create(m_hWnd);
		m_hWndStatusBar = m_wndStatusBar.m_hWnd;
		int nPanes[] = { ID_DEFAULT_PANE, ID_PROGRESS_PANE };
		m_wndStatusBar.SetPanes(nPanes, 2, false);

		//////////////////////////////////////////////////////////////////
		// create prgress bar
		m_wndProgress.Create(m_hWndStatusBar, NULL, NULL, WS_CHILD | WS_CLIPSIBLINGS    
			| PBS_SMOOTH, 0, IDC_PROGRESS);
		m_wndProgress.ModifyStyleEx(WS_EX_STATICEDGE, 0);

		//////////////////////////////////////////////////////////////////
		CIniSection pr;

		//////////////////////////////////////////////////////////////////
		// load band position
		CReBarBandInfo rbis[] = {
			{ 0, hWndCmdBar, ATL_IDW_COMMAND_BAR, 0, NULL, 0 },
			{ 1, hWndToolBar, ATL_IDW_TOOLBAR, RBBS_BREAK, NULL, 0 },
			{ 2, hWndAddressBar, IDC_ADDRESSBAR, RBBS_BREAK, NULL/*_T("Address")*/, 0 },
			{ 3, hWndMDITab, IDC_MDITAB, RBBS_BREAK, NULL, 0 },
			{ 4, hWndLinkBar, IDC_LINKBAR, RBBS_BREAK, _T("Links"), 0 },
		};
		pr.Open(_szIniFileName, _T("ReBar"));
		MtlGetProfileReBarBandsState(rbis, rbis + _countof(rbis), pr, *this);
		pr.Close();

		m_CmdBar.RefreshBandIdealSize(m_hWndToolBar);
		m_AddressBar.InitReBarBandInfo(m_hWndToolBar);// if you dislike a header, remove this.

		//////////////////////////////////////////////////////////////////
		// load status bar state
		pr.Open(_szIniFileName, _T("Main"));
		BOOL bStatusBarVisible = TRUE;
		MtlGetProfileStatusBarState(pr, m_hWndStatusBar, bStatusBarVisible);
		m_bStatusBarVisibleUnlessFullScreen = bStatusBarVisible;
		pr.Close();

		//////////////////////////////////////////////////////////////////
		// create mdi client window
		m_menuWindow = ::GetSubMenu(m_hMenu, _nPosWindowMenu);
		CreateMDIClient(m_menuWindow.m_hMenu);
		m_wndMDIClient.SubclassWindow(m_hWndMDIClient);

		// NOTE: If WS_CLIPCHILDREN not set, MDI Client will try erase background over MDI child window,
		//       but as OnEraseBkgnd does nothing, it goes well.
		if (CMainOption::s_bTabMode)
			m_wndMDIClient.ModifyStyle(WS_CLIPCHILDREN, 0);// to avoid flicker, but scary

		//////////////////////////////////////////////////////////////////
		// splitter window
		m_wndSplit.SetSplitterExtendedStyle(0);
		m_hWndClient = m_wndSplit.Create(m_hWnd, rcDefault, NULL,
			WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);

		//////////////////////////////////////////////////////////////////
		// pane container
		m_ExplorerBar.Create(m_hWndClient);
		m_ExplorerBar.DonutExplorerBar_Init(m_hWndMDIClient);

		//////////////////////////////////////////////////////////////////
		// MDIClient misc
		m_mcCmdBar.InstallAsMDICmdBar(hWndCmdBar, m_hWndMDIClient, CMainOption::s_bTabMode);
		m_mcToolBar.InstallAsStandard(hWndToolBar, m_hWnd, true, ID_VIEW_FULLSCREEN);

		m_MDITab.SetMDIClient(m_hWndMDIClient);

		//////////////////////////////////////////////////////////////////
		// set up UI
		CmdUIAddToolBar(hWndToolBar);

		// message loop	
		CMessageLoop* pLoop = _Module.GetMessageLoop();
		pLoop->AddMessageFilter(this);
		pLoop->AddIdleHandler(this);

		// read general settings
		_ReadProfile();
		// for dragging files
		RegisterDragDrop();// DragAcceptFiles();

		_ShowBandsFullScreen(true, true);

		CCriticalIdleTimer::InstallCriticalIdleTimer(m_hWnd, ID_VIEW_IDLE);

		return 0;
	}

	LRESULT OnMouseWheel(UINT fwKeys, short zDelta, CPoint point)
	{
		// I don't have a wheel mouse...
		if ( (m_MDITab.GetMDITabExtendedStyle() & MTB_EX_WHEEL) &&
			  MtlIsBandVisible(m_hWndToolBar, IDC_MDITAB) ) {
			CRect rcTab;
			m_MDITab.GetWindowRect(&rcTab);
			if (rcTab.PtInRect(point)) {
				if (zDelta > 0) {
					m_MDITab.LeftTab();
				}
				else {
					m_MDITab.RightTab();
				}
				SetMsgHandled(TRUE);
				return 0;
			}
		}

		SetMsgHandled(FALSE);
		return 1;
	}

	LRESULT OnFileRecent(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		// get file name from the MRU list
		TCHAR szFile[INTERNET_MAX_PATH_LENGTH];
		if(CMainOption::s_pMru->GetFromList(wID, szFile))
		{
			OnUserOpenFile(szFile, DonutGetStdOpenFlag());
		}
		else
		{
			::MessageBeep(MB_ICONERROR);
		}

		return 0;
	}

	LRESULT OnViewRefreshFavBar(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		m_FavoriteMenu.RefreshMenu();
		m_FavGroupMenu.RefreshMenu();

		return 0;
	}

	LRESULT OnViewIdle(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		_OnIdleCritical();

		return 0;
	}

	void OnClose()
	{
		SetMsgHandled(FALSE);

		if (!CDonutConfirmOption::OnDonutExit(m_hWnd)) {
			SetMsgHandled(TRUE);
			return;
		}

		if (_IsFullScreen()) {
			CMainOption::s_dwMainExtendedStyle |= MAIN_EX_FULLSCREEN;// save style
			_ShowBandsFullScreen(FALSE);// restore bands position
		}
		else {
			CMainOption::s_dwMainExtendedStyle &= ~MAIN_EX_FULLSCREEN;
		}
		
		if (m_nBackUpTimerID != 0)
			KillTimer(m_nBackUpTimerID);

		m_mcCmdBar.Uninstall();
		m_mcToolBar.Uninstall();

		_WriteProfile();

		CMainOption::s_bAppClosing = true;
	}

	void OnNewInstance(ATOM nAtom)
	{
		TCHAR szBuff[4096];
		if (::GlobalGetAtomName(nAtom, szBuff, 4096) != 0) {
			dmfTRACE(_T("CMainFrame::OnNewInstance: %s\n"), szBuff);
			OnUserOpenFile(szBuff, DonutGetStdOpenFlag());
			::GlobalDeleteAtom(nAtom);
			if (!(CMainOption::s_dwMainExtendedStyle & MAIN_EX_NOACTIVATE))
				MtlSetForegroundWindow(m_hWnd);
		}
	}

	LRESULT OnFileNew(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		if (CFileNewOption::s_dwFlags == FILENEW_BLANK)
			OnFileNewBlank(0, 0, 0);
		else if (CFileNewOption::s_dwFlags == FILENEW_COPY) {
			if (MDIGetActive() != NULL)
				SendMessage(WM_COMMAND, MAKEWPARAM(ID_FILE_NEW_COPY, 0), 0);
			else
				OnFileNewBlank(0, 0, 0);
		}
		else if (CFileNewOption::s_dwFlags == FILENEW_HOME)
			OnFileNewHome(0, 0, 0);
		else
			ATLASSERT(FALSE);

		return 0;
	}

	void OnFileNewHome(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
	{
		HWND hWndChild = OnUserOpenFile(NULL, DonutGetStdOpenActivateFlag());
		if (hWndChild) {
			CWebBrowser2 browser = DonutGetIWebBrowser2(hWndChild);
			if (browser.m_spBrowser != NULL)
				browser.GoHome();
		}
	}

	void OnViewHome(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
	{
		bool bNew = ::GetAsyncKeyState(VK_CONTROL) < 0 || ::GetAsyncKeyState(VK_SHIFT) < 0;
		if (bNew || MDIGetActive() == NULL) {
			OnFileNewHome(0, 0, 0);
		}
		else {
			SetMsgHandled(FALSE);
		}
	}

	void OnRegisterAsBrowser(WORD wNotifyCode, WORD /*wID*/, HWND /*hWndCtl*/)
	{
		if (wNotifyCode == NM_ON) {
			MtlForEachMDIChild(m_hWndMDIClient, CSendCommand(ID_REGISTER_AS_BROWSER, NM_ON));
		}
		else if (wNotifyCode == NM_OFF) {
			MtlForEachMDIChild(m_hWndMDIClient, CSendCommand(ID_REGISTER_AS_BROWSER, NM_OFF));
		}
		else if (!_check_flag(MAIN_EX_REGISTER_AS_BROWSER, CMainOption::s_dwMainExtendedStyle)) {
			CMainOption::s_dwMainExtendedStyle |= MAIN_EX_REGISTER_AS_BROWSER;
			MtlForEachMDIChild(m_hWndMDIClient, CSendCommand(ID_REGISTER_AS_BROWSER, NM_ON));
		}
		else {
			CMainOption::s_dwMainExtendedStyle &= ~MAIN_EX_REGISTER_AS_BROWSER;
			MtlForEachMDIChild(m_hWndMDIClient, CSendCommand(ID_REGISTER_AS_BROWSER, NM_OFF));
		}
	}

	void OnFileNewClipBoard(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
	{
		CString strText = MtlGetClipboardText();
		if (strText.IsEmpty())
			return;

		OnUserOpenFile(strText, DonutGetStdOpenActivateFlag());
	}

	void OnFileNewClipBoard2(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
	{
		CString strText = MtlGetClipboardText();
		if (strText.IsEmpty())
			return;

		OnUserOpenFile(strText, DonutGetStdOpenFlag());// allow the option
	}

	void OnFileNewClipBoardEx(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
	{
		m_ExplorerBar.m_ClpBar.OpenClipboardUrl();
	}

	void OnFileNewCopy(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
	{
		HWND hWndActive = MDIGetActive();
		if (hWndActive) {
			CWebBrowser2 browser = DonutGetIWebBrowser2(hWndActive);
			if (browser.m_spBrowser != NULL) {
				CString strURL = browser.GetLocationURL();
				if (!strURL.IsEmpty())
					OnUserOpenFile(strURL, DonutGetStdOpenActivateFlag());
			}
		}
	}

	void OnFileNewBlank(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
	{
		OnUserOpenFile(_T("about:blank"), DonutGetStdOpenActivateFlag());
	}

	void OnFileWorkOffline(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/)
	{
		MtlSetGlobalOffline(!MtlIsGlobalOffline());
		UpdateTitleBarUpsideDown();
	}


	LRESULT OnFileOpen(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		dmfTRACE(_T("CMainFrame::OnFileOpen\n"));
		COpenURLDlg dlg;
		if (dlg.DoModal() == IDOK && !dlg.m_strEdit.IsEmpty()) {
			OnUserOpenFile(dlg.m_strEdit, DonutGetStdOpenFlag());
		}

⌨️ 快捷键说明

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