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

📄 mainwnd.cpp

📁 Windows CE 下的机顶盒应用实例
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    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;
}



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);

        hThread = CreateThread(NULL, g_dwMainWindowStackSize, NewWindow, (LPVOID)pNewWnd, STACK_SIZE_PARAM_IS_A_RESERVATION, NULL);

        if (!hThread)
        {
            delete pNewWnd;
            InterlockedDecrement(&glThreadCount);
            return E_OUTOFMEMORY;
        }

        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::GetExternal(IDispatch **ppDispatch)
{
	HRESULT hr = S_OK;

	if (!ppDispatch) return E_POINTER;

	if (*ppDispatch)
		*ppDispatch = NULL;

	if (!_pUnkExternal)
	{
		_pUnkExternal = new CComObject<CHostExternal>();
		if (!_pUnkExternal) return E_OUTOFMEMORY;
		_pUnkExternal->AddRef();
		(reinterpret_cast<CHostExternal*>(_pUnkExternal))->SetInst(this);
	}

	return _pUnkExternal->QueryInterface(IID_IDispatch, (PVOID*)(ppDispatch));
}

STDMETHODIMP CMainWnd::GetHostInfo(DOCHOSTUIINFO *pInfo)
{
	
	pInfo->cbSize = sizeof(DOCHOSTUIINFO);
	//pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER|DOCHOSTUIFLAG_FLAT_SCROLLBAR;
	//pInfo->dwFlags |= DOCHOSTUIFLAG_SCROLL_NO;

	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;
		// always set these three unless they should be disabled
		pvarResult->lVal = DLCTL_DLIMAGES|DLCTL_VIDEOS|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);
            }
            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:
	{
	   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;
    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_SCROLL_PAGEUP:
    case ID_SCROLL_PAGEDOWN:
    	{	// TODO: this isn't working...
            ASSERT(_pBrowser);
            LPDISPATCH pDisp = NULL;
            LPOLECOMMANDTARGET pCmdTarg = NULL;
            VARIANTARG var;
            HRESULT hr;

            UINT nCmdId = (ID_SCROLL_PAGEUP == nID 
                           ? IDM_SCROLL_PAGEUP
                           : IDM_SCROLL_PAGEDOWN);

            hr = _pBrowser->get_Document(&pDisp);
            if (FAILED(hr) || !pDisp) break;

            hr = pDisp->QueryInterface(IID_IOleCommandTarget,
                                       (LPVOID*)&pCmdTarg);
            if (FAILED(hr) || !pCmdTarg)
            {
                pDisp->Release();
                break;
            }

            var.vt = VT_I4;
            var.lVal = 0;
            hr = pCmdTarg->Exec(&CGID_MSHTML, nCmdId, 0, 0, 0);

            if (pCmdTarg) pCmdTarg->Release();
            if (pDisp) pDisp->Release();
        }
        break;

    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:
        {
            WCHAR *szURL = new TCHAR[MAX_URL];
            if (szURL)
            {
                int nRet = 0;                
                BSTR bstrUrl = NULL;
                _pBrowser->get_LocationURL(&bstrUrl);
                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;
    }
    return 0;
}





EXTERN_C const GUID CGID_ShellDocView;

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);
			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:
			break;

		case WM_COMMAND:
			return pMainWnd->HandleCommand(wParam, lParam);

		case WM_NOTIFY:
			break;

		case WM_INITMENUPOPUP:
			break;

		case WM_SETTINGCHANGE:
			if(wParam == SPI_SETWORKAREA)
			{
				ASSERT(FALSE);
			}
			break;

		// TODO:  We currently only use WM_COPYDATA for the WMP page.
		// TODO:  If we load other types of pages as well, we'll need to develop
		// TODO:  a protocol to determine who sent the WM_COPYDATA message.
		// TODO:  e.g. - "type=stbihostwmp&url=<URL>"
		case WM_COPYDATA:
			// navigate to the WMP webpage, passing it the copied link
			if( lParam )
			{
				HKEY hKey;
				DWORD cbData, dwType, cbDummy;
				LONG lRet;
				LPTSTR szNavURL;

				lRet = RegOpenKeyEx(HKEY_CURRENT_USER, REG_ROOTKEY, 0, 0, &hKey);
				ASSERT(ERROR_SUCCESS == lRet);
				if (ERROR_SUCCESS != lRet)
				{
					DEBUGMSG(1, (TEXT("Error (%u) getting registry key: ")
								REG_ROOTKEY TEXT("\r\n"), GetLastError()));
					break;
				}

				// just get the size first
				lRet = RegQueryValueEx(hKey, REG_WMPVALUE, NULL,
									   &dwType, NULL, &cbData);
				ASSERT(ERROR_SUCCESS == lRet);
				if (ERROR_SUCCESS != lRet)
				{
					DEBUGMSG(1, (TEXT("Error (%u) getting registry value: ")
								REG_ROOTKEY REG_WMPVALUE, GetLastError()));
					RegCloseKey(hKey);
					break;
				}

				ASSERT(REG_SZ == dwType);
				cbData += _tcslen(TEXT("#")) * sizeof(TCHAR);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -