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

📄 mditabctrl.h

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

		ATLTRACE2(atlTraceUser, 4, _T("CMDITabCtrl::SetDowloding\n"));
		_SetImageListIndex(nItem, 1);
	}

	void SetComplete(HWND hWnd)
	{
		int nItem = GetTabIndex(hWnd);
		if (nItem == -1)
			return;

		ATLTRACE2(atlTraceUser, 4, _T("CMDITabCtrl::SetComplete\n"));
		_SetImageListIndex(nItem, -1);
	}

	void _SetImageListIndex(int nItem, int nIndex)
	{
		SetItemImageIndex(nItem, nIndex);
	}

	bool IsConnecting(HWND hWnd)
	{
		int nItem = GetTabIndex(hWnd);
		if (nItem == -1)
			return false;

		return _GetImageListIndex(nItem) == 0;
	}

	bool IsDownloading(HWND hWnd)
	{
		int nItem = GetTabIndex(hWnd);
		if (nItem == -1)
			return false;

		return _GetImageListIndex(nItem) == 1;
	}

	bool IsCompleted(HWND hWnd)
	{
		int nItem = GetTabIndex(hWnd);
		if (nItem == -1)
			return false;

		return _GetImageListIndex(nItem) == -1;
	}

	int _GetImageListIndex(int nItem)
	{
		int nImgIndex = -1;
		GetItemImageIndex(nItem, nImgIndex);
		return nImgIndex;
	}

	int ManageClose(HWND m_hWnd)
	{
		int nIndex = GetCurSel();
		HWND hWndActive = GetTabHwnd(nIndex);
		ATLASSERT(hWndActive == m_hWnd);
	
		int nCount = GetItemCount();

		if (m_dwExtendedStyle & MTB_EX_RIGHTACTIVEONCLOSE) {
			int nNext = nIndex + 1;
			if (nNext < nCount) {
//				SetCurSelEx(nNext);
				return nNext;
			}
			else {
				nNext = nIndex - 1;
				if (nNext >= 0) {
//					SetCurSelEx(nNext);
					return nNext;
				}
			}
		}
		else if (m_dwExtendedStyle & MTB_EX_LEFTACTIVEONCLOSE) {
			int nNext = nIndex - 1;
			if (nNext >= 0) {
//				SetCurSelEx(nNext);
				return nNext;
			}
			else {
				nNext = nIndex + 1;
				if (nNext < nCount) {
//					SetCurSelEx(nNext);
					return nNext;
				}
			}
		}

		return -1;
	}

	void NavigateLockTab(HWND hWnd, bool bOn)
	{
		int nIndex = GetTabIndex(hWnd);
		ATLASSERT(nIndex != -1);

		if (bOn)
			SetItemDisabled(nIndex);
		else
			SetItemEnabled(nIndex);
	}

// Overrides
	CString OnGetToolTipText(int nIndex)
	{
		CString strTip;
		HWND hWnd = GetTabHwnd(nIndex);
		if (hWnd) {
			CWebBrowser2 browser = DonutGetIWebBrowser2(hWnd);
			if (!browser.IsBrowserNull()) {
				const int TIPBUF = 79;
				CString strName = MtlGetWindowText(hWnd);
				CString strUrl = browser.GetLocationURL();
				strTip = MtlMakeFavoriteToolTipText(strName, strUrl, TIPBUF);
			}
		}
		
		return strTip;
	}

	void OnDeleteItemDrag(int nIndex)
	{
		HWND hWnd;
		if (hWnd = GetTabHwnd(nIndex))
			::PostMessage((HWND)hWnd, WM_CLOSE, 0, 0); 
	}

	bool m_bDragAccept;

	DROPEFFECT OnDragEnter(IDataObject* pDataObject, DWORD dwKeyState, CPoint point)
	{
		m_bDragAccept = _MtlIsHlinkDataObject(pDataObject);
		return _MtlStandardDropEffect(dwKeyState);
	}
	DROPEFFECT OnDragOver(IDataObject* pDataObject, DWORD dwKeyState, CPoint point, DROPEFFECT dropOkEffect)
	{
		if (!m_bDragAccept)
			return DROPEFFECT_NONE;

		return COleDragDropTabCtrl<CMDITabCtrl>::OnDragOver(pDataObject, dwKeyState, point, dropOkEffect);
//		if (dropEffect != DROPEFFECT_NONE && !m_bDragFromItself) {// DROPEFFECT_LINK eats DROPEFFECT_COPY cursor, so check if from itself or not.
//			dropEffect |= DROPEFFECT_LINK;
//		}

//		return dropEffect;
	}

	bool OnNewTabCtrlItems(int nInsertIndex, CSimpleArray<CTabCtrlItem>& /*items*/, IDataObject* pDataObject, DROPEFFECT& dropEffect)
	{
		CSimpleArray<CString> arrUrls;
		if (MtlGetDropFileName(pDataObject, arrUrls)) {
			ATLTRACE(" HDROP found\n");
			m_bInsertHere = true;
			m_nInsertIndex = nInsertIndex;
			for (int i = 0; i < arrUrls.GetSize(); ++i) {
				HWND hWnd = DonutOpenFile(m_hWnd, arrUrls[i]);
				if (hWnd)
					++m_nInsertIndex;
			}
			m_nInsertIndex = -1;
			m_bInsertHere = false;	
			dropEffect = DROPEFFECT_COPY;
			return true;
		}

		CString strText;
		if ( MtlGetHGlobalText(pDataObject, strText) ||
			 MtlGetHGlobalText(pDataObject, strText, ::RegisterClipboardFormat(CFSTR_SHELLURL)) ) {
			m_bInsertHere = true;
			m_nInsertIndex = nInsertIndex;
			DonutOpenFile(m_hWnd, strText);
			m_nInsertIndex = -1;
			m_bInsertHere = false;
			dropEffect = DROPEFFECT_COPY;
			return true;
		}
		dropEffect = DROPEFFECT_NONE;
		return false;
	}
	
	bool OnDropTabCtrlItem(int nIndex, IDataObject* pDataObject, DROPEFFECT& dropEffect)
	{
		HWND hWnd = GetTabHwnd(nIndex);
		ATLASSERT(::IsWindow(hWnd));

		// first, get drop filename
		CSimpleArray<CString> arrFiles;
		if (MtlGetDropFileName(pDataObject, arrFiles)) {
			CWebBrowser2 browser = DonutGetIWebBrowser2(hWnd);
			if (browser.m_spBrowser != NULL) {
				CString strFile = arrFiles[0];

				if ( !MtlIsProtocol(strFile, _T("http")) &&
					 !MtlIsProtocol(strFile, _T("https")) )
				{
					if (MtlPreOpenFile(strFile))
						return false;// handled
				}
		
				MtlParseIntenetShortcutFile(strFile);

				browser.Navigate2(strFile);
				dropEffect = DROPEFFECT_COPY;
				return false;
			}
		}

		// last, get text
		CString strText;
		if ( MtlGetHGlobalText(pDataObject, strText) ||
			 MtlGetHGlobalText(pDataObject, strText, ::RegisterClipboardFormat(CFSTR_SHELLURL)) )
		{
			CWebBrowser2 browser = DonutGetIWebBrowser2(hWnd);
			if (browser.m_spBrowser != NULL) {
				browser.Navigate2(strText);
				dropEffect = DROPEFFECT_COPY;
				return false;
			}
		}

		dropEffect = (DROPEFFECT)-1;
		return false;
	}

	HRESULT OnGetTabCtrlDataObject(CSimpleArray<int>& arrIndex, IDataObject** ppDataObject)
	{
		ATLASSERT(ppDataObject != NULL);
		ATLASSERT(arrIndex.GetSize() > 0);

		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)) {
			for (int i = 0; i < arrIndex.GetSize(); ++i) {
				int nIndex = arrIndex[i];
				DWORD dwData;
				GetItemUserData(nIndex, dwData);
				HWND hWnd = (HWND)dwData;
				ATLASSERT(::IsWindow(hWnd));
				CWebBrowser2 browser = (IWebBrowser2*)::SendMessage(hWnd, WM_USER_GET_IWEBBROWSER, 0, 0);
				CString strName = MtlGetWindowText(hWnd);
				CString strUrl = browser.GetLocationURL();
				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;
	}

	template <class _Function>
	_Function ForEachWindow(_Function __f)
	{
		DWORD dwData = 0;
		for (int i = 0; i < GetItemCount(); ++i) {
			GetItemUserData(i, dwData);
			HWND hWnd = (HWND)dwData;
			ATLASSERT(::IsWindow(hWnd));
			__f(hWnd);
		}

		return __f;
	}

	void _LockRedraw(bool bLock)
	{
		if (bLock) {
			m_bRedrawLocked = true;
		}
		else {
			m_bRedrawLocked = false;
			int nIndex = GetCurSel();
			if (m_wndMDIChildPopuping.MDIGetActive() == GetTabHwnd(nIndex)) {
				SetItemActive(nIndex);
			}
		}
	}

	class CLockRedraw
	{
	public:
		CMDITabCtrl& m_tab;

		CLockRedraw(CMDITabCtrl& tab) : m_tab(tab)
		{
			m_tab._LockRedraw(true);
			m_tab.SetRedraw(FALSE);
		}

		~CLockRedraw()
		{
			m_tab._LockRedraw(false);
			m_tab.SetRedraw(TRUE);
			m_tab.Invalidate();
			m_tab.UpdateWindow();
		}
	};
};


#define PASS_MSG_MAP_MDICHILD_TO_MDITAB(x) CHAIN_MSG_MAP_ALT_MEMBER(x, 1)

/////////////////////////////////////////////////////////////////////////////
// CMDITabPropertyPage

class CMDITabPropertyPage : public CInitPropertyPageImpl<CMDITabPropertyPage>,
	public CWinDataExchange<CMDITabPropertyPage>
{
public:
// Constants
	enum { IDD = IDD_PROPPAGE_MDITAB };

// Data members
	int m_nAddPos, m_nMultiLine, m_nWheel, m_nFixedSize, m_nAnchorColor;
	int m_nRadioRightClick, m_nRadioDoubleClick, m_nRadioXClick;
	int m_nRadioOnClose;
	int m_nFixedSizeX, m_nFixedSizeY;
	int m_nMaxTextLength;
	CMDITabCtrl* m_pMDITab;

// DDX map
	BEGIN_DDX_MAP(CMDITabPropertyPage)
		DDX_CHECK(IDC_CHECK_WHEEL, m_nWheel)
		DDX_CHECK(IDC_CHECK_MDITAB_MULTILINE, m_nMultiLine)
		DDX_CHECK(IDC_CHECK_MDITAB_FIXEDSIZE, m_nFixedSize)
		DDX_CHECK(IDC_CHECK_MDITAB_ANCHORCOLOR, m_nAnchorColor)
		DDX_INT_RANGE(IDC_EDIT_MDITAB_FIXEDSIZEX, m_nFixedSizeX, 1, 500)
		DDX_INT_RANGE(IDC_EDIT_MDITAB_FIXEDSIZEY, m_nFixedSizeY, 1, 500)
		DDX_CBINDEX(IDC_COMBO_MDITAB_ADDPOS, m_nAddPos)		
		DDX_CBINDEX(IDC_COMBO_MDITAB_RIGHTCLICK, m_nRadioRightClick)
		DDX_CBINDEX(IDC_COMBO_MDITAB_DOUBLECLICK, m_nRadioDoubleClick)
		DDX_CBINDEX(IDC_COMBO_MDITAB_MCLICK, m_nRadioXClick)
		DDX_CBINDEX(IDC_COMBO_ONCLOSE, m_nRadioOnClose)
		DDX_INT_RANGE(IDC_EDIT_TABTEXTMAX, m_nMaxTextLength, 1, 255)
	END_DDX_MAP()

// Constructor
	CMDITabPropertyPage(CMDITabCtrl* pMDITab)
		: m_pMDITab(pMDITab)
	{
		DWORD dwExStyle = m_pMDITab->GetMDITabExtendedStyle();

		m_nWheel = dwExStyle & MTB_EX_WHEEL ? 1 : 0;
		m_nFixedSize = dwExStyle & MTB_EX_FIXEDSIZE ? 1 : 0;
		m_nMultiLine = dwExStyle & MTB_EX_MULTILINE ? 1 : 0;
		m_nAnchorColor = dwExStyle & MTB_EX_ANCHORCOLOR ? 1 : 0;
		CSize sizeItem = m_pMDITab->GetItemSize();
		m_nFixedSizeX = sizeItem.cx;
		m_nFixedSizeY = sizeItem.cy;
		m_nMaxTextLength = m_pMDITab->GetMaxTabItemTextLength();

		if (dwExStyle & MTB_EX_RIGHTCLICKCLOSE)
			m_nRadioRightClick = 1;
		else if (dwExStyle & MTB_EX_RIGHTCLICKREFRESH)
			m_nRadioRightClick = 2;
		else
			m_nRadioRightClick = 0;

		if (dwExStyle & MTB_EX_DOUBLECLICKCLOSE)
			m_nRadioDoubleClick = 1;
		else if (dwExStyle & MTB_EX_DOUBLECLICKREFRESH)
			m_nRadioDoubleClick = 2;
		else
			m_nRadioDoubleClick = 0;

		if (dwExStyle & MTB_EX_XCLICKCLOSE)
			m_nRadioXClick = 1;
		else if (dwExStyle & MTB_EX_XCLICKREFRESH)
			m_nRadioXClick = 2;
		else
			m_nRadioXClick = 0;

		if (dwExStyle & MTB_EX_RIGHTACTIVEONCLOSE)
			m_nRadioOnClose = 1;
		else if (dwExStyle & MTB_EX_LEFTACTIVEONCLOSE)
			m_nRadioOnClose = 2;
		else
			m_nRadioOnClose = 0;

		if (dwExStyle & MTB_EX_ADDLEFT)
			m_nAddPos = 1;
		else if (dwExStyle & MTB_EX_ADDRIGHTACTIVE)
			m_nAddPos = 2;
		else if (dwExStyle & MTB_EX_ADDLEFTACTIVE)
			m_nAddPos = 3;
		else
			m_nAddPos = 0;
	}

// Overrides
	BOOL OnSetActive()
	{
		SetModified(TRUE);
		return DoDataExchange(FALSE);
	}

	BOOL OnKillActive()
	{
		return DoDataExchange(TRUE);
	}

	BOOL OnApply()
	{
		if (DoDataExchange(TRUE)) {
			DWORD dwExtendedStyle = 0;
			if (m_nWheel == 1)
				dwExtendedStyle |= MTB_EX_WHEEL;
			if (m_nMultiLine == 1)
				dwExtendedStyle |= MTB_EX_MULTILINE;
			if (m_nFixedSize == 1)
				dwExtendedStyle |= MTB_EX_FIXEDSIZE;
			if (m_nAnchorColor == 1)
				dwExtendedStyle |= MTB_EX_ANCHORCOLOR;

			switch (m_nRadioRightClick) {
			case 1:
				dwExtendedStyle |= MTB_EX_RIGHTCLICKCLOSE;
				break;
			case 2:
				dwExtendedStyle |= MTB_EX_RIGHTCLICKREFRESH;
				break;
			}

			switch (m_nRadioDoubleClick) {
			case 1:
				dwExtendedStyle |= MTB_EX_DOUBLECLICKCLOSE;
				break;
			case 2:
				dwExtendedStyle |= MTB_EX_DOUBLECLICKREFRESH;
				break;
			}

			switch (m_nRadioXClick) {
			case 1:
				dwExtendedStyle |= MTB_EX_XCLICKCLOSE;
				break;
			case 2:
				dwExtendedStyle |= MTB_EX_XCLICKREFRESH;
				break;
			}

			switch (m_nRadioOnClose) {
			case 1:
				dwExtendedStyle |= MTB_EX_RIGHTACTIVEONCLOSE;
				break;
			case 2:
				dwExtendedStyle |= MTB_EX_LEFTACTIVEONCLOSE;
				break;
			}

			switch (m_nAddPos) {
			case 1:
				dwExtendedStyle |= MTB_EX_ADDLEFT;
				break;
			case 2:
				dwExtendedStyle |= MTB_EX_ADDRIGHTACTIVE;
				break;
			case 3:
				dwExtendedStyle |= MTB_EX_ADDLEFTACTIVE;
				break;
			}
			m_pMDITab->SetItemSize(CSize(m_nFixedSizeX, m_nFixedSizeY));
			m_pMDITab->SetMaxTabItemTextLength(m_nMaxTextLength);
			m_pMDITab->SetMDITabExtendedStyle(dwExtendedStyle);

			return TRUE;
		}
		else 
			return FALSE;
	}

// Message map and handlers
	BEGIN_MSG_MAP(CMDITabPropertyPage)
		CHAIN_MSG_MAP(CInitPropertyPageImpl<CMDITabPropertyPage>)
		COMMAND_ID_HANDLER_EX(IDC_BUTTON_MDITAB_FONT, OnFont)
	END_MSG_MAP()

	void OnFont(WORD /*wNotifyCode*/, WORD /*wID*/, HWND hWndCtl)
	{
		CLogFont lf;
		if (!m_pMDITab->GetMDITabLogFont(lf))
			return;

		CFontDialog dlg(&lf);
		if (dlg.DoModal() == IDOK) {
			m_pMDITab->SetMDITabLogFont(dlg.m_lf);
		}
	}
};

template <class _Profile>
void MtlGetProfileMDITab(_Profile& __profile, CMDITabCtrl& tabMDI)
{
	DWORD dwStyle = 0;
	LONG lRet = __profile.QueryValue(dwStyle, _T("Extended_Style"));

	DWORD dwLength = 30;
	lRet = __profile.QueryValue(dwLength,  _T("Max_Text_Length"));

	CLogFont lf;
	lf.InitDefault();
	if (lf.GetProfile(__profile)) {
		ATLTRACE2(atlTraceUser, 4, _T("MtlGetProfileMDITab fontface : %s\n"), lf.lfFaceName);
		tabMDI.SetMDITabLogFont(lf);
	}

	// load fixed size
	DWORD dwX = 60, dwY = 30;
	__profile.QueryValue(dwX, _T("Fixed_Size_X"));
	__profile.QueryValue(dwY, _T("Fixed_Size_Y"));
	tabMDI.SetItemSize(CSize(dwX, dwY));

	tabMDI.SetMDITabExtendedStyle(dwStyle);
	tabMDI.SetMaxTabItemTextLength(dwLength);
}

template <class _Profile>
void MtlWriteProfileMDITab(_Profile& __profile, CMDITabCtrl& tabMDI)
{
	__profile.SetValue(tabMDI.GetMDITabExtendedStyle(), _T("Extended_Style"));
	__profile.SetValue(tabMDI.GetMaxTabItemTextLength(), _T("Max_Text_Length"));

	CLogFont lf;
	if (tabMDI.GetMDITabLogFont(lf)) {
		lf.WriteProfile(__profile);
	}

	CSize sizeItem = tabMDI.GetItemSize();
	__profile.SetValue(sizeItem.cx, _T("Fixed_Size_X"));
	__profile.SetValue(sizeItem.cy, _T("Fixed_Size_Y"));
}

}  //namespace MTL

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

⌨️ 快捷键说明

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