⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fbctrlbar.cpp

📁 在VC编程环境下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	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 + -