⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainwnd.cpp

📁 wince下面IE工程原代码精简功能版,比较不错的工程,可以直接修改成实际的应用
💻 CPP
📖 第 1 页 / 共 3 页
字号:

        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 + -