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