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

📄 mainwnd.cpp

📁 wince下internet explorer的浏览器的简单实现
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	GOERROR(pszValue = _pIFavStorage->GetURL(szKey));
	wcscpy(szUrl,pszValue);
	delete[] pszValue;
	return TRUE;

ERR_RET:

	if (menuInfo.dwTypeData)
		delete(menuInfo.dwTypeData);

	_hMenu = NULL;
	return FALSE;

} // GetUrlFromID

LPTSTR CMainWnd::GetRegistryKeyString(HKEY hKey, LPCTSTR lptValueName)
{
    DWORD	size;
	DWORD	type;
    PBYTE	pByte;

	pByte = NULL;
	if (RegQueryValueEx(hKey, lptValueName, NULL, &type, NULL, &size) == 
		ERROR_SUCCESS && (type == REG_SZ || type == REG_MULTI_SZ))
	{
		pByte = (PBYTE) LocalAlloc(LPTR, size);
		if (pByte)
		{
			if((RegQueryValueEx(hKey, lptValueName, NULL, NULL, pByte, &size) != ERROR_SUCCESS) || (pByte[0] == 0))
			{
				LocalFree(pByte);
				pByte = NULL;
			}
		}
	}
	return (LPTSTR) pByte;
}
#endif // ndef NO_FAVORITES



//创建一个线程,在线程中创建一个窗口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;
        }
	 
        WaitForSingleObject(pNewWnd->hEvent, INFINITE);
	CloseHandle(hThread); // the thread is on its own	

        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::Invoke (
                              DISPID dispidMember,
                              REFIID riid,
                              LCID lcid,
                              WORD wFlags,
                              DISPPARAMS FAR* pdparams,
                              VARIANT FAR* pvarResult,
                              EXCEPINFO FAR* pexcepinfo,
                              UINT FAR* puArgErr
                              )
{
    switch (dispidMember)
    {
#if 0
    case DISPID_FILEDOWNLOAD:
	{
		RETAILMSG(1,(L"FILEDOWNLOAD\r\n"));
	}
	break;
#endif
#ifndef NOSTATUSBAR
    case DISPID_STATUSTEXTCHANGE:
        {
            if (pdparams && pdparams->rgvarg[0].vt == VT_BSTR)
            {
                // NULL terminate the string
                TCHAR   szStatusText[128];

                wcsncpy(szStatusText, pdparams->rgvarg[0].bstrVal, 128);
                szStatusText[128 - 1] = 0;
                SendMessage(_hWndStatus, SB_SETTEXT, 0, (LPARAM)szStatusText);
            }
            break;
        }

    case DISPID_SETSECURELOCKICON:
        if(pdparams && pdparams->rgvarg[0].vt == VT_I4)
        {
                TCHAR szFakeIcon[4];
                if(pdparams->rgvarg[0].lVal != 0)
                {
                    wcscpy(szFakeIcon, L"S");
                }
                else
                {
                    wcscpy(szFakeIcon, L" ");
                }
                SendMessage(_hWndStatus, SB_SETTEXT, 2, (LPARAM)szFakeIcon);
        }
        break;

    case DISPID_PROGRESSCHANGE:
        {
            LONG lProgMax = pdparams->rgvarg[0].lVal;
            LONG lProg = pdparams->rgvarg[1].lVal;
            UINT nPercent = (lProg == -1) ? 0 : (lProgMax) ? lProg*100/lProgMax : 0;
            SendMessage(_hWndProgress, PBM_SETPOS, nPercent, 0);
        }
        break;
#endif	//NOSTATUSBAR
    
#if 0
    // notification for file download
    case DISPID_FILEDOWNLOAD:
	break;
#endif

    case DISPID_NAVIGATECOMPLETE2:
#ifndef NOSTATUSBAR
#ifdef ZONEDISPLAY
		UpdateZonePane();
#endif //ZONEDISPLAY
#endif //NOSTATUSBAR
#ifndef NOCOMMANDBAR
        if (_bTyped)
        {
            UpdateUrlList(pdparams->rgvarg[0].pvarVal->bstrVal);
            _bTyped = FALSE;
        }
        else
        {
            BSTR bstrUrl = NULL;
            _pBrowser->get_LocationURL(&bstrUrl);
#if 0            
            UpdateUrlList((LPCTSTR)bstrUrl);
#endif            
            SendMessage(_hWndAddressCombo, WM_SETTEXT, 0, (LPARAM)bstrUrl);
            SysFreeString(bstrUrl);        
        }
#endif
        break;

#ifndef NOCOMMANDBAR
    case DISPID_COMMANDSTATECHANGE:
    {
        DWORD dwState;
        DWORD dwId = -1;
        
        switch ((LONG)pdparams->rgvarg[1].lVal) {
        case CSC_NAVIGATEFORWARD :
            dwId = ID_GO_FORWARD;
            break;
        case CSC_NAVIGATEBACK :
            dwId = ID_GO_BACK;
            break;
        }

        if (dwId != -1) {
            dwState = SendMessage (_hWndToolBar, TB_GETSTATE, dwId, 0);
            if ((BOOL)pdparams->rgvarg[0].boolVal) {
                dwState |= TBSTATE_ENABLED;
            } else {
                dwState &= ~(TBSTATE_ENABLED);
            }
            SendMessage (_hWndToolBar, TB_SETSTATE, dwId, dwState);
        }
        break;
    }
#endif	//NOCOMMANDBAR

    case DISPID_TITLECHANGE:
        {
            if (pdparams && pdparams->rgvarg[0].vt == VT_BSTR)
            {
            
                TCHAR *szTitle = new TCHAR[MAXLEN*2];
                if(!szTitle)
                    break;
                    
                _tcsncpy(_szTitle, pdparams->rgvarg[0].bstrVal, MAXLEN);
                _tcsncpy(szTitle, pdparams->rgvarg[0].bstrVal, MAXLEN);
                _tcscat(szTitle, LOADSTRING(IDS_HYPHEN));
                _tcscat(szTitle, LOADSTRING(IDS_IE));

                SetWindowText(_hWnd, szTitle);
                delete[] szTitle;
            }
            break;
        }

    case DISPID_ONQUIT:
        PostMessage(_hWnd, WM_CLOSE, 0, 0L);
        break;

#ifndef NOCOMMANDBAR
    case DISPID_DOWNLOADBEGIN:
        _pthrdAnimation->StartAnimation();
        break;
    case DISPID_DOWNLOADCOMPLETE:
    case DISPID_DOCUMENTCOMPLETE:
        _pthrdAnimation->StopAnimation();
        SendMessage(_hWndProgress, PBM_SETPOS, 0, 0);
		
		// Make sure that the current fontsize is checked.
		ChangeFontSize(0);
        break;
#endif	//NOCOMMANDBAR

    case DISPID_NEWWINDOW2:
        return HandleNewWindow2(NULL, pdparams);
        break;

    case DISPID_PROPERTYCHANGE:
    case DISPID_BEFORENAVIGATE2:
        break;
    default:
        return DISP_E_MEMBERNOTFOUND;
    }
    return S_OK;
}

#ifndef NOCOMMANDBAR
EXTERN_C const GUID CGID_MSHTML;
LRESULT CMainWnd::HandleCommand(WPARAM wParam, LPARAM lParam)
{
    UINT nID = LOWORD(wParam);
    switch (nID)
    {
    case ID_ADDRESSBAR:
        if (HIWORD(wParam) == CBN_SELENDOK)
        {
            SelChange();
            return 0;
        }
        break;
#ifndef NOFIND
    case ID_FILE_FIND:
        {
            FindString();
            return 0;
        }
#endif	//NOFIND

#ifndef NOPRINT
    case ID_FILE_PRINT:
        {
			_pBrowser->ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);	
            return 0;
        }
    case ID_FILE_PAGESETUP:
        {
                    HandlePageSetup(_hWnd);
                    return 0;
        }
#endif	//NOPRINT

#ifndef NOOFFLINE
	case ID_FILE_OFFLINE:
		{
			INTERNET_CONNECTED_INFO ci;
            DWORD dwBufferLength;

			memset(&ci, 0, sizeof(ci));
            dwBufferLength = sizeof(ci);
			InternetQueryOption(NULL, INTERNET_OPTION_CONNECTED_STATE, &ci, &dwBufferLength);
            ci.dwConnectedState = (ci.dwConnectedState & INTERNET_STATE_DISCONNECTED_BY_USER) ? INTERNET_STATE_CONNECTED : INTERNET_STATE_DISCONNECTED_BY_USER;
			InternetSetOption(NULL, INTERNET_OPTION_CONNECTED_STATE, &ci, sizeof(ci));
			return 0;
		}
#endif //NOOFLINE

    case ID_FILE_OPEN:
          {
			_pBrowser->ExecWB(OLECMDID_OPEN, OLECMDEXECOPT_DODEFAULT, NULL, NULL);	
                    return 0;
          }
          break;

    case ID_FILE_SAVEAS:
          {
                     VARIANT vTitle;
                     BSTR bstrTitle = SysAllocString(_szTitle);
                    if(bstrTitle)
                    {
                        WCHAR *pch = bstrTitle;
                        // Strip dots. Perhaps find a more locale friendly way of doing this?
                        while(*pch)
                        {
                                if(*pch == L'.')  
                                       *pch = L'_';
                                pch++;
                         }
                         vTitle.vt = VT_BSTR;
                         vTitle.bstrVal = bstrTitle;
    			    _pBrowser->ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_DODEFAULT, &vTitle, NULL);	
    			    SysFreeString(bstrTitle);
    		      }
                    return 0;
          }

	case ID_FILE_CLOSE:
		_pBrowser->ExecWB(OLECMDID_CLOSE, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
		// PostMessage(_hWndBrowser, WM_CLOSE, 0, 0L);
		return 0;

    case ID_EDIT_CUT:
		if (GetFocus()== _hWndAddressEdit)
			SendMessage(_hWndAddressEdit, WM_CUT, WPARAM(0), LPARAM(0));
		else
			_pBrowser->ExecWB(OLECMDID_CUT, OLECMDEXECOPT_DONTPROMPTUSER,
                          NULL, NULL);
        return 0;

    case ID_EDIT_COPY:
		if (GetFocus()== _hWndAddressEdit)
			SendMessage(_hWndAddressEdit, WM_COPY, WPARAM(0), LPARAM(0));
		else
    	    _pBrowser->ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DONTPROMPTUSER,
                          NULL, NULL);
        return 0;
    case ID_EDIT_PASTE:
		if (GetFocus() == _hWndAddressEdit)
			SendMessage(_hWndAddressEdit, WM_PASTE, WPARAM(0), LPARAM(0));
		else
	        _pBrowser->ExecWB(OLECMDID_PASTE, OLECMDEXECOPT_DONTPROMPTUSER,
                          NULL, NULL);
        return 0;



    case ID_VIEW_FONTSLARGEST:
    case ID_VIEW_FONTSLARGER:
    case ID_VIEW_FONTSMEDIUM:
    case ID_VIEW_FONTSSMALLER:
    case ID_VIEW_FONTSSMALLEST:
        ChangeFontSize(LOWORD(wParam));
        return 0;

#ifndef NO_FAVORITES
	case ID_FAV_ADD:
		AddToFavorites();
		return 0;

	case ID_FAV_ORG:
		OrganizeFavorites();
		return 0;
#endif

#ifndef NOOPTIONS
    case ID_VIEW_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);

    }
     //  DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_OPTIONS), _hWnd, (DLGPROC)OptionsDlgProc);
        return 0;
#endif	//NOOPTIONS

    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_FOCUS_URL:
        if (_hWndAddressEdit)
        {
            SetFocus(_hWndAddressEdit);
        }
        return 0;
    default:

#ifndef NO_FAVORITES
    		// handle favorite menu items
	if (nID >= ID_FAVORITE_FIRST && nID <= ID_FAVORITE_LAST)
	{
			TCHAR szUrl[MAX_URL] = {0};

			if (GetUrlFromID(nID, szUrl, MAX_URL))
				_pBrowser->Navigate(szUrl, NULL, NULL, NULL, NULL); 

	  } 
#endif

        // if this is from the encoding popup
        if (IDM_MIMECSET__FIRST__ <= nID && IDM_MIMECSET__LAST__ >= nID)

⌨️ 快捷键说明

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