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