📄 guiofficebar.cpp
字号:
//-----------------------------------------------------------------------//
// This is a part of the GuiLib MFC Extention. //
// Autor : Francisco Campos //
// (C) 2002 Francisco Campos <www.beyondata.com> All rights reserved //
// This code is provided "as is", with absolutely no warranty expressed //
// or implied. Any use is at your own risk. //
// You must obtain the author's consent before you can include this code //
// in a software library. //
// If the source code in this file is used in any application //
// then acknowledgement must be made to the author of this program //
// fco_campos@tutopia.com //
//-----------------------------------------------------------------------//
#include "stdafx.h"
#include "..\header\guiofficebar.h"
#include "..\header\guidrawlayer.h"
#define HORZF(dw) (dw & CBRS_ORIENT_HORZ)
#define VERTF(dw) (dw & CBRS_ORIENT_VERT)
#define CX_BORDER 1
#define CY_BORDER 1
enum btn{
HTBACK=520,
HTFORWAR=521,
THMENU=522,
HTCLOS=523
};
int ArrBtn[4]={HTBACK,HTFORWAR,THMENU,HTCLOS};
void _AfxGuiAdjustRectangle(CRect& rect, CPoint pt)
{
int nXOffset = (pt.x < rect.left) ? (pt.x - rect.left) :
(pt.x > rect.right) ? (pt.x - rect.right) : 0;
int nYOffset = (pt.y < rect.top) ? (pt.y - rect.top) :
(pt.y > rect.bottom) ? (pt.y - rect.bottom) : 0;
rect.OffsetRect(nXOffset, nYOffset);
}
BEGIN_MESSAGE_MAP(CGuiOfficeBar,CGuiControlBar)
ON_WM_CREATE()
ON_WM_NCLBUTTONDOWN()
ON_WM_NCLBUTTONUP()
ON_WM_TIMER()
ON_WM_NCMOUSEMOVE()
ON_WM_NCHITTEST()
ON_COMMAND(HTBACK,OnBack)
ON_COMMAND(HTFORWAR,OnForWard)
ON_COMMAND(THMENU,OnMenu)
ON_WM_NCCALCSIZE()
END_MESSAGE_MAP()
CGuiOfficeBar::CGuiOfficeBar(void)
{
m_stateBtnBack=NORMAL;
m_stateBtnClose=NORMAL;
m_stateBtnFor=NORMAL;
m_stateBtnMenu=NORMAL;
m_StateBtn=NORMAL;
m_nHits=-1;
}
CGuiOfficeBar::~CGuiOfficeBar(void)
{
}
void CGuiOfficeBar::OnBack()
{
}
void CGuiOfficeBar::OnForWard()
{
}
void CGuiOfficeBar::OnMenu()
{
}
int CGuiOfficeBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CGuiControlBar::OnCreate(lpCreateStruct) == -1)
return -1;
m_ArrButtons[0].SetData(1,"Back");
m_ArrButtons[0].SetImageList(IDB_DOCKBAROFFICE,16,7,RGB(255,0,255));
m_ArrButtons[1].SetData(2,"Forwar");
m_ArrButtons[1].SetImageList(IDB_DOCKBAROFFICE,16,7,RGB(255,0,255));
m_ArrButtons[2].SetData(0,"Menu");
m_ArrButtons[2].SetImageList(IDB_DOCKBAROFFICE,16,7,RGB(255,0,255));
m_ArrButtons[3].SetData(6,"Close");
m_ArrButtons[3].SetImageList(IDB_DOCKBAROFFICE,16,7,RGB(255,0,255));
m_ArrButtons[0].SetTypeButton(CGuiControlBarButton::GUITOOLBUTTON);
m_ArrButtons[1].SetTypeButton(CGuiControlBarButton::GUITOOLBUTTON);
m_ArrButtons[2].SetTypeButton(CGuiControlBarButton::GUITOOLBUTTON);
m_ArrButtons[3].SetTypeButton(CGuiControlBarButton::GUITOOLBUTTON);
SetColorFondo(RGB(255,255,255));
return 0;
}
CSize CGuiOfficeBar::CalcDynamicLayout(int nLength, DWORD nMode)
{
m_pDockSite->RecalcLayout();
if (IsFloating())
{
// Enable diagonal arrow cursor for resizing
//m_sizeVert=m_sizeHorz=CSize(200,200);
GetParent()->GetParent()->ModifyStyle(MFS_4THICKFRAME|WS_CAPTION,0);
}
if (nMode & (LM_HORZDOCK | LM_VERTDOCK))
{
m_pDockSite->DelayRecalcLayout();
//obligar a reposicionar la ventana, de lo contrario cuando vuelva de un doble click
//desde la ventana CMiniFrameWnd queda sin area cliente
SetWindowPos(NULL, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER |
SWP_NOACTIVATE | SWP_FRAMECHANGED|SWP_NOREDRAW);
return CControlBar::CalcDynamicLayout(nLength, nMode);
}
if (nMode & LM_MRUWIDTH)
return m_sizeMinFloating;
if (nMode & LM_COMMIT)
return m_sizeMinFloating ;
if (IsFloating())
{
CRect rcWin;
POINT cpt;
GetCursorPos(&cpt);
GetParent()->GetParent()->GetWindowRect(&rcWin);
int nXOffset=0;int nYOffset=0;
switch (m_pDockContext->m_nHitTest)
{
//------------------------------------------------------------------
case HTLEFT:
m_pDockContext->m_rectFrameDragHorz= rcWin;
m_pDockContext->m_rectFrameDragHorz.left = cpt.x;
m_sizeMinFloating.cx = max(rcWin.right - cpt.x,32)-4 ;
m_sizeMinFloating.cy = max((rcWin.bottom -rcWin.top)-nGapGripper-5,32)+2 ;
return m_sizeMinFloating;
break;
case HTTOP:
m_pDockContext->m_rectFrameDragHorz=rcWin;
m_pDockContext->m_rectFrameDragHorz.top = cpt.y;
m_sizeMinFloating.cx = max(rcWin.right-rcWin.left-2,32)-4 ;
m_sizeMinFloating.cy = max((rcWin.bottom -nGapGripper-cpt.y-3),32) ;
return m_sizeMinFloating;
break;
case HTRIGHT:
m_pDockContext->m_rectFrameDragHorz=rcWin;
m_pDockContext->m_rectFrameDragHorz.right = cpt.x;
m_sizeMinFloating.cy = max(rcWin.bottom -rcWin.top-nGapGripper-3,32) ;
m_sizeMinFloating.cx = max(cpt.x-rcWin.left-4,32);
return m_sizeMinFloating;
break;
case HTBOTTOM:
m_pDockContext->m_rectFrameDragHorz=rcWin;
m_sizeMinFloating.cy = max(cpt.y-rcWin.top -nGapGripper-3,32) ;
m_sizeMinFloating.cx = max(rcWin.right-rcWin.left-2,32)-4 ;
m_pDockContext->m_rectFrameDragHorz.bottom = cpt.y-4;
return m_sizeMinFloating;
break;
case HTTOPLEFT:
//---------------------------------------------------------
//En este caso crece la ventana a izquierda y hacia arriba
//izquierda incrementa cx y top incrementa cy
m_sizeMinFloating.cx = max(rcWin.right - cpt.x,32)-3 ;
m_sizeMinFloating.cy = max(rcWin.bottom -nGapGripper-cpt.y,32)-2 ;
m_pDockContext->m_rectFrameDragHorz.top = cpt.y-1;
m_pDockContext->m_rectFrameDragHorz.left = cpt.x-2;
return m_sizeMinFloating;
break;
case HTTOPRIGHT:
m_sizeMinFloating.cx = max(cpt.x-rcWin.left,32)-4 ;
m_sizeMinFloating.cy = max(rcWin.bottom -nGapGripper-cpt.y,32)-2 ;
m_pDockContext->m_rectFrameDragHorz.top = cpt.y-1;
m_pDockContext->m_rectFrameDragHorz.right = cpt.x-2;
return m_sizeMinFloating;
break;
case HTBOTTOMLEFT:
m_sizeMinFloating.cx = max(rcWin.right - cpt.x,32)-4;
m_sizeMinFloating.cy = max(cpt.y-rcWin.top -nGapGripper,32)-2 ;
m_pDockContext->m_rectFrameDragHorz.top = rcWin.top;
m_pDockContext->m_rectFrameDragHorz.bottom = cpt.y-1;
m_pDockContext->m_rectFrameDragHorz.left = cpt.x-2;
return m_sizeMinFloating;
break;
case HTBOTTOMRIGHT:
m_sizeMinFloating.cx = max(cpt.x-rcWin.left,32);
m_sizeMinFloating.cy = max(cpt.y-rcWin.top -nGapGripper,32) ;
m_pDockContext->m_rectFrameDragHorz.top = rcWin.top;
m_pDockContext->m_rectFrameDragHorz.bottom = cpt.y+1;
m_pDockContext->m_rectFrameDragHorz.right = cpt.x+2;
return m_sizeMinFloating;
break;
}
}
if(nMode & LM_LENGTHY)
m_sizeMinFloating.cy = max(nLength,32);
else
m_sizeMinFloating.cx = max(nLength,32);
return m_sizeMinFloating;
}
void CGuiOfficeBar::OnNcCalcSize(BOOL /*bCalcValidRects*/, NCCALCSIZE_PARAMS* lpncsp)
{
// adjust non-client area for border space
lpncsp->rgrc[0].left +=!IsFloating()?5:2;
lpncsp->rgrc[0].top +=nGapGripper+3;
lpncsp->rgrc[0].right -=!IsFloating()?IsVert()?7:4:2;
lpncsp->rgrc[0].bottom -=!IsFloating()?3:2;
}
void CGuiOfficeBar::DrawGripper(CDC* pDC,CRect* rc)
{
CRect gripper = rc;
gripper.top =3;
gripper.left+=4;
gripper.right-=IsVert()?5:4;
gripper.bottom =gripper.top +nGapGripper-3;
//si la ventana esta activa pintamos el caption o el area del titulo de color azul
CPen cp(PS_SOLID,1,::GetSysColor(COLOR_BTNHIGHLIGHT));
CPen* cpold=pDC->SelectObject(&cp);
//linea superior
CBrush cb;
cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace());//GuiDrawLayer::GetRGBCaptionXP());
pDC->FillRect(gripper,&cb);
pDC->SelectObject(cpold);
gripper.DeflateRect(1, 1);
CString m_caption;
GetWindowText(m_caption);
CFont m_cfont;
m_cfont.CreateFont(-11,0,0,0,FW_SEMIBOLD,0,0,0,0,1,2,1,34,"Microsoft Sans Serif");
CFont* m_fontOld=pDC->SelectObject(&m_cfont);
int nMode = pDC->SetBkMode(TRANSPARENT);
CSize SizeCad=pDC->GetTextExtent(m_caption);
CRect rCText=gripper;
rCText.top=6;
rCText.bottom =rCText.top+14;
rCText.left=34;
int cont=SizeCad.cx;
while(cont > 1 && gripper.Width()-60 > 0)
{
CSize coor=pDC->GetTextExtent(m_caption,m_caption.GetLength());
if(coor.cx > gripper.Width()-60)
{
m_caption=m_caption.Left(m_caption.GetLength()-1);
}
else
break;
cont--;
}
//CRect gripper;
//------------------------------------------------
GetWindowRect( gripper );
ScreenToClient( gripper );
gripper.OffsetRect( -gripper.left, -gripper.top );
//boton de Close
m_ArrButtons[3].rcArea=gripper;
m_ArrButtons[3].rcArea.left=m_ArrButtons[3].rcArea.right-20;
m_ArrButtons[3].rcArea.right-=7;
m_ArrButtons[3].rcArea.top+=4;
m_ArrButtons[3].rcArea.bottom=m_ArrButtons[3].rcArea.top+13;
//boton menu
m_ArrButtons[2].rcArea=gripper;
m_ArrButtons[2].rcArea.left=m_ArrButtons[3].rcArea.left-16;
m_ArrButtons[2].rcArea.right=m_ArrButtons[2].rcArea.left+13;
m_ArrButtons[2].rcArea.top+=4;
m_ArrButtons[2].rcArea.bottom=m_ArrButtons[2].rcArea.top+13;
//boton back
m_ArrButtons[0].rcArea=gripper;
m_ArrButtons[0].rcArea.left+=4;
m_ArrButtons[0].rcArea.right=m_ArrButtons[0].rcArea.left+13;
m_ArrButtons[0].rcArea.top+=4;
m_ArrButtons[0].rcArea.bottom=m_ArrButtons[0].rcArea.top+13;
//boton forward
m_ArrButtons[1].rcArea=gripper;
m_ArrButtons[1].rcArea.left+=m_ArrButtons[0].rcArea.right+2;
m_ArrButtons[1].rcArea.right=m_ArrButtons[1].rcArea.left+13;
m_ArrButtons[1].rcArea.top+=4;
m_ArrButtons[1].rcArea.bottom=m_ArrButtons[1].rcArea.top+13;
//m_rcCloseBtn.left-=4;
//ClientToScreen(m_rcCloseBtn);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -