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

📄 mainwnd.cpp

📁 wince下internet explorer的浏览器的简单实现
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        {
		    if (_pBrowser)
            {
                IOleCommandTarget* pcmdt;
	            if (SUCCEEDED(_pBrowser->QueryInterface(IID_IOleCommandTarget, (LPVOID*) &pcmdt)))
	            {
                    pcmdt->Exec(&CGID_MSHTML, nID, 0, NULL, NULL);
	                pcmdt->Release();
                }
            }
        }
        return 0;
    }
    return TRUE;
}

VOID CMainWnd::ChangeFontSize(WORD wSize)
{
    VARIANT vaSize;
    vaSize.vt = VT_I4;
	if (0 == wSize) {
		// Setting initial value
		vaSize.vt = 0;
		HRESULT hr = _pBrowser->ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
									   NULL, &vaSize);
		wSize = ID_VIEW_FONTSSMALLEST + (WORD)vaSize.lVal;
	} else {
		vaSize.lVal = wSize - ID_VIEW_FONTSSMALLEST;
		HRESULT hr = _pBrowser->ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,
									   &vaSize, NULL);
	}
    HMENU hMenu = CommandBar_GetMenu(_hWndMenuBar, 0);
    BOOL bRet = CheckMenuRadioItem(hMenu, ID_VIEW_FONTSSMALLEST ,ID_VIEW_FONTSLARGEST, wSize, MF_BYCOMMAND);
    CommandBar_DrawMenuBar(_hWndMenuBar, 0);
}
#endif	//NOCOMMANDBAR




#ifndef NOCOMMANDBAR
LRESULT CALLBACK CMainWnd::AddressEditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{


    CMainWnd *pMainWnd = (CMainWnd*)GetWindowLong(hwnd, GWL_USERDATA);

    if (!pMainWnd)
    {
        return 0;
    }

    if ((message == WM_CHAR) && (wParam == VK_RETURN))
    {
        int iSpaces = 0;
        TCHAR *szString = new TCHAR[MAXLEN];
        if(!szString)
            goto Leave;
            
	 
        GetWindowText(hwnd, szString, MAXLEN);
        // Remove preceding spaces.
        for (iSpaces=0; szString[iSpaces] == _T(' '); iSpaces++);
        pMainWnd->_pBrowser->Navigate(&szString[iSpaces], NULL, NULL, NULL, NULL);
        pMainWnd->_bTyped = TRUE;
        delete[] szString;
Leave:        
        return 0;
    }
    else
        return CallWindowProc(pMainWnd->_lpfnAddressEditProc, hwnd, message, wParam, lParam);
}
#endif	//NOCOMMANDBAR

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

	case WM_ACTIVATE:
		if (pMainWnd->_pIPActiveObj)
		{
			pMainWnd->_pIPActiveObj->OnFrameWindowActivate(LOWORD(wParam) != WA_INACTIVE);
		}
		return 0;

#ifndef NOCOMMANDBAR
        case WM_COMMAND:
            return pMainWnd->HandleCommand(wParam, lParam);
            break;
#endif  //NOCOMMANDBAR

        case WM_NOTIFY:
            if(wParam== ID_COMMANDBAND) {		
				NMREBAR * pnm = (NMREBAR*)lParam;
				switch(pnm->hdr.code) {
					case RBN_LAYOUTCHANGED:
						break;

					case RBN_HEIGHTCHANGE:
					{
					      RECT rcMain, rcBrowse, rcStatus;
					      
					      int iHeight = SendMessage(pnm->hdr.hwndFrom, RB_GETBARHEIGHT, 0, 0);

                                         if(pMainWnd->_hWndStatus)
                                         {
                                                GetClientRect(pMainWnd->_hWndStatus, &rcStatus);
                                         }
                                         else
                                         {
                                                rcStatus.top = rcStatus.bottom = 0;
                                         }
                                         GetClientRect(pMainWnd->_hWnd, &rcMain);
                                         GetClientRect(pMainWnd->_hWndBrowser, &rcBrowse);
                                         int iBrowseHeight = (rcMain.bottom - rcMain.top) - iHeight -(rcStatus.bottom - rcStatus.top);

                                         if(iBrowseHeight != (rcBrowse.bottom - rcBrowse.top))
                                         {
					            SetWindowPos(pMainWnd->_hWndBrowser,  
					                            NULL,
					                            0,
					                            iHeight,
					                            rcMain.right-rcMain.left, 
					                            iBrowseHeight, 
					                            SWP_NOZORDER);					
                                        }
					}
					break;
			}
	    }
	    break;

        case WM_INITMENUPOPUP:

            {
                // for WM_INITMENUPOPUP
                OLECMD rgcmd[] = {
                   { OLECMDID_CUT, 0 },
                   { OLECMDID_COPY, 0 },
                   { OLECMDID_PASTE, 0 }
                };

                // check/uncheck the offline state
                INTERNET_CONNECTED_INFO ci;
                DWORD dwBufferLength;

                memset(&ci, 0, sizeof(ci));
                dwBufferLength = sizeof(ci);
                InternetQueryOption(NULL, INTERNET_OPTION_CONNECTED_STATE, &ci, &dwBufferLength);
                CheckMenuItem((HMENU)wParam, ID_FILE_OFFLINE, MF_BYCOMMAND | (ci.dwConnectedState & INTERNET_STATE_DISCONNECTED_BY_USER) ? MF_CHECKED : MF_UNCHECKED);

                // enable / disable edit menu commands
                IOleCommandTarget* pcmdt;
                int i;

				if (GetFocus()==ghWndAddressEdit)
				{
					DWORD dwStart, dwEnd;
					
					SendMessage(ghWndAddressEdit, EM_GETSEL, (WPARAM)(&dwStart), (LPARAM)(&dwEnd));
					if (dwEnd - dwStart > 1)
					{
						EnableMenuItem((HMENU)wParam, ID_EDIT_CUT, MF_BYCOMMAND | MF_ENABLED);
						EnableMenuItem((HMENU)wParam, ID_EDIT_COPY, MF_BYCOMMAND | MF_ENABLED);
					}
					else
					{
						EnableMenuItem((HMENU)wParam, ID_EDIT_CUT, MF_BYCOMMAND | MF_GRAYED);
						EnableMenuItem((HMENU)wParam, ID_EDIT_COPY, MF_BYCOMMAND | MF_GRAYED);
					}					
					if (IsClipboardFormatAvailable(CF_UNICODETEXT) || IsClipboardFormatAvailable(CF_TEXT))
					{
						EnableMenuItem((HMENU)wParam, ID_EDIT_PASTE, MF_BYCOMMAND | MF_ENABLED);
					}					
					else
					{
						EnableMenuItem((HMENU)wParam, ID_EDIT_PASTE, MF_BYCOMMAND | MF_GRAYED);
					}					
				}
				else
				{
				   if (!pMainWnd->_pBrowser)
    	               break;

	               	if (SUCCEEDED(pMainWnd->_pBrowser->QueryInterface(IID_IOleCommandTarget, (LPVOID*) & pcmdt)))
	              	{
	                    pcmdt->QueryStatus(NULL, _countof(rgcmd), rgcmd, NULL);
	                    pcmdt->Release();
	   	            }
	                for (i=0; i<_countof(rgcmd); i++)
	                {
	                    EnableMenuItem((HMENU)wParam, ID_EDIT_CUT + i, rgcmd[i].cmdf & OLECMDF_ENABLED ?
	                        (MF_BYCOMMAND | MF_ENABLED) : ( MF_BYCOMMAND| MF_GRAYED));
	                }
				}
#ifndef NO_FAVORITES
                MENUITEMINFO mInfo;
                mInfo.cbSize = sizeof(mInfo);
                mInfo.fMask = MIIM_DATA;
                GetMenuItemInfo((HMENU)wParam, 0, TRUE, &mInfo);
		 pMainWnd->_hMenu = NULL;
		 if (mInfo.dwItemData != NULL)
		 {
			// Store this for tracking purpouse
			if (!_tcsncmp (reinterpret_cast<LPTSTR>(mInfo.dwItemData), 
						   REG_KEY_BROWSER_FAVORITES,
						   _tcslen (REG_KEY_BROWSER_FAVORITES)))
				pMainWnd->_hMenu = (HMENU)wParam;
		 }
#endif				
                // provide encoding menu
			    if (!pMainWnd->_pBrowser)
    	            break;

                // if this is not the view menu, bail out early
                MENUITEMINFO mii;
                

                mii.cbSize = sizeof(mii);
                mii.fMask = MIIM_ID;

                GetMenuItemInfo((HMENU)wParam, 3, TRUE, &mii);
                if (mii.wID != ID_VIEW_STOP)
                    break;

	            if (SUCCEEDED(pMainWnd->_pBrowser->QueryInterface(IID_IOleCommandTarget, (LPVOID*) & pcmdt)))
	            {
                    VARIANTARG v = {0};
                    HRESULT hr;

                    hr = pcmdt->Exec(&CGID_ShellDocView, 27/*SHDVID_GETMIMECSETMENU*/, 0, NULL, &v);
                    if (S_OK == hr)
                    {
                        
                        UINT uItem = 0;
                        HMENU hmenuFonts = (HMENU)v.lVal;
                        WCHAR szTitle[50];
                        
                        mii.fMask = MIIM_TYPE;
                        mii.fType = MFT_STRING;
                        mii.dwTypeData = szTitle;
                        mii.cch = 50;

                        GetMenuItemInfo((HMENU)wParam, 1, TRUE, &mii);

                        HMENU hmenuOldFonts = GetSubMenu((HMENU)wParam, 1);
                        RemoveMenu((HMENU)wParam, 1, MF_BYPOSITION);
                        DestroyMenu(hmenuOldFonts);
                        InsertMenu((HMENU)wParam, 1, MF_POPUP|MF_BYPOSITION, (UINT)hmenuFonts, szTitle);
                    }

	                pcmdt->Release();
                }

			}
            break;

        default:
            break;
        }
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

BOOL CMainWnd::PreTranslateMessage(LPMSG pMsg)
{
    if (TranslateAccelerator(_hWnd, _hAccelTbl, pMsg))  //first shot to the main frame
        return TRUE;

#ifndef NOCOMMANDBAR
    if (pMsg->hwnd == _hWndAddressEdit)
        return FALSE;
#endif	//NOCOMMANDBAR

    //then to mshtml
    if (_pIPActiveObj && pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
    {
        HRESULT hr = _pIPActiveObj->TranslateAccelerator(pMsg);
        return (hr != S_FALSE);
    }
    return FALSE;
}

#ifndef NOCOMMANDBAR
VOID CMainWnd::LoadTypedUrls()
{
    TCHAR pszValName[10];
    TCHAR *pszValData = NULL;
    DWORD dwType = 0;
    DWORD cbValName,cbData;
    DWORD dwIndex = 0;
    HKEY hKey = NULL;
    LONG lRes = 0;
    
    pszValData = new TCHAR[MAXLEN];
    if(!pszValData)
        goto Exit;

    lRes = RegOpenKeyEx(HKEY_CURRENT_USER, szTypedUrls, 0, 0, &hKey);
    if (hKey && lRes==ERROR_SUCCESS)
    {

        cbValName = 10;
        cbData = sizeof(TCHAR)*MAXLEN;
        
        while(ERROR_SUCCESS == RegEnumValue(hKey, dwIndex, pszValName, &cbValName, NULL, &dwType, (BYTE *)pszValData, &cbData))
        {
            dwIndex++;
            SendMessage(_hWndAddressCombo, CB_INSERTSTRING, 0, (LPARAM )pszValData);
            cbValName = 10;
            cbData = sizeof(TCHAR)*MAXLEN;
        }
        
    }
    delete [] pszValData;
    
Exit:
    return;
}

VOID CMainWnd::UpdateUrlList(LPCTSTR lpszUrl)
{

    int i = SendMessage(_hWndAddressCombo, CB_FINDSTRINGEXACT,
                        (WPARAM )-1, (LPARAM )lpszUrl);
    if (i == CB_ERR)
    {
        SendMessage(_hWndAddressCombo, CB_INSERTSTRING, 0, (LPARAM )lpszUrl);
        SendMessage(_hWndAddressCombo, CB_SETCURSEL,
                    (WPARAM)0, (LPARAM)0);
    }
    else
    {
        SendMessage(_hWndAddressCombo, CB_SETCURSEL,
                    (WPARAM)i, (LPARAM)0);
    }

    if ( (SendMessage(_hWndAddressCombo, CB_GETCOUNT, 0, 0L)) > MAXURLS)
    {
        SendMessage(_hWndAddressCombo, CB_DELETESTRING, MAXURLS-1, 0L);
    }
}

VOID CMainWnd::SelChange()
{
    TCHAR *szUrl;
    int nRet, nRet1 = SendMessage(_hWndAddressCombo, CB_GETCURSEL, 0, 0L);
    if (nRet1==CB_ERR)
        return ;
	nRet = SendMessage(_hWndAddressCombo, CB_GETLBTEXTLEN, nRet1, 0L); 
	if (nRet==CB_ERR)
		return;
	szUrl = new TCHAR[nRet+1];
	if (szUrl)  {
		SendMessage(_hWndAddressCombo, CB_GETLBTEXT, nRet1, (LPARAM )szUrl);
		_pBrowser->Navigate(szUrl, NULL, NULL, NULL, NULL);
		delete szUrl;
	}
}
#endif	//NOCOMMANDBAR

VOID CMainWnd::Close()
{
    RETAILMSG(1,(L"IESAMPLE CMainWnd::Close"));

    // Tell the shell to die off
    SendMessage(_hWndBrowser, WM_CLOSE, 0,0);
#ifndef NOCOMMANDBAR
    HKEY hKey = NULL;
    TCHAR *szString=NULL;	int cbString = 0;
    DWORD dwDisp;

    LONG lRes = RegCreateKeyEx(HKEY_CURRENT_USER, szTypedUrls, 0, NULL, 0, 0, 0, &hKey, &dwDisp);
    if (hKey && lRes==ERROR_SUCCESS)
    {
        int nCount = SendMessage(_hWndAddressCombo, CB_GETCOUNT, 0, 0L);
        int nLen;
        TCHAR szValueName[7];
        for (int i=0; i<nCount; i++)
        {
			nLen = SendMessage(_hWndAddressCombo, CB_GETLBTEXTLEN, i, 0L); 
			if (nLen==CB_ERR)  {
				delete szString;  cbString = 0;
				return;
			}
			if (nLen > cbString)  {
				delete szString;  cbString = 0;
				szString = new TCHAR[nLen+1];
				
				cbString = nLen;
			}
		// pulled out of the if above, prefix isn't sure if the string is always valid here
		// we'll catch it this way. 
	    if (!szString)
		break;
            nLen = SendMessage(_hWndAddressCombo, CB_GETLBTEXT, i, (LPARAM )szString);
            wsprintf(szValueName, _T("url%d"), i+1);
            lRes = RegSetValueEx(hKey, szValueName, 0, REG_SZ, (BYTE *)szString, (_tcslen(szString)+1)*sizeof(TCHAR));
        }
    }
	delete szString; cbString = 0;

    SetWindowLong(_hWndAddressEdit, GWL_WNDPROC, (LONG)_lpfnAddressEditProc);
#endif	//NOCOMMANDBAR

	if(_pIPActiveObj)
	{
		_pIPActiveObj->Release();
	}
    _pIPActiveObj = NULL;
	if(_pCP)
	{
		_pCP->Unadvise(_dwEventCookie);
		_pCP->Release();
	}
    _pCP = NULL;
	if(_pObject)
	{
		_pObject->Close(FALSE);
		_pObject->Release();
	}
    _pObject = NULL;
	if(_pBrowser)
	    _pBrowser->Release();
    _pBrowser = NULL;

     if(_himlCmdBand)
     {
                ImageList_Destroy(_himlCmdBand);
                _himlCmdBand = NULL;
      }
}

#ifdef OEMCONTROLS
LRESULT CALLBACK OemComboProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_PAINT:
        {
            PAIN

⌨️ 快捷键说明

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