www.pudn.com > mfcie23.rar > MainFrm.cpp


// This is part of the Microsoft Foundation Classes C++ library. 
// Copyright (C) 1992-1998 Microsoft Corporation 
// All rights reserved. 
// 
// This source code is only intended as a supplement to the 
// Microsoft Foundation Classes Reference and related 
// electronic documentation provided with the library. 
// See these sources for detailed information regarding the 
// Microsoft Foundation Classes product. 
// 
// MainFrm.cpp : implementation of the CMainFrame class 
// 
 
#include "stdafx.h" 
#include "mfcie.h" 
#include  
 
#include "MainFrm.h" 
#include "mfcieDoc.h" 
#include "mfcieVw.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame 
 
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) 
 
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 
	//{{AFX_MSG_MAP(CMainFrame) 
	ON_WM_CREATE() 
	//}}AFX_MSG_MAP 
	ON_CBN_SELENDOK(AFX_IDW_TOOLBAR + 1,OnNewAddress) 
	ON_COMMAND_RANGE(0xe00, 0xfff, OnFavorite) 
	ON_COMMAND(IDOK, OnNewAddressEnter) 
	ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDown) 
	ON_COMMAND(ID_FAVORITES_DROPDOWN, DoNothing) 
	ON_COMMAND(ID_FONT_DROPDOWN, DoNothing) 
END_MESSAGE_MAP() 
 
static UINT indicators[] = 
{ 
	ID_SEPARATOR,           // status line indicator 
	ID_INDICATOR_CAPS, 
	ID_INDICATOR_NUM, 
	ID_INDICATOR_SCRL, 
}; 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame construction/destruction 
 
CMainFrame::CMainFrame() 
{ 
} 
 
CMainFrame::~CMainFrame() 
{ 
} 
 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	CImageList img; 
	CString str; 
 
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1) 
		return -1; 
 
	if (!m_wndReBar.Create(this)) 
	{ 
		TRACE0("Failed to create rebar\n"); 
		return -1;      // fail to create 
	} 
 
	if (!m_wndToolBar.CreateEx(this)) 
	{ 
		TRACE0("Failed to create toolbar\n"); 
		return -1;      // fail to create 
	} 
	// set up toolbar properties 
	m_wndToolBar.GetToolBarCtrl().SetButtonWidth(50, 150); 
	m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS); 
 
	img.Create(IDB_HOTTOOLBAR, 22, 0, RGB(255, 0, 255)); 
	m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img); 
	img.Detach(); 
	img.Create(IDB_COLDTOOLBAR, 22, 0, RGB(255, 0, 255)); 
	m_wndToolBar.GetToolBarCtrl().SetImageList(&img); 
	img.Detach(); 
	m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT); 
	m_wndToolBar.SetButtons(NULL, 9); 
 
	// set up each toolbar button 
	m_wndToolBar.SetButtonInfo(0, ID_GO_BACK, TBSTYLE_BUTTON, 0); 
	str.LoadString(IDS_BACK); 
	m_wndToolBar.SetButtonText(0, str); 
	m_wndToolBar.SetButtonInfo(1, ID_GO_FORWARD, TBSTYLE_BUTTON, 1); 
	str.LoadString(IDS_FORWARD); 
	m_wndToolBar.SetButtonText(1, str); 
	m_wndToolBar.SetButtonInfo(2, ID_VIEW_STOP, TBSTYLE_BUTTON, 2); 
	str.LoadString(IDS_STOP); 
	m_wndToolBar.SetButtonText(2, str); 
	m_wndToolBar.SetButtonInfo(3, ID_VIEW_REFRESH, TBSTYLE_BUTTON, 3); 
	str.LoadString(IDS_REFRESH); 
	m_wndToolBar.SetButtonText(3, str); 
	m_wndToolBar.SetButtonInfo(4, ID_GO_START_PAGE, TBSTYLE_BUTTON, 4); 
	str.LoadString(IDS_HOME); 
	m_wndToolBar.SetButtonText(4, str); 
	m_wndToolBar.SetButtonInfo(5, ID_GO_SEARCH_THE_WEB, TBSTYLE_BUTTON, 5); 
	str.LoadString(IDS_SEARCH); 
	m_wndToolBar.SetButtonText(5, str); 
	m_wndToolBar.SetButtonInfo(6, ID_FAVORITES_DROPDOWN, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 6); 
	str.LoadString(IDS_FAVORITES); 
	m_wndToolBar.SetButtonText(6, str); 
	m_wndToolBar.SetButtonInfo(7, ID_FILE_PRINT, TBSTYLE_BUTTON, 7); 
	str.LoadString(IDS_PRINT); 
	m_wndToolBar.SetButtonText(7, str); 
	m_wndToolBar.SetButtonInfo(8, ID_FONT_DROPDOWN, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 8); 
	str.LoadString(IDS_FONT); 
	m_wndToolBar.SetButtonText(8, str); 
 
	CRect rectToolBar; 
 
	// set up toolbar button sizes 
	m_wndToolBar.GetItemRect(0, &rectToolBar); 
	m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(30,20)); 
 
	// create a combo box for the address bar 
	if (!m_wndAddress.Create(CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, AFX_IDW_TOOLBAR + 1)) 
	{ 
		TRACE0("Failed to create combobox\n"); 
		return -1;      // fail to create 
	} 
 
	// create the animation control 
	m_wndAnimate.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 10, 10), this, AFX_IDW_TOOLBAR + 2); 
	m_wndAnimate.Open(IDR_MFCAVI); 
 
	// add the toolbar, animation, and address bar to the rebar 
	m_wndReBar.AddBar(&m_wndToolBar); 
	m_wndReBar.AddBar(&m_wndAnimate, NULL, NULL, RBBS_FIXEDSIZE | RBBS_FIXEDBMP); 
	str.LoadString(IDS_ADDRESS); 
	m_wndReBar.AddBar(&m_wndAddress, str, NULL, RBBS_FIXEDBMP | RBBS_BREAK); 
 
	// set up min/max sizes and ideal sizes for pieces of the rebar 
	REBARBANDINFO rbbi; 
 
	rbbi.cbSize = sizeof(rbbi); 
	rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_SIZE; 
	rbbi.cxMinChild = rectToolBar.Width(); 
	rbbi.cyMinChild = rectToolBar.Height(); 
	rbbi.cx = rbbi.cxIdeal = rectToolBar.Width() * 9; 
	m_wndReBar.GetReBarCtrl().SetBandInfo(0, &rbbi); 
	rbbi.cxMinChild = 0; 
 
	CRect rectAddress; 
 
	rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE; 
	m_wndAddress.GetEditCtrl()->GetWindowRect(&rectAddress); 
	rbbi.cyMinChild = rectAddress.Height() + 10; 
	rbbi.cxIdeal = 200; 
	m_wndReBar.GetReBarCtrl().SetBandInfo(2, &rbbi); 
 
	m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | 
		CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED); 
 
	if (!m_wndStatusBar.Create(this) || 
		!m_wndStatusBar.SetIndicators(indicators, 
		  sizeof(indicators)/sizeof(UINT))) 
	{ 
		TRACE0("Failed to create status bar\n"); 
		return -1;      // fail to create 
	} 
 
// set up Favorites menu 
	TCHAR           sz[MAX_PATH]; 
	TCHAR           szPath[MAX_PATH]; 
	HKEY            hKey; 
	DWORD           dwSize; 
	CMenu*          pMenu; 
 
	// first get rid of bogus submenu items. 
	pMenu = GetMenu()->GetSubMenu(3); 
	while(pMenu->DeleteMenu(0, MF_BYPOSITION)); 
 
	// find out from the registry where the favorites are located. 
	if(RegOpenKey(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders"), &hKey) != ERROR_SUCCESS) 
	{ 
		TRACE0("Favorites folder not found\n"); 
		return 0; 
	} 
	dwSize = sizeof(sz); 
	RegQueryValueEx(hKey, _T("Favorites"), NULL, NULL, (LPBYTE)sz, &dwSize); 
	ExpandEnvironmentStrings(sz, szPath, MAX_PATH); 
	RegCloseKey(hKey); 
 
	BuildFavoritesMenu(szPath, 0, pMenu); 
	return 0; 
} 
 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	cs.lpszClass = AfxRegisterWndClass(0); 
	return CFrameWnd::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame diagnostics 
 
#ifdef _DEBUG 
void CMainFrame::AssertValid() const 
{ 
	CFrameWnd::AssertValid(); 
} 
 
void CMainFrame::Dump(CDumpContext& dc) const 
{ 
	CFrameWnd::Dump(dc); 
} 
 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame message handlers 
 
int CMainFrame::BuildFavoritesMenu(LPCTSTR pszPath, int nStartPos, CMenu* pMenu) 
{ 
	CString         strPath(pszPath); 
	CString         strPath2; 
	CString         str; 
	WIN32_FIND_DATA wfd; 
	HANDLE          h; 
	int             nPos; 
	int             nEndPos; 
	int             nNewEndPos; 
	int             nLastDir; 
	TCHAR           buf[INTERNET_MAX_PATH_LENGTH]; 
	CStringArray    astrFavorites; 
	CStringArray    astrDirs; 
	CMenu*          pSubMenu; 
 
	// make sure there's a trailing backslash 
	if(strPath[strPath.GetLength() - 1] != _T('\\')) 
		strPath += _T('\\'); 
	strPath2 = strPath; 
	strPath += "*.*"; 
 
	// now scan the directory, first for .URL files and then for subdirectories 
	// that may also contain .URL files 
	h = FindFirstFile(strPath, &wfd); 
	if(h != INVALID_HANDLE_VALUE) 
	{ 
		nEndPos = nStartPos; 
		do 
		{ 
			if((wfd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))==0) 
			{ 
				str = wfd.cFileName; 
				if(str.Right(4) == _T(".url")) 
				{ 
					// an .URL file is formatted just like an .INI file, so we can 
					// use GetPrivateProfileString() to get the information we want 
					::GetPrivateProfileString(_T("InternetShortcut"), _T("URL"), 
											  _T(""), buf, INTERNET_MAX_PATH_LENGTH, 
											  strPath2 + str); 
					str = str.Left(str.GetLength() - 4); 
 
					// scan through the array and perform an insertion sort 
					// to make sure the menu ends up in alphabetic order 
					for(nPos = nStartPos ; nPos < nEndPos ; ++nPos) 
					{ 
						if(str.CompareNoCase(astrFavorites[nPos]) < 0) 
							break; 
					} 
					astrFavorites.InsertAt(nPos, str); 
					m_astrFavoriteURLs.InsertAt(nPos, buf); 
					++nEndPos; 
				} 
			} 
		} while(FindNextFile(h, &wfd)); 
		FindClose(h); 
		// Now add these items to the menu 
		for(nPos = nStartPos ; nPos < nEndPos ; ++nPos) 
		{ 
			pMenu->AppendMenu(MF_STRING | MF_ENABLED, 0xe00 + nPos, astrFavorites[nPos]); 
		} 
 
 
		// now that we've got all the .URL files, check the subdirectories for more 
		nLastDir = 0; 
		h = FindFirstFile(strPath, &wfd); 
		ASSERT(h != INVALID_HANDLE_VALUE); 
		do 
		{ 
			if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
			{ 
				// ignore the current and parent directory entries 
				if(lstrcmp(wfd.cFileName, _T(".")) == 0 || lstrcmp(wfd.cFileName, _T("..")) == 0) 
					continue; 
 
				for(nPos = 0 ; nPos < nLastDir ; ++nPos) 
				{ 
					if(astrDirs[nPos].CompareNoCase(wfd.cFileName) > 0) 
						break; 
				} 
				pSubMenu = new CMenu; 
				pSubMenu->CreatePopupMenu(); 
 
				// call this function recursively. 
				nNewEndPos = BuildFavoritesMenu(strPath2 + wfd.cFileName, nEndPos, pSubMenu); 
				if(nNewEndPos != nEndPos) 
				{ 
					// only intert a submenu if there are in fact .URL files in the subdirectory 
					nEndPos = nNewEndPos; 
					pMenu->InsertMenu(nPos, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT)pSubMenu->m_hMenu, wfd.cFileName); 
					pSubMenu->Detach(); 
					astrDirs.InsertAt(nPos, wfd.cFileName); 
					++nLastDir; 
				} 
				delete pSubMenu; 
			} 
		} while(FindNextFile(h, &wfd)); 
		FindClose(h); 
	} 
	return nEndPos; 
} 
 
void CMainFrame::OnFavorite(UINT nID) 
{ 
	((CMfcieView*)GetActiveView())->Navigate2(m_astrFavoriteURLs[nID-0xe00], 0, NULL); 
} 
 
void CMainFrame::SetAddress(LPCTSTR lpszUrl) 
{ 
	// This is called when the browser has completely loaded the new location, 
	// so make sure the text in the address bar is up to date and stop the 
	// animation. 
	m_wndAddress.SetWindowText(lpszUrl); 
	m_wndAnimate.Stop(); 
	m_wndAnimate.Seek(0); 
} 
 
void CMainFrame::StartAnimation() 
{ 
	// Start the animation.  This is called when the browser begins to 
	// navigate to a new location 
	m_wndAnimate.Play(0, -1, -1); 
} 
 
void CMainFrame::OnNewAddress() 
{ 
	// gets called when an item in the Address combo box is selected 
	// just navigate to the newly selected location. 
	CString str; 
 
	m_wndAddress.GetLBText(m_wndAddress.GetCurSel(), str); 
	((CMfcieView*)GetActiveView())->Navigate2(str, 0, NULL); 
} 
 
void CMainFrame::OnNewAddressEnter() 
{ 
	// gets called when an item is entered manually into the edit box portion 
	// of the Address combo box. 
	// navigate to the newly selected location and also add this address to the 
	// list of addresses in the combo box. 
	CString str; 
 
	m_wndAddress.GetEditCtrl()->GetWindowText(str); 
	((CMfcieView*)GetActiveView())->Navigate2(str, 0, NULL); 
 
	COMBOBOXEXITEM item; 
 
	item.mask = CBEIF_TEXT; 
	item.iItem = -1; 
	item.pszText = (LPTSTR)(LPCTSTR)str; 
	m_wndAddress.InsertItem(&item); 
} 
 
void CMainFrame::DoNothing() 
{ 
	// this is here only so that the toolbar buttons for the dropdown menus 
	// will have a callback, and thus will not be disabled. 
} 
 
void CMainFrame::OnDropDown(NMHDR* pNotifyStruct, LRESULT* pResult) 
{ 
	// this function handles the dropdown menus from the toolbar 
	NMTOOLBAR* pNMToolBar = (NMTOOLBAR*)pNotifyStruct; 
	CRect rect; 
 
	// translate the current toolbar item rectangle into screen coordinates 
	// so that we'll know where to pop up the menu 
	m_wndToolBar.GetToolBarCtrl().GetRect(pNMToolBar->iItem, &rect); 
	rect.top = rect.bottom; 
	::ClientToScreen(pNMToolBar->hdr.hwndFrom, &rect.TopLeft()); 
	if(pNMToolBar->iItem == ID_FONT_DROPDOWN) 
	{ 
		CMenu menu; 
		CMenu* pPopup; 
 
		// the font popup is stored in a resource 
		menu.LoadMenu(IDR_FONT_POPUP); 
		pPopup = menu.GetSubMenu(0); 
		pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rect.left, rect.top + 1, AfxGetMainWnd()); 
	} 
	else if(pNMToolBar->iItem == ID_FAVORITES_DROPDOWN) 
	{ 
		CMenu* pPopup; 
 
		// for the favorties popup, just steal the menu from the main window 
		pPopup = GetMenu()->GetSubMenu(3); 
		pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rect.left, rect.top + 1, AfxGetMainWnd()); 
	} 
	*pResult = TBDDRET_DEFAULT; 
}