📄 mainwnd.cpp
字号:
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 + -