📄 mainwnd.cpp
字号:
case ID_GO_FORWARD: ////向前
_pBrowser->GoForward();
return 0;
case ID_GO_HOME: ////主页
_pBrowser->GoHome();
return 0;
case ID_GO_SEARCH: ///搜索
_pBrowser->GoSearch();
return 0;
case ID_VIEW_REFRESH: ////刷新
_pBrowser->Refresh();
return 0;
case ID_VIEW_STOP: ////停止
_pBrowser->Stop();
return 0;
case ID_ZOOMUP: /////放大
_wZoom++;
if(_wZoom > 4)
_wZoom = 4;
ChangeFontSize(FALSE);
return 0;
case ID_ZOOMDOWN: /////缩小
_wZoom--;
if(_wZoom < 0)
_wZoom = 0;
ChangeFontSize(FALSE);
return 0;
case ID_CLOSE: /////关闭
_pBrowser->ExecWB(OLECMDID_CLOSE, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
return 0;
case ID_FOCUS_URL:
case ID_OPEN: /////“打开”对话框 ,键入URL
{
WCHAR *szURL = new TCHAR[MAX_URL];
if(szURL)
{
int nRet = 0;
BSTR bstrUrl = NULL;
_pBrowser->get_LocationURL(&bstrUrl); //////得到当前窗口显示的网页的URL
StringCchCopy(szURL, MAX_URL, (LPCTSTR)bstrUrl);
SysFreeString(bstrUrl);
//////创建对话框
nRet = DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_OPEN_DIALOG), _hWnd, OpenURLDlgProc, (long)szURL);
if(nRet == 1) ///////在原有窗口中打开网页
{
_pBrowser->Navigate(szURL, NULL, NULL, NULL, NULL);
}
else if(nRet == 2) //////在新窗口中打开网页
{
HandleNewWindow2(szURL, NULL);
}
delete[] szURL;
}
}
return 0;
case ID_FULLSCREEN: ////////主窗口满屏显示
{
DWORD dwStyle = GetWindowLong(_hWnd, GWL_STYLE);
if(_fFullScreen)
{
dwStyle |= (WS_OVERLAPPED | WS_SYSMENU | WS_THICKFRAME);
SetWindowLong(_hWnd, GWL_STYLE, dwStyle);
SetWindowPos(_hWnd,NULL, _rcWnd.left, _rcWnd.top, _rcWnd.right-_rcWnd.left,
_rcWnd.bottom-_rcWnd.top, SWP_NOZORDER);
_fFullScreen = FALSE;
}
else
{
RECT rcWorkArea;
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0);
_fFullScreen = TRUE;
dwStyle &= ~(WS_OVERLAPPED | WS_SYSMENU | WS_THICKFRAME);
SetWindowLong(_hWnd, GWL_STYLE, dwStyle);
SetWindowPos(_hWnd,NULL, rcWorkArea.left, rcWorkArea.top, rcWorkArea.right-rcWorkArea.left,
rcWorkArea.bottom-rcWorkArea.top, SWP_NOZORDER);
}
}
return 0;
}
return 0;
}
EXTERN_C const GUID CGID_ShellDocView;
///////CMainWnd的消息处理函数
LRESULT CALLBACK CMainWnd::MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
CMainWnd *pMainWnd = (CMainWnd*)GetWindowLong(hwnd, GWL_USERDATA);
if (pMainWnd)
{
switch (message)
{
case WM_CLOSE:
case WM_DESTROY:
if(pMainWnd)
pMainWnd->Close();
SetWindowLong(hwnd, GWL_USERDATA, (DWORD)0);
::PostQuitMessage(0); /////发送 WM_QUIT 消息
break;
case WM_SETFOCUS: /////获得焦点
if (pMainWnd->_pIPActiveObj)
{
pMainWnd->_pIPActiveObj->OnFrameWindowActivate(LOWORD(wParam) != WA_INACTIVE);
}
return 0;
case WM_SIZE:
{
RECT rcWnd;
GetClientRect(hwnd, &rcWnd);
SetWindowPos(pMainWnd->_hWndBrowser,
NULL,
0,
0,
rcWnd.right-rcWnd.left,
rcWnd.bottom - rcWnd.top,
SWP_NOZORDER);
}
// FALL THROUGH
case WM_MOVE:
if(!pMainWnd->_fFullScreen)
GetWindowRect(hwnd, &pMainWnd->_rcWnd);
break;
case WM_COMMAND: /////得到命令,执行HandleCommand
return pMainWnd->HandleCommand(wParam, lParam);
break;
case WM_NOTIFY:
break;
case WM_INITMENUPOPUP:
break;
case WM_SETTINGCHANGE: /////这个消息由OS发送到所有顶层窗口,当系统有改变时
if(wParam == SPI_SETWORKAREA)
{
if(pMainWnd->_fFullScreen) //////全屏
{
RECT rcWorkArea;
// no need to change the window style here, just adjust for the new work-area.
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0);
SetWindowPos(pMainWnd->_hWnd,NULL, rcWorkArea.left, rcWorkArea.top, rcWorkArea.right-rcWorkArea.left, rcWorkArea.bottom-rcWorkArea.top, SWP_NOZORDER);
}
}
break;
default:
break;
}
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
//////翻译消息前的处理
BOOL CMainWnd::PreTranslateMessage(LPMSG pMsg)
{
if (::TranslateAccelerator(_hWnd, _hAccelTbl, pMsg)) //first shot to the main frame
return TRUE;
//then to mshtml
if (_pIPActiveObj && pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
{
HRESULT hr = _pIPActiveObj->TranslateAccelerator(pMsg);
return (hr != S_FALSE);
}
return FALSE;
}
//////改变字体大小
VOID CMainWnd::ChangeFontSize(BOOL fInit)
{
VARIANT vaSize;
vaSize.vt = VT_I4;
if (fInit) {
// Setting initial value
vaSize.vt = 0;
HRESULT hr = _pBrowser->ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
NULL, &vaSize);
_wZoom = vaSize.lVal;
} else {
vaSize.lVal = _wZoom;
HRESULT hr = _pBrowser->ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
&vaSize, NULL);
}
}
//////关闭CMainWnd
VOID CMainWnd::Close()
{
RETAILMSG(1,(L"IESIMPLE CMainWnd::Close"));
// Tell the shell to die off
SendMessage(_hWndBrowser, WM_CLOSE, 0,0); ///发送CLOSE消息到Browser窗口
if(_pIPActiveObj)
{
_pIPActiveObj->Release();
}
_pIPActiveObj = NULL;
if(_pCP)
{
_pCP->Unadvise(_dwEventCookie);
_pCP->Release();
}
_pCP = NULL;
if(_pObject)
{
_pObject->Close(FALSE);
_pObject->Release();
}
_pObject = NULL;
if(_pBrowser)
_pBrowser->Release();
_pBrowser = NULL;
}
////////查找字符串
HRESULT CMainWnd::FindString()
{
LPDISPATCH pDisp = NULL;
LPOLECOMMANDTARGET pCmdTarg = NULL;
HRESULT sts = S_OK;
VARIANTARG var;
#define GOERROR_S(bNotCond) {if (!(bNotCond)) goto errorS; }
if (!_pBrowser)
return S_OK;
sts = _pBrowser->get_Document(&pDisp);
GOERROR_S(pDisp);
sts = pDisp->QueryInterface(IID_IOleCommandTarget, (LPVOID*)&pCmdTarg);
GOERROR_S(pCmdTarg);
var.vt = VT_I4;
var.lVal = 0;
sts = pCmdTarg->Exec(
NULL,
OLECMDID_FIND,
MSOCMDEXECOPT_PROMPTUSER,
NULL,
&var);
errorS:
if (pCmdTarg)
pCmdTarg->Release(); // release document's command target
if (pDisp)
pDisp->Release(); // release document's dispatch interface
return sts;
}
BOOL HandleBrowse(HWND hwndOwner, WCHAR *szURL);
///////“打开”对话框的消息处理函数
extern "C" BOOL APIENTRY OpenURLDlgProc (HWND hDlg, UINT message, UINT wParam, LONG lParam)
{
WCHAR *szURL = (WCHAR *)GetWindowLong(hDlg,DWL_USER);
int nRet = 4;
switch(message)
{
case WM_INITDIALOG:
{
if(!lParam)
{
EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_BROWSE), FALSE);
}
else
{
szURL = (WCHAR *)lParam;
SetWindowLong(hDlg, DWL_USER, (LONG)szURL);
SendMessage(GetDlgItem(hDlg, IDC_URL_EDIT), EM_LIMITTEXT, MAX_URL-1, 0);
if(szURL[0])
{
SetDlgItemText(hDlg, IDC_URL_EDIT, szURL);
}
}
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
{
GetDlgItemText(hDlg, IDC_URL_EDIT, szURL, MAX_URL-1); //////得到用户输入的szURL
BOOL bNewWnd = SendMessage(GetDlgItem(hDlg, IDC_NEWWINDOW), BM_GETCHECK, 0L, 0L);
nRet = (bNewWnd) ? 2 : 1; /////是否打开新窗口
}
case IDCANCEL:
EndDialog(hDlg, nRet);
return TRUE;
case IDC_BROWSE:
if(HandleBrowse(hDlg, szURL)) ////文件打开对话框
{
SetDlgItemText(hDlg, IDC_URL_EDIT, szURL);
}
default:
return (TRUE);
}
break;
case WM_DESTROY:
SetWindowLong(hDlg, DWL_USER, 0);
break;
}
return (FALSE);
}
////文件打开对话框
extern HINSTANCE g_hInstance;
BOOL HandleBrowse(HWND hwndOwner, WCHAR *szURL)
{
OPENFILENAME ofn;
WCHAR wchFilter[MAX_PATH];
WCHAR wchFile[MAX_PATH+8];
int cbLen;
// Initialize ofn struct
memset(&ofn, 0, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwndOwner;
ofn.Flags = OFN_FILEMUSTEXIST |
OFN_PATHMUSTEXIST |
OFN_OVERWRITEPROMPT |
OFN_HIDEREADONLY;
cbLen = LoadString(g_hInstance, IDS_BROWSEFILTER,
wchFilter, MAX_PATH-2);
if (cbLen>0)
{
for (; cbLen >= 0; cbLen--)
{
if (wchFilter[cbLen]== L'@')
{
wchFilter[cbLen] = 0;
}
}
}
else
{
return FALSE;
}
ofn.lpstrFilter = wchFilter;
ofn.nFilterIndex = 1;
wcscpy(wchFile, L"file://");
ofn.lpstrFile = wchFile+wcslen(wchFile); // prefix the string with "file://"
ofn.nMaxFile = MAX_PATH;
if (GetOpenFileName(&ofn))
{
wcsncpy(szURL, wchFile, MAX_URL-1);
return TRUE;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -