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

📄 mainwnd.cpp

📁 wince下internet explorer的浏览器的简单实现
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	GOERROR(bRetVal = AppendMenu (hMenu, MF_STRING, uID, szText));

	if (bSetInfo)
	{
		menuInfo.cbSize = sizeof (MENUITEMINFO);
		menuInfo.fMask  = MIIM_DATA;
		GOERROR(szStr = new WCHAR [wcslen (szInfo) + 1]);
		wcscpy(szStr, szInfo);
		menuInfo.dwItemData = reinterpret_cast<DWORD>(szStr);
		GOERROR(SetMenuItemInfo (hMenu, uID, FALSE, &menuInfo));
	}
	return bRetVal;

ERR_RET:

	if (szStr)
		delete[] szStr;

	return FALSE;
}

HMENU CMainWnd::SetMenuInfo (HMENU hMenu, UINT uID, UINT uPos)
{
	HMENU		 hSubMenu  = NULL;
	LPTSTR		 szTmpStr1 = new TCHAR[FAV_NAME_LEN];
	TCHAR	     szStr[MAX_REGKEY_LEN];
	TCHAR		 szTmpStr[17];
	MENUITEMINFO menuInfo;
		
	menuInfo.cbSize = sizeof (menuInfo);
	menuInfo.fMask  = MIIM_TYPE|MIIM_DATA;
	menuInfo.fType  = MFT_STRING;
	menuInfo.dwTypeData = szTmpStr1;
	menuInfo.cch = FAV_NAME_LEN-1;
	uID -= 1;
	INIT_STR (szStr);

	if (!(hSubMenu = CreatePopupMenu()))
		goto ERR_RET;

	GetMenuItemInfo (hMenu, uID, FALSE, &menuInfo);
	if (menuInfo.dwItemData)
		wcscpy (szStr, reinterpret_cast<LPWSTR>(menuInfo.dwTypeData));

	GOERROR(DeleteMenu (hMenu, uID, MF_BYCOMMAND));

	if (0 < _nNumFavorites)
		_nNumFavorites--;

	GOERROR(LoadString (_Module.m_hInst,
				 		IDS_EMPTY_MENU_ITEM,
						szTmpStr,
						sizeof (szTmpStr)/sizeof (szTmpStr[0])));

	AddMenuItem (hSubMenu, uID, szTmpStr, NULL);
	EnableMenuItem(hSubMenu, uID, MF_BYCOMMAND | MF_GRAYED);
	AppendMenu (hMenu, MF_POPUP|MF_STRING,(UINT)hSubMenu,menuInfo.dwTypeData);
	
	if (szStr[0])
	{
		menuInfo.cbSize = sizeof (menuInfo);
		menuInfo.fMask  = MIIM_DATA;
		if(szTmpStr1)
			delete szTmpStr1;
		GOERROR(szTmpStr1 = new TCHAR [wcslen (szStr) + 1]);
		wcscpy (szTmpStr1, szStr);
		menuInfo.dwItemData = reinterpret_cast<DWORD>(szTmpStr1);
		GOERROR(SetMenuItemInfo (hMenu, uPos, TRUE, &menuInfo));
	}

	return hSubMenu;

ERR_RET:
	if (hSubMenu)
		DestroyMenu (hSubMenu);

	if (szTmpStr1)
		delete szTmpStr1;

	return NULL;
}
#endif // ndef NO_FAVORITES

#ifndef NOSTATUSBAR
BOOL CMainWnd::CreateStatusBar()
{
    if (!(_hWndStatus = CreateStatusWindow(WS_CHILD|WS_VISIBLE, _T("Ready"), _hWnd, ID_STATUSBAR)))
        return FALSE;


    RECT rc;
    GetClientRect(_hWndStatus, &rc);
    int naParts[5];
   
    naParts[4] = rc.right;
    naParts[3] = MAX(0, rc.right - 100);
    naParts[2] = MAX(0, rc.right - 100 - 20);
    naParts[1] = MAX(0, rc.right - 100 - 20 - 20);
    naParts[0] = MAX(0, rc.right - 100 - 20 - 20 - PROGRESSPANEWIDTH);

    SendMessage(_hWndStatus, SB_SETPARTS, (WPARAM )5, (LPARAM)naParts);

    SendMessage(_hWndStatus, SB_GETRECT, 1, (LPARAM )&rc);
    InsetRect(&rc, 1,1);
    _hWndProgress = CreateWindowEx(0, PROGRESS_CLASS, _T(""), WS_CHILD|WS_VISIBLE|PBS_SMOOTH,
                                   rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
                                   _hWndStatus, NULL, g_hInstance, NULL);
    if (!_hWndProgress)
        return FALSE;
    SendMessage(_hWndProgress, PBM_SETRANGE, 0, MAKELPARAM(0, 100));

    return TRUE;
}

#define SBCMDID_MIXEDZONE  39
#define ZONE_UNKNOWN    -1

#ifdef ZONEDISPLAY
EXTERN_C const GUID CGID_Explorer;
VOID CMainWnd::UpdateZonePane()
{

	LONG lZone = ZONE_UNKNOWN;
    WCHAR szDisplayName[MAX_ZONE_PATH];
    VARIANTARG var = {0};
	BOOL fMixed = FALSE;
	
	IOleCommandTarget * pcmdt = NULL;
	if (SUCCEEDED(_pBrowser->QueryInterface(IID_IOleCommandTarget, (LPVOID*)&pcmdt))) 
	{
		if (SUCCEEDED(pcmdt->Exec( &CGID_Explorer, SBCMDID_MIXEDZONE, 0, NULL, &var)))
		{
		  if (var.vt == VT_UI4 && var.lVal >= 0)
			lZone = var.lVal;
		  else if (var.vt == VT_NULL)
			fMixed = TRUE;
		}
		pcmdt->Release();
	}
	
	if (!g_pSecMgr)
		CoCreateInstance(CLSID_InternetSecurityManager, NULL, CLSCTX_INPROC_SERVER, IID_IInternetSecurityManager, (void**)&g_pSecMgr);
	
	if (g_pSecMgr)
	{
		BSTR bstrUrl = NULL;
		DWORD nZone; 
        _pBrowser->get_LocationURL(&bstrUrl);
		if (SUCCEEDED(g_pSecMgr->MapUrlToZone((LPCWSTR)bstrUrl, &nZone, 0)) &&
			nZone > (DWORD)lZone)
		{
			lZone = nZone;
		}
		SysFreeString(bstrUrl);
	}

	 szDisplayName[0] = 0;
	 if (lZone == ZONE_UNKNOWN || !GetZoneName(lZone, szDisplayName, MAX_ZONE_PATH))
	 {
		 if (fMixed)
		   LoadStringW(g_hInstance, IDS_MIXEDZONE, szDisplayName, MAX_ZONE_PATH);
		 else
		   LoadStringW(g_hInstance, IDS_UNKNOWNZONE, szDisplayName, MAX_ZONE_PATH);
	 }
	 SendMessage(_hWndStatus, SB_SETTEXT, 4, (LPARAM)szDisplayName);
}
#endif  //ZONEDISPLAY
#endif	//NOSTATUSBAR


//得到Internet代理连接选项
void GetProxyOption()
{
	INTERNET_PER_CONN_OPTION_LIST	iOptionList;
	INTERNET_PER_CONN_OPTION		iOptions[3];
	ULONG							uSize = sizeof(iOptionList);

	iOptionList.dwSize			= uSize;
	iOptionList.pszConnection	= NULL;
	iOptionList.dwOptionCount	= 3;
	iOptionList.pOptions		= iOptions;

	// set proxy type direct or proxy server
	iOptions[0].dwOption	= INTERNET_PER_CONN_FLAGS;
	iOptions[1].dwOption	= INTERNET_PER_CONN_PROXY_SERVER;
	iOptions[2].dwOption	= INTERNET_PER_CONN_PROXY_BYPASS;
	
	if(InternetQueryOption(NULL,INTERNET_OPTION_PER_CONNECTION_OPTION ,(LPVOID)(&iOptionList),&uSize))
	{
		GlobalFree(iOptionList.pOptions[1].Value.pszValue);
		GlobalFree(iOptionList.pOptions[2].Value.pszValue);
	}
}

HWND CMainWnd::CreateBrowser()//创建浏览器控件
{
    HRESULT hr;
    IUnknown *pUnk = NULL;
    IOleObject *pObject = NULL;


    if (!_pBrowser)
    {
		GetProxyOption();

		//创建WebBrowser组件对象
        hr = CoCreateInstance(CLSID_WebBrowser, NULL,
                              CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
                              IID_IUnknown, (LPVOID *)(&pUnk));
        if (hr)
            return FALSE;

        hr = pUnk->QueryInterface(IID_IOleObject, (LPVOID *)(&pObject));
        if (hr)
            goto Cleanup;

        DWORD dwFlags;
        hr = pObject->GetMiscStatus(DVASPECT_CONTENT, &dwFlags);
        if (hr)
            goto Cleanup;

        if (dwFlags & OLEMISC_SETCLIENTSITEFIRST)//需要设置客户端站点
        {
            IOleClientSite *pClientSite;
            hr = QueryInterface(IID_IOleClientSite, (LPVOID *)(&pClientSite));
            if (hr)
                goto Cleanup;

            hr = pObject->SetClientSite(pClientSite);
            pClientSite->Release();
            if (hr)
                goto Cleanup;
        }

        hr = Activate(pObject);//激活IWebBrowser控件 ,这时控件的界面显示出来
        if (hr)
            goto Cleanup;

        hr = _pObject->QueryInterface(IID_IWebBrowser2, (void **)&_pBrowser);
        if (hr)
            goto Cleanup;

        // do we care if this fails to load BHOs??
        _LoadBrowserHelperObjects();
        
        // See if there might be a url in lpszUrl
        hr = pUnk->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID *)(&_pIPActiveObj));
        if (S_OK!=hr)
			_pIPActiveObj = NULL;

        hr = S_FALSE;

        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)
    {
        hr = _pBrowser->QueryInterface(IID_IOleWindow, (LPVOID *)(&pWnd));
        if (hr)
            return NULL;
    }

    if (pWnd)
    {
        hr = pWnd->GetWindow(&hwndBrowser);
        pWnd->Release();
    }
    return hwndBrowser;
}

HRESULT CMainWnd::Activate(IOleObject *pObject)//激活IWebBrowser控件
{
    _pObject = pObject;
    _pObject->AddRef();

    RECT rc;
    ::GetClientRect(_hWnd, &rc);

    HRESULT hr;
    hr    =    _pObject->DoVerb(   OLEIVERB_UIACTIVATE,    NULL,    this,    0,    _hWnd,    &rc);

    if (hr)
        goto Cleanup;

    Cleanup:
    return hr;
}

HRESULT CMainWnd::InitEvents()//初始化WebBrowser事件
{
    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;
}

#ifndef NO_FAVORITES
VOID CMainWnd::AddToFavorites()
{
	// punt if theres no space left
	if (_nNumFavorites >= MAX_FAVORITES)
	{
		CFavListFullDlg dlg;
		dlg.Startup();
		return;
	} // if

	TCHAR	szTitle[FAV_NAME_LEN] = {0};
	_tcsncpy(szTitle, _szTitle, FAV_NAME_LEN-1);

	CAddFavoritesDlg dlg;
	if (!dlg.Startup(this,
					szTitle,
					GetSubMenu(CommandBar_GetMenu(_hWndMenuBar, 0),FAVORITES_MENU_POSITION)))
		return;
	
	dlg.DoModal();
	if (dlg.IsRegistryChanged())
	{
		DeleteMenuItem (GetSubMenu(CommandBar_GetMenu(_hWndMenuBar, 0), FAVORITES_MENU_POSITION),
						FIRST_FAV_MENU_ITEM_POS);
	       _nNumFavorites = 0;
		_nLastFavoriteID = ID_FAVORITE_FIRST;
		PopulateFavoritesMenu();
	}
	
	// enable the organize favorites menu item if we have favorites
	if (_nNumFavorites > 0)
	{
	    HMENU hMenu = CommandBar_GetMenu(_hWndMenuBar, 0);
	    // EnableMenuItem(hMenu, ID_FAV_ORG, MF_BYCOMMAND | MF_ENABLED);
	} // if
} 

VOID CMainWnd::OrganizeFavorites()//管理收藏夹
{
	TCHAR	szTitle[FAV_NAME_LEN] = {0};
	COrgFavoritesDlg dlg (this);

	_tcsncpy(szTitle, _szTitle, FAV_NAME_LEN-1);
	dlg.DoModal();
	if (dlg.IsRegistryChanged())
	{
		DeleteMenuItem (GetSubMenu(CommandBar_GetMenu(_hWndMenuBar, 0), FAVORITES_MENU_POSITION),
						FIRST_FAV_MENU_ITEM_POS);
		_nNumFavorites = 0;
		_nLastFavoriteID = ID_FAVORITE_FIRST;
		PopulateFavoritesMenu();
	
	// disable the organize favorites menu item if we have no favorites
	    if (_nNumFavorites <= 0)
	    {
		HMENU hMenu = GetSubMenu(CommandBar_GetMenu(_hWndMenuBar, 0), FAVORITES_MENU_POSITION);
		
		AppendMenu (hMenu, MF_STRING, ID_FAV_PLACEHOLDER, _T("<Empty>"));
		EnableMenuItem(hMenu, ID_FAV_PLACEHOLDER, MF_BYCOMMAND | MF_GRAYED);
	    } // if
	}
} 

BOOL CMainWnd::GetUrlFromID(UINT nID, TCHAR* szUrl, UINT nMaxLen)
{
	MENUITEMINFO parentInfo = {0};
	MENUITEMINFO menuInfo = {0};
	TCHAR        szKey[MAX_REGKEY_LEN] = {0};
	TCHAR*		 pszValue				 = NULL;

	if ((nMaxLen <= 0) ||
		(!_pIFavStorage))
	{
		_hMenu = NULL;
		return FALSE;
	}

	if (_hMenu)
	{
		parentInfo.cbSize = sizeof(parentInfo);
		parentInfo.fMask = MIIM_DATA;
		GOERROR(GetMenuItemInfo(_hMenu, 0, TRUE, &parentInfo));
	}

	menuInfo.cbSize = sizeof(menuInfo);
	menuInfo.fMask = MIIM_TYPE;
	menuInfo.fType = MFT_STRING;
	GOERROR(menuInfo.dwTypeData = new TCHAR[nMaxLen]);
	menuInfo.cch = nMaxLen;
	if (_hMenu)
	{
		GOERROR(GetMenuItemInfo(_hMenu, nID, FALSE, &menuInfo));
		wsprintf (szKey, L"%s\\%s",reinterpret_cast<LPWSTR>(parentInfo.dwItemData),menuInfo.dwTypeData);
	}
	else
	{
		GOERROR(GetMenuItemInfo(GetSubMenu(CommandBar_GetMenu(_hWndMenuBar, 0), FAVORITES_MENU_POSITION),
								nID,
								FALSE,
								&menuInfo));
		wsprintf (szKey, L"%s\\%s",REG_KEY_BROWSER_FAVORITES,menuInfo.dwTypeData);
	}

	if (menuInfo.dwTypeData)
	{
		delete(menuInfo.dwTypeData);
		menuInfo.dwTypeData = NULL;
	}
	_hMenu = NULL;

⌨️ 快捷键说明

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