///////////////////////////////////////////////////////////////////////// // // 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" #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); UINT 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; }