📄 mainfrm.h
字号:
// 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 + -