📄 mainwnd.cpp
字号:
if (_fEmpty)
{
if (_lpszUrl)
{
LPTSTR lpszUrlAlpha = _lpszUrl;
while (hr == S_FALSE && *lpszUrlAlpha != _T('\0'))
{
if (_istalpha(*lpszUrlAlpha))
hr = S_OK;
lpszUrlAlpha++;
}
}
if (hr == S_OK)
_pBrowser->Navigate(_lpszUrl, NULL, NULL, NULL, NULL);
else
_pBrowser->GoHome();
}
hr = InitEvents();
}
Cleanup:
if (pUnk)
pUnk->Release();
if (pObject)
pObject->Release();
IOleWindow *pWnd = NULL;
HWND hwndBrowser = NULL;
if (_pBrowser) /// _pBrowser保存了IWebBrowser2的指针
{
hr = _pBrowser->QueryInterface(IID_IOleWindow, (LPVOID *)(&pWnd));
if (hr)
return NULL;
}
if (pWnd)
{
hr = pWnd->GetWindow(&hwndBrowser); /////得到参与接口IOleObject本地激活的窗口句柄
pWnd->Release();
}
return hwndBrowser;
}
/////激活IWebBrowser控件
HRESULT CMainWnd::Activate(IOleObject *pObject)
{
_pObject = pObject;
_pObject->AddRef();
RECT rc;
::GetClientRect(_hWnd, &rc); ////主窗口客户端尺寸
HRESULT hr;
/////在本地激活控件,包括全部界面 。 父窗口为CMainWnd 。范围为主窗口客户端
hr = _pObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, this, 0, _hWnd, &rc);
if (hr)
goto Cleanup;
Cleanup:
return hr;
}
//////初始化WebBrowser事件
HRESULT CMainWnd::InitEvents()
{
HRESULT hr;
IConnectionPointContainer *pCPCont = NULL;
DWebBrowserEvents *pEvents = NULL;
if (!_pBrowser)
return S_FALSE;
hr = _pBrowser->QueryInterface(IID_IConnectionPointContainer, (LPVOID *)&pCPCont);
if (hr)
return S_FALSE;
hr = pCPCont->FindConnectionPoint(DIID_DWebBrowserEvents2, &_pCP);
if (hr)
{
_pCP = NULL;
goto Cleanup;
}
hr = QueryInterface(DIID_DWebBrowserEvents2, (LPVOID *)(&pEvents));
if (hr)
goto Cleanup;
hr = _pCP->Advise(pEvents, &(_dwEventCookie)); /////建立连接
if (hr)
goto Cleanup;
Cleanup:
if (pCPCont)
pCPCont->Release();
if (pEvents)
pEvents->Release();
return hr;
}
////////创建一个线程,在线程中创建一个窗口CMainWnd
HRESULT HandleNewWindow2(LPTSTR lpszUrl, DISPPARAMS FAR* pdparams)
{
HANDLE hThread;
CMainWnd *pNewWnd;
IDispatch *pDispatch;
HRESULT hr = S_OK;
pNewWnd = new CMainWnd; /////主窗口对象
if (!pNewWnd)
{
return E_OUTOFMEMORY;
}
pNewWnd->_lpszUrl = lpszUrl;
if(!pdparams)
pNewWnd->_fEmpty = TRUE;
pNewWnd->hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); /////创建事件对象, 自动重置
if (!pNewWnd->hEvent)
{
}
InterlockedIncrement(&glThreadCount); ////增加线程数
/////创建一个线程,线程函数 NewWindow ,参数CMainWnd指针 ,指定栈大小 。
hThread = CreateThread(NULL, g_dwMainWindowStackSize, NewWindow, (LPVOID)pNewWnd, STACK_SIZE_PARAM_IS_A_RESERVATION, NULL);
if (!hThread)
{
delete pNewWnd;
InterlockedDecrement(&glThreadCount);
return E_OUTOFMEMORY;
}
//////等待NewWindow函数执行,直到事件对象处于有信号状态
WaitForSingleObject(pNewWnd->hEvent, INFINITE);
CloseHandle(hThread);
if(pdparams)
{
if (pNewWnd->_pBrowser)
{
hr = pNewWnd->_pBrowser->QueryInterface(IID_IDispatch, (LPVOID *)(&pDispatch));
}
else
{
hr = E_FAIL;
pDispatch = NULL;
}
*(pdparams->rgvarg[0].pboolVal) = 0;
*(pdparams->rgvarg[1].ppdispVal) = pDispatch;
}
return hr;
}
///////////////////////////////////////////////////////////////////////////
//////得到主机性能
STDMETHODIMP CMainWnd::GetHostInfo(DOCHOSTUIINFO *pInfo)
{
///在此可以设置浏览器的各种选项
////具体选项见MSDN 标题为“DOCHOSTUIFLAG Enumerated Type”
pInfo->cbSize = sizeof(DOCHOSTUIINFO);
pInfo->dwFlags = DOCHOSTUIFLAG_FLAT_SCROLLBAR | DOCHOSTUIFLAG_FLAT_SCROLLBAR
| DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8 | DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE
| DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION;
return S_OK;
}
///////对网页中显示对象的选择
STDMETHODIMP CMainWnd::Invoke (
DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS FAR* pdparams,
VARIANT FAR* pvarResult,
EXCEPINFO FAR* pexcepinfo,
UINT FAR* puArgErr
)
{
switch (dispidMember)
{
case DISPID_AMBIENT_DLCONTROL: //////下载控件
if(pvarResult)
{
V_VT(pvarResult) = VT_I4;
////设置下载的内容包括哪些 标题为“About the Browser”
pvarResult->lVal = DLCTL_DLIMAGES ////下载图像
| DLCTL_VIDEOS ////下载视频
| DLCTL_NO_DLACTIVEXCTLS ////不下载Active X控件
| DLCTL_NO_JAVA ////不执行java程序
// | DLCTL_NO_SCRIPTS ////不执行任何脚本
| DLCTL_BGSOUNDS; ////下载背景音乐
// put the browser in download only mode
// pvarResult->lVal |= DLCTL_DOWNLOADONLY;
}
break;
case DISPID_STATUSTEXTCHANGE:
{
}
break;
case DISPID_SETSECURELOCKICON:
{
}
break;
case DISPID_PROGRESSCHANGE: //////进度条变化
{
LONG lProgMax = pdparams->rgvarg[0].lVal;
LONG lProg = pdparams->rgvarg[1].lVal;
UINT nPos = (lProg == -1) ? 999 : ((lProg-1)%1000);
SendMessage(_hwndProgress, PBM_SETPOS, nPos, 0);
}
break;
// notification for file download
case DISPID_FILEDOWNLOAD:
break;
case DISPID_NAVIGATECOMPLETE2: /////导航结束,既下载全部页面并显示
break;
case DISPID_COMMANDSTATECHANGE:
break;
case DISPID_TITLECHANGE: /////窗口标题改变
if (pdparams && pdparams->rgvarg[0].vt == VT_BSTR)
{
TCHAR szTitle[85];
int len = wcslen(pdparams->rgvarg[0].bstrVal);
_tcsncpy(_szTitle, pdparams->rgvarg[0].bstrVal, MAX_URL-1);
_tcsncpy(szTitle, pdparams->rgvarg[0].bstrVal, 80);
if(len > 80)
_tcscat(szTitle, L"...");
SetWindowText(_hWnd, szTitle); /////用URL设置窗口标题文本
}
break;
case DISPID_ONQUIT:
PostMessage(_hWnd, WM_CLOSE, 0, 0L);
break;
case DISPID_DOWNLOADBEGIN: ////////开始下载
_wDLCCounter++;
SetWindowPos(_hwndProgress, HWND_TOP, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_SHOWWINDOW);
break;
case DISPID_DOWNLOADCOMPLETE: /////////下载完成
case DISPID_DOCUMENTCOMPLETE:
_wDLCCounter--;
if(_wDLCCounter <= 0)
{
SetWindowPos(_hwndProgress,NULL, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_HIDEWINDOW);
ChangeFontSize(TRUE);
_wDLCCounter = 0;
}
break;
case DISPID_NEWWINDOW2: /////////在新窗口中打开网页
//pdparams->rgvarg[1].boolVal = VARIANT_TRUE;
//break;
return HandleNewWindow2(NULL, pdparams);
break;
case DISPID_PROPERTYCHANGE:
case DISPID_BEFORENAVIGATE2:
break;
default:
return DISP_E_MEMBERNOTFOUND;
}
return S_OK;
}
STDMETHODIMP CMainWnd::moveTo( LONG x, LONG y)
{
SetWindowPos(_hWnd, NULL, x, y, 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE);
return S_OK;
}
STDMETHODIMP CMainWnd::moveBy( LONG x, LONG y)
{
RECT rcWindow;
GetWindowRect(_hWnd, &rcWindow);
SetWindowPos(_hWnd, NULL, rcWindow.left + x, rcWindow.top + y, 0, 0,
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE);
return S_OK;
}
STDMETHODIMP CMainWnd::resizeTo( LONG x, LONG y)
{
// We do not want the size to be less then 100 for top level windows in browser
if (x < 100)
x = 100;
if (y < 100)
y = 100;
SetWindowPos(_hWnd, NULL, 0, 0, x, y, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE);
return S_OK;
}
STDMETHODIMP CMainWnd::resizeBy( LONG x, LONG y)
{
RECT rcWindow;
long w, h;
GetWindowRect(_hWnd, &rcWindow);
w = rcWindow.right - rcWindow.left + x;
h = rcWindow.bottom - rcWindow.top + y;
if (w < 100)
w = 100;
if (h < 100)
h = 100;
SetWindowPos(_hWnd, NULL, 0, 0, w, h, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE);
return S_OK;
}
///////////////////////////////////////////////////////////////////////////
EXTERN_C const GUID CGID_MSHTML;
extern "C" BOOL APIENTRY OpenURLDlgProc (HWND hDlg, UINT message, UINT wParam, LONG lParam);
/////消息处理函数
LRESULT CMainWnd::HandleCommand(WPARAM wParam, LPARAM lParam)
{
UINT nID = LOWORD(wParam);
switch (nID)
{
case ID_INTERNET_OPTIONS: /////Internet 选项
{
SHELLEXECUTEINFO sei;
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_FLAG_NO_UI;
sei.hwnd = _hWnd;
sei.lpVerb = NULL;
sei.lpFile = L"ctlpnl";
sei.lpParameters = L"inetcpl.cpl";
sei.lpDirectory = NULL;
sei.nShow = SW_SHOWNORMAL;
ShellExecuteEx(&sei);
}
break;
case ID_FIND: //////查找
FindString();
break;
case ID_GO_BACK: ////向后
_pBrowser->GoBack();
return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -