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