scbarg.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:7k
- /////////////////////////////////////////////////////////////////////////
- //
- // CSizingControlBarG Version 2.43
- //
- // Created: Jan 24, 1998 Last Modified: August 03, 2000
- //
- // See the official site at www.datamekanix.com for documentation and
- // the latest news.
- //
- /////////////////////////////////////////////////////////////////////////
- // Copyright (C) 1998-2000 by Cristi Posea. All rights reserved.
- //
- // This code is free for personal and commercial use, providing this
- // notice remains intact in the source files and all eventual changes are
- // clearly marked with comments.
- //
- // You must obtain the author's consent before you can include this code
- // in a software library.
- //
- // No warrantee of any kind, express or implied, is included with this
- // software; use at your own risk, responsibility for damages (if any) to
- // anyone resulting from the use of this software rests entirely with the
- // user.
- //
- // Send bug reports, bug fixes, enhancements, requests, flames, etc. to
- // cristi@datamekanix.com or post them at the message board at the site.
- /////////////////////////////////////////////////////////////////////////
- // sizecbar.cpp : implementation file
- //
- #include "stdafx.h"
- #include "scbarg.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////
- // CSizingControlBarG
- IMPLEMENT_DYNAMIC(CSizingControlBarG, baseCSizingControlBarG);
- CSizingControlBarG::CSizingControlBarG()
- {
- m_cyGripper = 12;
- }
- CSizingControlBarG::~CSizingControlBarG()
- {
- }
- BEGIN_MESSAGE_MAP(CSizingControlBarG, baseCSizingControlBarG)
- //{{AFX_MSG_MAP(CSizingControlBarG)
- ON_WM_NCLBUTTONUP()
- // ON_WM_NCHITTEST()
- //}}AFX_MSG_MAP
- ON_MESSAGE(WM_SETTEXT, OnSetText)
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////
- // CSizingControlBarG message handlers
- /////////////////////////////////////////////////////////////////////////
- // Mouse Handling
- //
- void CSizingControlBarG::OnNcLButtonUp(UINT nHitTest, CPoint point)
- {
- if (nHitTest == HTCLOSE)
- m_pDockSite->ShowControlBar(this, FALSE, FALSE); // hide
- baseCSizingControlBarG::OnNcLButtonUp(nHitTest, point);
- }
- void CSizingControlBarG::NcCalcClient(LPRECT pRc, UINT nDockBarID)
- {
- CRect rcBar(pRc); // save the bar rect
- // subtract edges
- baseCSizingControlBarG::NcCalcClient(pRc, nDockBarID);
- if (!HasGripper())
- return;
- CRect rc(pRc); // the client rect as calculated by the base class
- BOOL bHorz = (nDockBarID == AFX_IDW_DOCKBAR_TOP) ||
- (nDockBarID == AFX_IDW_DOCKBAR_BOTTOM);
- if (bHorz)
- rc.DeflateRect(m_cyGripper, 0, 0, 0);
- else
- rc.DeflateRect(0, m_cyGripper, 0, 0);
- // set position for the "x" (hide bar) button
- CPoint ptOrgBtn;
- if (bHorz)
- ptOrgBtn = CPoint(rc.left - 13, rc.top);
- else
- ptOrgBtn = CPoint(rc.right - 12, rc.top - 13);
- m_biHide.Move(ptOrgBtn - rcBar.TopLeft());
- *pRc = rc;
- }
- void CSizingControlBarG::NcPaintGripper(CDC* pDC, CRect rcClient)
- {
- if (!HasGripper())
- return;
- // paints a simple "two raised lines" gripper
- // override this if you want a more sophisticated gripper
- CRect gripper = rcClient;
- CRect rcbtn = m_biHide.GetRect();
- BOOL bHorz = IsHorzDocked();
- gripper.DeflateRect(1, 1);
- if (bHorz)
- { // gripper at left
- gripper.left -= m_cyGripper;
- gripper.right = gripper.left + 3;
- gripper.top = rcbtn.bottom + 3;
- }
- else
- { // gripper at top
- gripper.top -= m_cyGripper;
- gripper.bottom = gripper.top + 3;
- gripper.right = rcbtn.left - 3;
- }
- pDC->Draw3dRect(gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),
- ::GetSysColor(COLOR_BTNSHADOW));
- gripper.OffsetRect(bHorz ? 3 : 0, bHorz ? 0 : 3);
- pDC->Draw3dRect(gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),
- ::GetSysColor(COLOR_BTNSHADOW));
- m_biHide.Paint(pDC);
- }
- LRESULT CSizingControlBarG::OnNcHitTest(CPoint point)
- {
- CRect rcBar;
- GetWindowRect(rcBar);
- LRESULT nRet = baseCSizingControlBarG::OnNcHitTest(point);
- if (nRet != HTCLIENT)
- return nRet;
- CRect rc = m_biHide.GetRect();
- rc.OffsetRect(rcBar.TopLeft());
- if (rc.PtInRect(point))
- return HTCLOSE;
- return HTCLIENT;
- }
- /////////////////////////////////////////////////////////////////////////
- // CSizingControlBarG implementation helpers
- void CSizingControlBarG::OnUpdateCmdUI(CFrameWnd* pTarget,
- BOOL bDisableIfNoHndler)
- {
- UNUSED_ALWAYS(bDisableIfNoHndler);
- UNUSED_ALWAYS(pTarget);
- if (!HasGripper())
- return;
- BOOL bNeedPaint = FALSE;
- CPoint pt;
- ::GetCursorPos(&pt);
- BOOL bHit = (OnNcHitTest(pt) == HTCLOSE);
- BOOL bLButtonDown = (::GetKeyState(VK_LBUTTON) < 0);
- BOOL bWasPushed = m_biHide.bPushed;
- m_biHide.bPushed = bHit && bLButtonDown;
- BOOL bWasRaised = m_biHide.bRaised;
- m_biHide.bRaised = bHit && !bLButtonDown;
- bNeedPaint |= (m_biHide.bPushed ^ bWasPushed) ||
- (m_biHide.bRaised ^ bWasRaised);
- if (bNeedPaint)
- SendMessage(WM_NCPAINT);
- }
- /////////////////////////////////////////////////////////////////////////
- // CSCBButton
- CSCBButton::CSCBButton()
- {
- bRaised = FALSE;
- bPushed = FALSE;
- }
- void CSCBButton::Paint(CDC* pDC)
- {
- CRect rc = GetRect();
- if (bPushed)
- pDC->Draw3dRect(rc, ::GetSysColor(COLOR_BTNSHADOW),
- ::GetSysColor(COLOR_BTNHIGHLIGHT));
- else
- if (bRaised)
- pDC->Draw3dRect(rc, ::GetSysColor(COLOR_BTNHIGHLIGHT),
- ::GetSysColor(COLOR_BTNSHADOW));
- COLORREF clrOldTextColor = pDC->GetTextColor();
- pDC->SetTextColor(::GetSysColor(COLOR_BTNTEXT));
- int nPrevBkMode = pDC->SetBkMode(TRANSPARENT);
- CFont font;
- int ppi = pDC->GetDeviceCaps(LOGPIXELSX);
- int pointsize = MulDiv(60, 96, ppi); // 6 points at 96 ppi
- font.CreatePointFont(pointsize, _T("Marlett"));
- CFont* oldfont = pDC->SelectObject(&font);
- pDC->TextOut(ptOrg.x + 2, ptOrg.y + 2, CString(_T("r"))); // x-like
- pDC->SelectObject(oldfont);
- pDC->SetBkMode(nPrevBkMode);
- pDC->SetTextColor(clrOldTextColor);
- }
- BOOL CSizingControlBarG::HasGripper() const
- {
- #if defined(_SCB_MINIFRAME_CAPTION) || !defined(_SCB_REPLACE_MINIFRAME)
- // if the miniframe has a caption, don't display the gripper
- if (IsFloating())
- return FALSE;
- #endif //_SCB_MINIFRAME_CAPTION
- return TRUE;
- }