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

📄 addressbar.h

📁 一个使用wtl写的完整的多窗口浏览器
💻 H
📖 第 1 页 / 共 3 页
字号:
};

//////////////////////
// for Donut
#define ABR_EX_OPENNEWWIN	0x00010000L
#define ABR_EX_NOACTIVATE	0x00020000L

class CDonutAddressBar :
	public CAddressBarCtrlImpl<CDonutAddressBar>,
	public CCustomDraw<CDonutAddressBar>
{
public:
	DECLARE_WND_SUPERCLASS(_T("Donut_AddressBar"), GetWndClassName())

// Constants
	enum { s_kcxHeaderGap = 4 };

// Data members
	int m_cxDefaultHeader;
	CItemIDList m_idlHtml;	// used to draw .url icon faster


//	CContainedWindow m_wndReBar;

	CDonutAddressBar() : m_cxDefaultHeader(0)
	{
		m_idlHtml = MtlGetHtmlFileIDList();
	}

	~CDonutAddressBar()
	{
	}

// Methods
	void InitReBarBandInfo(CReBarCtrl rebar)
	{
		int nIndex = rebar.IdToIndex(GetDlgCtrlID());

		CVersional<REBARBANDINFO> rbBand;
		rbBand.fMask = RBBIM_HEADERSIZE;
		MTLVERIFY(rebar.GetBandInfo(nIndex, &rbBand));
		m_cxDefaultHeader = rbBand.cxHeader;

		// Calculate the header of the band
		int nWidth = MtlComputeWidthOfText(_T("A&ddress"), rebar.GetFont());
		rbBand.cxHeader = m_cxDefaultHeader + nWidth + s_kcxHeaderGap;

		MTLVERIFY(rebar.SetBandInfo(nIndex, &rbBand));	
	}

	// required for stupid OnCustomDraw including pT->SetMsgHandled
	void SetMsgHandled(BOOL bHandled)
	{
		CAddressBarCtrlImpl<CDonutAddressBar>::SetMsgHandled(bHandled);
	}

	BOOL IsMsgHandled() const
	{
		return CAddressBarCtrlImpl<CDonutAddressBar>::IsMsgHandled();
	}

/*	BEGIN_MSG_MAP(CDonutAddressBar)
		CHAIN_MSG_MAP(CAddressBarCtrlImpl<CDonutAddressBar>)
	ALT_MSG_MAP(1)
		CHAIN_MSG_MAP_ALT(CAddressBarCtrlImpl<CDonutAddressBar>, 1)
	ALT_MSG_MAP(2)
		CHAIN_MSG_MAP_ALT(CAddressBarCtrlImpl<CDonutAddressBar>, 2)
	END_MSG_MAP()
*/

// Custom draw overrides
	DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
	{
		return CDRF_NOTIFYITEMDRAW;	// we need per-item notifications
	}

	// OnItemPostPaint not called
	DWORD OnItemPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCustomDraw)
	{
		abrTRACE(_T("CDonutAddressBar::OnItemPrePaint : dwItemSpec(%d), uItemState(%d)\n"),
			lpNMCustomDraw->dwItemSpec, lpNMCustomDraw->uItemState);

		if (lpNMCustomDraw->dwItemSpec != GetDlgCtrlID())
			return CDRF_DODEFAULT;

		if (m_cxDefaultHeader == 0)// InitReBarBandInfo maybe not called, do nothing.
			return CDRF_DODEFAULT;

		CDCHandle dc = lpNMCustomDraw->hdc;
		RECT& rc = lpNMCustomDraw->rc;
		rc.left += m_cxDefaultHeader;

		_DrawHeader(dc, rc, _T("A&ddress"));

		return CDRF_DODEFAULT;	// continue with the default item painting
	}

// Methods
	void _DrawHeader(CDCHandle dc, CRect rc, const CString& strHeader)
	{
		abrTRACE(_T("CDonutAddressBar::_DrawHeader(%d, %d, %d, %d)\n"), rc.left, rc.top, rc.right, rc.bottom);

		CReBarCtrl rebar(GetParent());

		HFONT hOldFont = dc.SelectFont(rebar.GetFont());
		dc.DrawText(strHeader, -1, &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
		dc.SelectFont(hOldFont);
	}

// Overrides
	void OnItemSelected(const CString& str)
	{
		DWORD dwOpenFlags = 0;
		if (!_check_flag(ABR_EX_OPENNEWWIN, GetAddressBarExtendedStyle()))
			dwOpenFlags |= D_OPENFILE_NOCREATE;
		if (!_check_flag(ABR_EX_NOACTIVATE, GetAddressBarExtendedStyle()))
			dwOpenFlags |= D_OPENFILE_ACTIVATE;

		DonutToggleOpenFlag(dwOpenFlags);
		HWND hWndNew = DonutOpenFile(m_hWnd, str, dwOpenFlags);
	}

	void OnGetItem(const CString& str, COMBOBOXEXITEM& item)
	{
		item.mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE;// | CBEIF_OVERLAY;

		int nImage;// = 2;
/*		if (str.IsEmpty())
			nImage = -1;

		if (str.Find(_T(':')) == 1 || MtlIsProtocol(str, _T("file"))) {// maybe local directory
			if (str.ReverseFind('/') == str.GetLength() - 1 ||
				str.ReverseFind('\\') == str.GetLength() - 1)
			{
				nImage = 0;
			}
			else if (str.ReverseFind(_T('/')) > str.ReverseFind(_T('.')) ||
				str.ReverseFind(_T('\\')) > str.ReverseFind(_T('.')))
			{
				nImage = 0;
			}
		}
*/
		nImage = I_IMAGECALLBACK;
		item.iImage = nImage;
		item.iSelectedImage = nImage;
		item.iOverlay = nImage;
	}

	void OnGetDispInfo(COMBOBOXEXITEM& item)
	{
		abrTRACE(_T("OnGetDispInfo(%s)\n"), item.pszText);
		if (!_check_flag(CBEIF_IMAGE, item.mask) &&
			!_check_flag(CBEIF_SELECTEDIMAGE, item.mask))
			return;

		CString str;
		if (GetDroppedState()) {
			MtlGetLBTextFixed(GetComboCtrl(), item.iItem, str);
		}
		else {
			str = MtlGetWindowText(GetEditCtrl());
		}

		if (str.IsEmpty())
			return;

		CItemIDList idl = str;
		if (idl.IsNull()) {// invalid idl
			int iImage = MtlGetSystemIconIndex(m_idlHtml);
			item.iImage = iImage;
			item.iSelectedImage = iImage;
			return;
		}

		if (item.mask & CBEIF_IMAGE) {
			item.iImage = MtlGetNormalIconIndex(idl, m_idlHtml);
		}

		if (item.mask & CBEIF_SELECTEDIMAGE) {
			item.iSelectedImage = MtlGetSelectedIconIndex(idl, true, m_idlHtml);
		}

/*
		CItemIDlist idl = str;
		if (MtlGet

		if (str.IsEmpty())
			nImage = -1;

		if (str.Find(_T(':')) == 1 || MtlIsProtocol(str, _T("file"))) {// maybe local directory
			if (str.ReverseFind('/') == str.GetLength() - 1 ||
				str.ReverseFind('\\') == str.GetLength() - 1)
			{
				nImage = 0;
			}
			else if (str.ReverseFind(_T('/')) > str.ReverseFind(_T('.')) ||
				str.ReverseFind(_T('\\')) > str.ReverseFind(_T('.')))
			{
				nImage = 0;
			}
		}

//		item.mask = CBEIF_IMAGE | CBEIF_SELECTEDIMAGE;

		item.iImage = nImage;
		item.iSelectedImage = nImage;
	*/
	}

	void OnInit()
	{
//		MTLVERIFY(_LoadImages(IDB_LINKBAR, 16, 16, RGB(255, 0, 255)));
		_SetSystemImageList();

		COMBOBOXEXITEM item;
		item.mask = CBEIF_IMAGE | CBEIF_SELECTEDIMAGE;
		item.iItem = -1;// on edit control
		item.iImage = I_IMAGECALLBACK;
		item.iSelectedImage = I_IMAGECALLBACK;
		MTLVERIFY(SetItem(&item));

		RegisterDragDrop();
	}

	void OnTerm()
	{
		RevokeDragDrop();
	}

// Implementation

// IDropTargetImpl
	bool m_bDragAccept;


	DROPEFFECT OnDragEnter(IDataObject* pDataObject, DWORD dwKeyState, CPoint point)
	{
		if (m_bDragFromItself)
			return DROPEFFECT_NONE;

		_DrawDragEffect(false);

		m_bDragAccept = _MtlIsHlinkDataObject(pDataObject);
		return _MtlStandardDropEffect(dwKeyState);
	}

	DROPEFFECT OnDragOver(IDataObject* pDataObject, DWORD dwKeyState, CPoint point, DROPEFFECT dropOkEffect)
	{
		if (m_bDragFromItself || !m_bDragAccept)
			return DROPEFFECT_NONE;

		return _MtlStandardDropEffect(dwKeyState) | _MtlFollowDropEffect(dropOkEffect) | DROPEFFECT_COPY;
	}
	void OnDragLeave()
	{
		if (m_bDragFromItself)
			return;

		_DrawDragEffect(true);
	}

	void _DrawDragEffect(bool bRemove)
	{
		CClientDC dc(m_wndCombo.m_hWnd);

		CRect rect; m_wndCombo.GetClientRect(rect);

		if (bRemove)
			MtlDrawDragRectFixed(dc.m_hDC, &rect, CSize(0, 0), &rect, CSize(2, 2), NULL, NULL);
		else
			MtlDrawDragRectFixed(dc.m_hDC, &rect, CSize(2, 2), NULL, CSize(2, 2),	NULL, NULL);
	}

	DROPEFFECT OnDrop(IDataObject* pDataObject,	DROPEFFECT dropEffect,
		DROPEFFECT dropEffectList, CPoint point)
	{
		if (m_bDragFromItself)
			return DROPEFFECT_NONE;

		_DrawDragEffect(true);

		CSimpleArray<CString> arrFiles;
		if (MtlGetDropFileName(pDataObject, arrFiles)) {
			// one file
			if (arrFiles.GetSize() == 1) {
				OnItemSelected(arrFiles[0]);// allow to AddressBar style
				return DROPEFFECT_COPY;
			}

			// files
			for (int i = 0; i < arrFiles.GetSize(); ++i) {
				DonutOpenFile(m_hWnd, arrFiles[i]);
			}
			dropEffect = DROPEFFECT_COPY;
			return true;
		}

		CString strText;
		if ( MtlGetHGlobalText(pDataObject, strText) ||
			 MtlGetHGlobalText(pDataObject, strText, ::RegisterClipboardFormat(CFSTR_SHELLURL)) )
		{
			OnItemSelected(strText);
			return DROPEFFECT_COPY;
		}

		return DROPEFFECT_NONE;
	}

	HRESULT OnGetAddressBarCtrlDataObject(IDataObject** ppDataObject)
	{
		ATLASSERT(ppDataObject != NULL);

		HRESULT hr = CHlinkDataObject::_CreatorClass::CreateInstance(NULL, IID_IDataObject, (void**)ppDataObject);
		if (FAILED(hr)) {
			*ppDataObject = NULL;
			return E_NOTIMPL;
		}

#ifdef _ATL_DEBUG_INTERFACES
		ATLASSERT(FALSE && _T("_ATL_DEBUG_INTERFACES crashes the following\n"));
#endif
		CHlinkDataObject* pHlinkDataObject = NULL;// this is hack, no need to release
		hr = (*ppDataObject)->QueryInterface(IID_NULL, (void**)&pHlinkDataObject);
		if (SUCCEEDED(hr)) {
			HWND hWnd = DonutGetActiveWindow(GetTopLevelParent());
			if (hWnd == NULL)
				return E_NOTIMPL;

			ATLASSERT(::IsWindow(hWnd));
			CWebBrowser2 browser = DonutGetIWebBrowser2(hWnd);
			if (browser.IsBrowserNull())
				return E_NOTIMPL;

			CString strName = MtlGetWindowText(hWnd);
			CString strUrl = browser.GetLocationURL();
			if (strUrl.IsEmpty())
				return E_NOTIMPL;

			if (strUrl.Left(5) == _T("file:")) {// Donut, to be explorer or not
				strName.Empty();
				strUrl = strUrl.Right(strUrl.GetLength() - 8);
				strUrl.Replace(_T('/'), _T('\\'));
			}
			pHlinkDataObject->m_arrNameAndUrl.Add(std::make_pair(strName, strUrl));
		}

		return S_OK;
	}

	void _SetSystemImageList()
	{
		ATLASSERT(::IsWindow(m_hWnd));

		SHFILEINFO sfi;
		HIMAGELIST hImgs = (HIMAGELIST)::SHGetFileInfo(_T("C:\\"), 0, &sfi, sizeof(sfi),
			SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

		ATLASSERT(hImgs != NULL);
		SetImageList(hImgs);
	}
};

class CDonutAddressBarPropertyPage : public CPropertyPageImpl<CDonutAddressBarPropertyPage>,
	public CWinDataExchange<CDonutAddressBarPropertyPage>
{
public:
// Constants
	enum { IDD = IDD_PROPPAGE_ADDRESSBAR };

// Data members
	int m_nAutoComplete, m_nNewWin, m_nNoActivate, m_nLoadTypedUrls, m_nGoBtnVisible;
	CDonutAddressBar& m_AddressBar;

// DDX map
	BEGIN_DDX_MAP(CDonutAddressBarPropertyPage)
		DDX_CHECK(IDC_CHECK_ABR_AUTOCOMPLETE, m_nAutoComplete)
		DDX_CHECK(IDC_CHECK_ABR_NEWWIN, m_nNewWin)
		DDX_CHECK(IDC_CHECK_ADB_NOACTIVATE, m_nNoActivate)
		DDX_CHECK(IDC_CHECK_ABR_LOADTYPEDURLS, m_nLoadTypedUrls)
		DDX_CHECK(IDC_CHECK_ABR_GOBTNVISIBLE, m_nGoBtnVisible)
	END_DDX_MAP()

// Constructor
	CDonutAddressBarPropertyPage(CDonutAddressBar& adBar) : m_AddressBar(adBar)
	{
		_SetData();
	}

// Overrides
	BOOL OnSetActive()
	{
		SetModified(TRUE);
		return DoDataExchange(FALSE);
	}
	BOOL OnKillActive()
	{
		return DoDataExchange(TRUE);
	}
	BOOL OnApply()
	{
		if (DoDataExchange(TRUE)) {
			_GetData();
			return TRUE;
		}
		else 
			return FALSE;
	}

// Implementation
protected:
	void _GetData()
	{
		// update  flags
		DWORD dwFlags = 0;
		if (m_nAutoComplete == 1) {
			dwFlags |= ABR_EX_AUTOCOMPLETE;
		}
		if (m_nNewWin == 1) {
			dwFlags |= ABR_EX_OPENNEWWIN;
		}
		if (m_nNoActivate == 1) {
			dwFlags |= ABR_EX_NOACTIVATE;
		}
		if (m_nNewWin == 1) {
			dwFlags |= ABR_EX_OPENNEWWIN;
		}
		if (m_nLoadTypedUrls == 1) {
			dwFlags |= ABR_EX_LOADTYPEDURLS;
		}
		if (m_nGoBtnVisible == 1) {
			dwFlags |= ABR_EX_GOBTNVISIBLE;
		}

		m_AddressBar.SetAddressBarExtendedStyle(dwFlags);
	}

	void _SetData()
	{
		DWORD dwFlags = m_AddressBar.GetAddressBarExtendedStyle();

		m_nAutoComplete = _check_flag(ABR_EX_AUTOCOMPLETE, dwFlags) ? 1 : 0;
		m_nNewWin = _check_flag(ABR_EX_OPENNEWWIN, dwFlags) ? 1 : 0;
		m_nNoActivate = _check_flag(ABR_EX_NOACTIVATE, dwFlags) ? 1 : 0;
		m_nLoadTypedUrls = _check_flag(ABR_EX_LOADTYPEDURLS, dwFlags) ? 1 : 0;
		m_nGoBtnVisible = _check_flag(ABR_EX_GOBTNVISIBLE, dwFlags) ? 1 : 0;
	}
};

////////////////////////////////////////////////////////////////////////////
} // namespace MTL;

#ifndef _MTL_NO_AUTOMATIC_NAMESPACE
using namespace MTL;
#endif //!_MTL_NO_AUTOMATIC_NAMESPACE

⌨️ 快捷键说明

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