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

📄 bcgpoutlookwnd.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

		if (pWndToUpdate != NULL)
		{
			pWndToUpdate->RedrawWindow (NULL, NULL, RDW_FRAME | RDW_INVALIDATE);
		}
	}

	//-------------
	// Redraw tabs:
	//-------------
	RedrawWindow ();

	if (!bIsFirstTime)
	{
		CView* pActiveView = DYNAMIC_DOWNCAST (CView, pWndActive);
		if (pActiveView != NULL)
		{
			CFrameWnd* pFrame = BCGPGetParentFrame (pActiveView);
			ASSERT_VALID (pFrame);

			pFrame->SetActiveView (pActiveView);
		}
		else
		{
			pWndActive->SetFocus ();
		}
	}

	return TRUE;
}
//**********************************************************************************
CWnd* CBCGPOutlookWnd::FindTargetWnd (const CPoint& pt)
{
	for (int i = 0; i < m_iTabsNum; i ++)
	{
		CBCGPTabInfo* pTab = (CBCGPTabInfo*) m_arTabs [i];
		ASSERT_VALID (pTab);
		
		if (!pTab->m_bVisible)
			continue;
		
		if (pTab->m_rect.PtInRect (pt))
		{
			return NULL;
		}
	}

	CWnd* pWndParent = GetParent ();
	ASSERT_VALID (pWndParent);

	return pWndParent;
}
//**********************************************************************************
void CBCGPOutlookWnd::OnSize(UINT nType, int cx, int cy) 
{
	CWnd::OnSize(nType, cx, cy);
	RecalcLayout ();
}
//***********************************************************************************
void CBCGPOutlookWnd::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	//-------------
	// Draw border:
	//-------------
	CRect rectClient;
	GetClientRect (rectClient);

	if (m_nBorderSize > 0)
	{
		CBrush* pOldBrush = dc.SelectObject (&globalData.brBarFace);
		ASSERT (pOldBrush != NULL);

		dc.PatBlt (rectClient.left, rectClient.top, m_nBorderSize, rectClient.Height (), PATCOPY);
		dc.PatBlt (rectClient.left, rectClient.top, rectClient.Width (), m_nBorderSize, PATCOPY);
		dc.PatBlt (rectClient.right - m_nBorderSize - 1, rectClient.top, m_nBorderSize + 1, rectClient.Height (), PATCOPY);
		dc.PatBlt (rectClient.left, rectClient.bottom - m_nBorderSize, rectClient.Width (), m_nBorderSize, PATCOPY);

		dc.SelectObject (pOldBrush);

		rectClient.DeflateRect (m_nBorderSize, m_nBorderSize);
	}

	dc.Draw3dRect (rectClient, globalData.clrBarShadow, globalData.clrBarShadow);
	
	CPen penDrak (PS_SOLID, 1, globalData.clrBarShadow);
	CPen* pOldPen = (CPen*) dc.SelectObject (&penDrak);
	ASSERT(pOldPen != NULL);

	dc.MoveTo (m_rectWndArea.left - 1, m_rectWndArea.bottom);
	dc.LineTo (m_rectWndArea.right + 1, m_rectWndArea.bottom);

	CFont* pOldFont = (CFont*) dc.SelectObject (&globalData.fontRegular);
	dc.SetBkMode (TRANSPARENT);

	int nVisibleTabsNum = GetVisibleTabsNum ();

	if (nVisibleTabsNum > 1 || !IsHideSingleTab ())
	{
		for (int i = 0; i < m_iTabsNum; i ++)
		{
			DrawTabButton (dc, i);
		}
	}

	// Draw scroll buttons:
	if (m_bScrollButtons)
	{
		if (m_iActiveTab == m_iTabsNum - 1)
		{
			CRect rectFill = rectClient;
			rectFill.top = rectFill.bottom - m_nTabsHeight;

			dc.FillRect (rectFill, &globalData.brBarFace);
		}
	}

	dc.SelectObject (pOldPen);
	dc.SelectObject (pOldFont);
}
//*************************************************************************************
void CBCGPOutlookWnd::DrawTabButton (CDC& dc, int iButtonIdx, BOOL bDrawPressedButton)
{
	CBCGPTabInfo* pTab = (CBCGPTabInfo*) m_arTabs [iButtonIdx];
	ASSERT_VALID (pTab);

	CRect rectBtn = pTab->m_rect;

	BOOL bIsHighlighted = (iButtonIdx == m_iHighlighted);
	BOOL bIsPressed = (iButtonIdx == m_iPressed) && bDrawPressedButton;

	COLORREF clrBtnText = globalData.clrBarText;

	CBCGPVisualManager::GetInstance ()->OnFillOutlookPageButton (&dc,
		rectBtn, bIsHighlighted, bIsPressed, clrBtnText);

	CBCGPVisualManager::GetInstance ()->OnDrawOutlookPageButtonBorder (
		&dc, rectBtn, bIsHighlighted, bIsPressed);

	//---------------
	// Draw tab icon:
	//---------------
	CSize sizeImage = GetImageSize ();
	UINT uiIcon = GetTabIcon (iButtonIdx);
	HICON hIcon = GetTabHicon (iButtonIdx);

	if (uiIcon == (UINT)-1 && hIcon == NULL)
	{
		sizeImage.cx = 0;
	}

	if (sizeImage.cx + CBCGPBaseTabWnd::TAB_IMAGE_MARGIN <= rectBtn.Width ())
	{
		CRect rectImage = rectBtn;

		rectImage.top += (rectBtn.Height () - sizeImage.cy) / 2;
		rectImage.bottom = rectImage.top + sizeImage.cy;

		rectImage.left += IMAGE_MARGIN;
		rectImage.right = rectImage.left + sizeImage.cx;

		if (hIcon != NULL)
		{
			//---------------------
			// Draw the tab's icon:
			//---------------------
			dc.DrawState (rectImage.TopLeft (), rectImage.Size (), 
				hIcon, DSS_NORMAL, (HBRUSH) NULL);
		}
		else
		{
			const CImageList* pImageList = GetImageList ();
			if (pImageList != NULL && uiIcon != (UINT)-1)
			{
				ASSERT_VALID (pImageList);

				//----------------------
				// Draw the tab's image:
				//----------------------
				((CImageList*)pImageList)->Draw (&dc, uiIcon, rectImage.TopLeft (), ILD_TRANSPARENT);
			}
		}
	}

	#define TEXT_MARGIN		4
	#define GRIPPER_MARGIN	4

	//---------------
	// Draw tab text:
	//---------------
	dc.SetTextColor (clrBtnText);

	CRect rcText = pTab->m_rect;

	if (pTab->m_bIsDetachable)
	{
		rcText.right -= CX_GRIPPER + GRIPPER_MARGIN * 2;
	}

	rcText.left += sizeImage.cx + 2 * TEXT_MARGIN;

	UINT uiDTFlags = DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;

	switch (m_nPageButtonTextAlign)
	{
	case TA_LEFT:
		uiDTFlags |= DT_LEFT;
		break;

	case TA_CENTER:
	default:
		uiDTFlags |= DT_CENTER;
		break;

	case TA_RIGHT:
		uiDTFlags |= DT_RIGHT;
		break;
	}

	dc.DrawText (pTab->m_strText, rcText, uiDTFlags);

	if (pTab->m_bIsDetachable)
	{
		//--------------
		// Draw gripper:
		//--------------
		CRect rectGripper = pTab->m_rect;
		rectGripper.left = rcText.right;
		rectGripper.DeflateRect (GRIPPER_MARGIN, 2);

		CBCGPBaseControlBar bar;
		CBCGPVisualManager::GetInstance ()->OnDrawBarGripper (&dc,
			rectGripper, TRUE, &bar);
	}
}
//**************************************************************************************
void CBCGPOutlookWnd::GetTabArea (CRect& rectTabAreaTop, CRect& rectTabAreaBottom) const
{
	rectTabAreaTop.SetRectEmpty ();
	rectTabAreaBottom.SetRectEmpty ();

	for (int i = 0; i < m_iTabsNum; i ++)
	{
		CBCGPTabInfo* pTab = (CBCGPTabInfo*) m_arTabs [i];
		ASSERT_VALID (pTab);

		CRect rectBtn = pTab->m_rect;

		//--------------------------------
		// The first tab is always at top:
		//--------------------------------
		if (i == 0)
		{
			rectTabAreaTop = pTab->m_rect;
			continue;
		}

		if (rectTabAreaTop.bottom == pTab->m_rect.top)
		{
			rectTabAreaTop.bottom += pTab->m_rect.Height ();
		}
		else if (rectTabAreaBottom.IsRectEmpty ())
		{
			rectTabAreaBottom = pTab->m_rect;
		}
		else
		{
			rectTabAreaBottom.bottom += pTab->m_rect.Height ();
		}
	}
	ClientToScreen (rectTabAreaTop);
	ClientToScreen (rectTabAreaBottom);
}
//*************************************************************************************
void CBCGPOutlookWnd::SetBorderSize (int nBorderSize)
{
	ASSERT_VALID (this);
	
	m_nBorderSize = nBorderSize;
	RecalcLayout ();
}
//*************************************************************************************
BOOL CBCGPOutlookWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	CPoint ptCursor;
	::GetCursorPos (&ptCursor);
	ScreenToClient (&ptCursor);

	if (GetTabFromPoint (ptCursor) >= 0)
	{
		if (globalData.m_hcurHand == NULL)
		{
			CBCGPLocalResource locaRes;
			globalData.m_hcurHand = AfxGetApp ()->LoadCursor (IDC_BCGBARRES_HAND);
		}

		::SetCursor (globalData.m_hcurHand);
		return TRUE;
	}
	
	return CBCGPBaseTabWnd::OnSetCursor(pWnd, nHitTest, message);
}
//***************************************************************************************
int CBCGPOutlookWnd::GetTabNumberToDetach (int nTabNum) const
{
	return (nTabNum == -1 ? m_iPressed : nTabNum);
}
//**************************************************************************************
BOOL CBCGPOutlookWnd::OnEraseBkgnd(CDC* pDC) 
{
	return m_iTabsNum ? TRUE : CBCGPBaseTabWnd::OnEraseBkgnd(pDC);
}
//**************************************************************************************
DROPEFFECT CBCGPOutlookWnd::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point) 
{
	return OnDragOver(pDataObject, dwKeyState, point);
}
//****************************************************************************************
DROPEFFECT CBCGPOutlookWnd::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, 
								   CPoint point) 
{
#ifdef BCG_NO_CUSTOMIZATION

	return DROPEFFECT_NONE;

#else
	CBCGPToolbarButton* pButton = CBCGPToolbarButton::CreateFromOleData (pDataObject);
	if (pButton == NULL)
	{
		return DROPEFFECT_NONE;
	}
	
	if (!pButton->IsKindOf (RUNTIME_CLASS (CBCGPOutlookButton)))
	{
		delete pButton;
		return DROPEFFECT_NONE;
	}

	delete pButton;

	int nTab = GetTabFromPoint (point);
	if (nTab < 0)
	{
		return DROPEFFECT_NONE;
	}

	SetActiveTab (nTab);
	BOOL bCopy = (dwKeyState & MK_CONTROL);

	return (bCopy) ? DROPEFFECT_COPY : DROPEFFECT_MOVE;

#endif // BCG_NO_CUSTOMIZATION
}
//****************************************************************************************
void CBCGPOutlookWnd::EnableAnimation (BOOL bEnable)
{
	m_bEnableAnimation = bEnable;
}
//***************************************************************************************
void CBCGPOutlookWnd::EnableScrollButtons (BOOL bEnable/* = TRUE*/,
										   BOOL bIsUp/* = TRUE*/, BOOL bIsDown/* = TRUE*/)
{
	ASSERT_VALID (this);

	BOOL bRecalcLayout = m_bScrollButtons != bEnable;

	m_bScrollButtons = bEnable;

	if (m_bScrollButtons)
	{
		m_btnUp.ShowWindow (SW_SHOWNOACTIVATE);
		m_btnUp.EnableWindow (bIsUp);
		m_btnUp.SetStdImage (CMenuImages::IdArowUpLarge,
			bIsUp ? CMenuImages::ImageBlack : CMenuImages::ImageGray);

		m_btnDown.ShowWindow (SW_SHOWNOACTIVATE);
		m_btnDown.EnableWindow (bIsDown);
		m_btnDown.SetStdImage (CMenuImages::IdArowDownLarge,
			bIsDown ? CMenuImages::ImageBlack : CMenuImages::ImageGray);
	}
	else
	{
		m_btnUp.ShowWindow (SW_HIDE);
		m_btnDown.ShowWindow (SW_HIDE);
	}

	m_btnUp.RedrawWindow ();
	m_btnDown.RedrawWindow ();

	if (bRecalcLayout)
	{
		RecalcLayout ();
	}
}
//****************************************************************************************
int CBCGPOutlookWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CBCGPBaseTabWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	//-----------------------
	// Create scroll buttons:
	//-----------------------
	CRect rectDummy (0, 0, 0, 0);

	m_btnUp.Create (_T(""), WS_CHILD | BS_PUSHBUTTON, rectDummy,
					this, (UINT)-1);
	m_btnUp.SetStdImage (CMenuImages::IdArowUpLarge);
	m_btnUp.SetAutorepeatMode (100);

	m_btnDown.Create (_T(""), WS_CHILD | BS_PUSHBUTTON, rectDummy,
					this, (UINT)-1);
	m_btnDown.SetStdImage (CMenuImages::IdArowDownLarge);
	m_btnDown.SetAutorepeatMode (100);

	return 0;
}
//***************************************************************************************
BOOL CBCGPOutlookWnd::OnCommand(WPARAM wParam, LPARAM lParam) 
{
	HWND hwnd = (HWND) lParam;

	CBCGPOutlookBar* pOutlookBar = 
		DYNAMIC_DOWNCAST (CBCGPOutlookBar, GetParent ());

	if (pOutlookBar != NULL)
	{
		if (m_btnUp.GetSafeHwnd () == hwnd)
		{
			pOutlookBar->OnScroll (FALSE);

			if (!m_btnUp.IsWindowEnabled ())
			{
				SetFocus ();
			}

			return TRUE;
		}
		
		if (m_btnDown.GetSafeHwnd () == hwnd)
		{
			pOutlookBar->OnScroll (TRUE);

			if (!m_btnDown.IsWindowEnabled ())
			{
				SetFocus ();
			}

			return TRUE;
		}
	}
	
	return CBCGPBaseTabWnd::OnCommand(wParam, lParam);
}
//*********************************************************************************
void CBCGPOutlookWnd::SetPageButtonTextAlign (UINT uiAlign, BOOL bRedraw/* = TRUE*/)
{
	m_nPageButtonTextAlign = uiAlign;

	if (bRedraw && GetSafeHwnd () != NULL)
	{
		RedrawWindow ();
	}
}

⌨️ 快捷键说明

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