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