📄 fbctrlbar.cpp
字号:
{
m_bDown = TRUE;
SetCapture(m_hWnd);
m_BeginP.x = m_MoveP.x = pPos->x;
m_BeginP.y = m_MoveP.y = pPos->y;
if(m_nSizeFlag != SIZEFLAG_NON)
{
m_nSized = 0;
DrawSizeFlag();
return;
}
if(!(m_nStyle&CBS_FLYBY) || HitTest(pPos)!=HITTEST_GRIPPER)
{
m_bDown = FALSE;
ReleaseCapture();
return;
}
SetCapture(m_hWnd);
m_nFlyState = m_nDockState;
GetWindowRect(m_hWnd,&m_rcFlyby);
if(m_nFlyState != CB_DOCK_NON)
LineRect(GetDC(NULL),&m_rcFlyby);
else
DrawDragRect(GetDC(NULL),&m_rcFlyby);
}
////////////////////////////////////////////////////////////////////////////
void CFBCtrlBar::OnLButtonUp(LPPOINT pPos,UINT key)
{
if(!m_bDown)return;
m_bDown = FALSE;
ReleaseCapture();
if(m_nSizeFlag != SIZEFLAG_NON)
{
DrawSizeFlag();
if(m_nSized != 0)
{
if(m_nSizeFlag == SIZEFLAG_WE)//东西向拖动大小
{
if(m_nDockState == CB_DOCK_LEFT)
m_nWidth += m_nSized;
else
m_nWidth -= m_nSized;
}
else//南北向拖动大小
{
if(m_nDockState == CB_DOCK_TOP)
m_nHeight += m_nSized;
else
m_nHeight -= m_nSized;
}
SendMessage(m_pOwner->m_hWnd,WM_SIZE,0,0);
}
m_nSizeFlag = SIZEFLAG_NON;
return;
}
if(!(m_nStyle&CBS_FLYBY))return;
if(m_nFlyState != CB_DOCK_NON)
LineRect(GetDC(NULL),&m_rcFlyby);
else
{
DrawDragRect(GetDC(NULL),&m_rcFlyby);
CopyRect(&m_rcOver,&m_rcFlyby);
}
DockStateChange(m_nFlyState);
}
////////////////////////////////////////////////////////////////////////////
void CFBCtrlBar::OnMouseMove(LPPOINT pPos,UINT key)
{
if(!m_bDown)return;
if(m_nSizeFlag != SIZEFLAG_NON)
{
DrawSizeFlag();
m_MoveP.x = pPos->x;
m_MoveP.y = pPos->y;
if(m_nSizeFlag == SIZEFLAG_WE)
m_nSized = m_MoveP.x - m_BeginP.x;
else
m_nSized = m_MoveP.y - m_BeginP.y;
DrawSizeFlag();
return;
}
if(!(m_nStyle&CBS_FLYBY))return;
if(m_nFlyState != CB_DOCK_NON)
LineRect(GetDC(NULL),&m_rcFlyby);
else
DrawDragRect(GetDC(NULL),&m_rcFlyby);
m_rcFlyby.left += pPos->x - m_MoveP.x;
m_rcFlyby.top += pPos->y - m_MoveP.y;
m_rcFlyby.right += pPos->x - m_MoveP.x;
m_rcFlyby.bottom += pPos->y - m_MoveP.y;
UINT flag = 0;
if(pPos->x != m_BeginP.x)
flag |= MOUSEMOVE_HOR;
if(pPos->y != m_BeginP.y)
flag |= MOUSEMOVE_VER;
if(GetFlybySide(flag))
{
RECT rc;
GetClientRect(m_pOwner->m_hWnd,&rc);
switch(m_nFlyState)
{
case CB_DOCK_TOP:
case CB_DOCK_BOTTOM:
{
m_rcFlyby.right = m_rcFlyby.left+rc.right-rc.left;
m_rcFlyby.bottom = m_rcFlyby.top + m_nHeight;
}
break;
case CB_DOCK_LEFT:
case CB_DOCK_RIGHT:
{
m_rcFlyby.bottom = m_rcFlyby.top + rc.bottom - rc.top;
m_rcFlyby.right = m_rcFlyby.left + m_nWidth;
}
break;
default:
{
if(IsRectEmpty(&m_rcOver))
{
m_rcFlyby.right = m_rcFlyby.left + 300;
m_rcFlyby.bottom = m_rcFlyby.top + 240;
}
else
{
m_rcFlyby.right = m_rcFlyby.left + m_rcOver.right - m_rcOver.left;
m_rcFlyby.bottom = m_rcFlyby.top + m_rcOver.bottom - m_rcOver.top;
}
}
break;
}
}
if(m_nFlyState != CB_DOCK_NON)
LineRect(GetDC(NULL),&m_rcFlyby);
else
DrawDragRect(GetDC(NULL),&m_rcFlyby);
m_MoveP.x = pPos->x;
m_MoveP.y = pPos->y;
}
////////////////////////////////////////////////////////////////////////////
void CFBCtrlBar::DrawSizeFlag()
{
RECT rc;
if(m_nSizeFlag == SIZEFLAG_WE)
{
rc.left = m_rcSizer.left + m_nSized;
rc.right = rc.left + 4;
rc.top = m_rcSizer.top;
rc.bottom = m_rcSizer.bottom;
}
else
{
rc.left = m_rcSizer.left;
rc.right = m_rcSizer.right;
rc.top = m_rcSizer.top + m_nSized;
rc.bottom = rc.top + 4;
}
ClientToScreen(m_hWnd,&rc);
DrawDragRect(GetDC(NULL),&rc,2);
}
////////////////////////////////////////////////////////////////////////////
BOOL CFBCtrlBar::GetFlybySide(UINT flag)
{
RECT rc;
POINT pos;
GetWindowRect(m_pOwner->m_hWnd,&rc);
GetCursorPos(&pos);
UINT FlyState = 0;
if(PtInRect(&rc,pos))
{
switch(flag)
{
case MOUSEMOVE_VER:
{
if((pos.y-rc.top)<m_nHeight)
FlyState = CB_DOCK_TOP;
if((rc.bottom-pos.y)<m_nHeight)
FlyState = CB_DOCK_BOTTOM;
}
break;
case MOUSEMOVE_HOR:
{
if((pos.x - rc.left)<m_nWidth)
FlyState = CB_DOCK_LEFT;
if((rc.right - pos.x)<m_nWidth)
FlyState = CB_DOCK_RIGHT;
}
break;
case MOUSEMOVE_ALL:
{
if((pos.y-rc.top)<m_nHeight)
{
if(((pos.x - rc.left)<m_nWidth) && ((pos.y-rc.top)>(pos.x - rc.left)))
FlyState = CB_DOCK_LEFT;
else if(((rc.right - pos.x)<m_nWidth) && ((pos.y-rc.top)>(rc.right - pos.x)))
FlyState = CB_DOCK_RIGHT;
else
FlyState = CB_DOCK_TOP;
}
else if((rc.bottom-pos.y)<m_nHeight)
{
if(((pos.x - rc.left)<m_nWidth) && ((rc.bottom-pos.y)>(pos.x - rc.left)))
FlyState = CB_DOCK_LEFT;
else if(((rc.right - pos.x)<m_nWidth) && ((rc.bottom-pos.y)>(rc.right - pos.x)))
FlyState = CB_DOCK_RIGHT;
else
FlyState = CB_DOCK_BOTTOM;
}
else
{
if((pos.x - rc.left)<m_nWidth)
FlyState = CB_DOCK_LEFT;
if((rc.right - pos.x)<m_nWidth)
FlyState = CB_DOCK_RIGHT;
}
}
break;
default:
FlyState = CB_DOCK_NON;
break;
}
}
if(m_nFlyState == FlyState)
return FALSE;
m_nFlyState = FlyState;
return TRUE;
}
////////////////////////////////////////////////////////////////////////////
//停靠状态改变,必须重新安排窗口位置
void CFBCtrlBar::DockStateChange(UINT state)
{
if(m_nDockState != state)
{
m_nPreState = m_nDockState;
if(m_nDockState == CB_DOCK_NON)
{
ModifyWndStyle(WS_POPUPWINDOW | WS_CAPTION,WS_CHILD);
SetParent(m_hWnd,m_pOwner->m_hWnd);
m_bDock = TRUE;
}
m_nDockState = state;
if(state == CB_DOCK_NON)
{
ModifyWndStyle(WS_CHILD,WS_POPUPWINDOW | WS_CAPTION);
SetParent(m_hWnd,NULL);
m_bDock = FALSE;
SetWindowPos(m_hWnd,HWND_TOPMOST,m_rcOver.left,
m_rcOver.top,
m_rcOver.right - m_rcOver.left,
m_rcOver.bottom - m_rcOver.top,
SWP_NOACTIVATE);
}
SendMessage(m_pOwner->m_hWnd,WM_SIZE,0,0);
}
else if(m_nDockState == CB_DOCK_NON)
{
RECT rc;
GetWindowRect(m_hWnd,&rc);
if(rc.left!=m_rcFlyby.left || rc.top!=m_rcFlyby.top)
SetWindowPos(m_hWnd,HWND_TOPMOST,m_rcOver.left,
m_rcOver.top,
m_rcOver.right - m_rcOver.left,
m_rcOver.bottom - m_rcOver.top,
SWP_NOACTIVATE);
}
}
////////////////////////////////////////////////////////////////////////////
LONG CFBCtrlBar::HitTest(LPPOINT pPos)
{
if(PtInRect(&m_rcGripper,*pPos))
return HITTEST_GRIPPER;
if(PtInRect(&m_rcSizer,*pPos))
return HITTEST_SIZER;
POINT p;
p.x = pPos->x;
p.y = pPos->y;
ClientToScreen(m_hWnd,&p);
if(SendMessage(m_hWnd,WM_NCHITTEST,0,MAKELPARAM(p.x,p.y)) == HTCAPTION)
return HITTEST_GRIPPER;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -