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

📄 fbctrlbar.cpp

📁 在VC编程环境下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	文件:FBCtrlBar.cpp  类CFBCtrlBar的执行文件

	版权:Firebird Software Workroom

	声明:本源程序的版权受《中华人民共和国著作权法》以及其
		  它相关法律和条约的保护。任何有机会得到本源程序的
		  个人和机构,未经作者明确授权,不得将本源程序用于
		  任何商业目的(直接的或间接的)。对于非商业目的的使
		  用 (包括复制、传播、编译和修改), 原则上没有特别
		  的限制条款,但请在相关文档中说明其来源,并尊重原
		  作者的署名权。

	编写:秦传安(chings)	1999.12 - 2000.5

	联络:Tel:(0792)6323086	E_mail:chings@163.net
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

#include "fclstd.h"
#include "resource.h"
#include "FBCtrlBar.h"

//#######################################################################
//
//			class CFBCtrlBar
//
//#########################################################################
#define MOUSEMOVE_HOR		0x00000001
#define MOUSEMOVE_VER		0x00000002
#define MOUSEMOVE_ALL		0x00000003
//////////////////////////////////////////////////////////////////////
// 构造函数和析构函数
//////////////////////////////////////////////////////////////////////
CFBCtrlBar::CFBCtrlBar()
{
	m_bDock			= FALSE;
	m_bDown			= FALSE;
	m_nSizeFlag		= SIZEFLAG_NON;
	SetRectEmpty(&m_rcOver);
}

CFBCtrlBar::~CFBCtrlBar()
{
}
///////////////////////////////////////////////////////////////////////
//窗口过程
LRESULT CFBCtrlBar::WindowProc(UINT msg,WPARAM wParam,LPARAM lParam)
{
	LRESULT lResult = 0;

	switch(msg)
	{
	case WM_PAINT:
		{
			if(!GetUpdateRect(m_hWnd,NULL,FALSE))
				return 0;

			PAINTSTRUCT ps;
			BeginPaint(m_hWnd,&ps);
			OnPaint(ps.hdc,&ps.rcPaint);
			EndPaint(m_hWnd,&ps);
		}
		break;
	case WM_SIZE:
		OnSize();
		break;
	case WM_CLOSE:
		ShowWindow(m_hWnd,SW_HIDE);
		if(m_pOwner)
			lResult = SendMessage(m_pOwner->m_hWnd,FBWM_NOTIFY,MAKEWPARAM(GetWndID(),FB_CBN_CLOSE),0);
		break;
	case WM_COMMAND:
		if(m_pOwner)
			lResult = SendMessage(m_pOwner->m_hWnd,msg,wParam,lParam);
		break;
	case WM_NCLBUTTONDBLCLK://在标题栏双击时恢复上一次的停靠状态
		if(wParam != HTCAPTION)
			return CFBWnd::WindowProc(msg,wParam,lParam);
		DockStateChange(m_nPreState);
		break;
	case WM_LBUTTONDBLCLK:
		if(m_nStyle & CBS_FLYBY)
		{
			POINT pos;
			pos.x = LOWORD(lParam);
			pos.y = HIWORD(lParam);
			if(HitTest(&pos) == HITTEST_GRIPPER)
				DockStateChange(m_nPreState);
		}
		break;
	case WM_NCLBUTTONDOWN:
		if(wParam != HTCAPTION)
			return CFBWnd::WindowProc(msg,wParam,lParam);
		else
		{
			POINT pos;
			pos.x = LOWORD(lParam);
			pos.y = HIWORD(lParam);
			ScreenToClient(m_hWnd,&pos);
			OnLButtonDown(&pos,wParam);
		}
		break;
	case WM_LBUTTONDOWN:
		{
			POINT pos;
			pos.x = LOWORD(lParam);
			pos.y = HIWORD(lParam);
			OnLButtonDown(&pos,wParam);
		}
		break;
	case WM_LBUTTONUP:
		{
			POINT pos;
			pos.x = LOWORD(lParam);
			pos.y = HIWORD(lParam);
			OnLButtonUp(&pos,wParam);
		}
		break;
	case WM_MOUSEMOVE:
		{
			POINT pos;
			pos.x = LOWORD(lParam);
			pos.y = HIWORD(lParam);
			OnMouseMove(&pos,wParam);
		}
		break;
	case WM_MOUSEACTIVATE:
		SetActiveWindow(m_pOwner->m_hWnd);
		lResult = MA_NOACTIVATE;
		break;
	case WM_SETCURSOR:
		{
			POINT pos;
			GetCursorPos(&pos);
			ScreenToClient(m_hWnd,&pos);
			if((HitTest(&pos) == HITTEST_SIZER && m_nDockState) || 
				(m_nSizeFlag != SIZEFLAG_NON && m_bDown))
			{
				HCURSOR hcur;
				if(m_nDockState& (CB_DOCK_TOP|CB_DOCK_BOTTOM))
				{
					hcur = LoadCursor(GetInstance(),"SIZINGNS");
					m_nSizeFlag = SIZEFLAG_NS;
				}
				else
				{
					hcur = LoadCursor(GetInstance(),"SIZINGWE");
					m_nSizeFlag = SIZEFLAG_WE;
				}
				SetCursor(hcur);
			}
			else
			{
				lResult = CFBWnd::WindowProc(msg,wParam,lParam);
				m_nSizeFlag = SIZEFLAG_NON;
			}
		}
		break;
	case WM_NOTIFY:
		OnNotify((LPNMHDR)lParam,lResult);
		break;
	default:
		lResult = CFBWnd::WindowProc(msg,wParam,lParam);
		break;
	}

	return lResult;
}
/////////////////////////////////////////////////////////////////////////////
BOOL CFBCtrlBar::Create(LPSTR		lpszCaption,
						CFBWnd*		pParent,
						DWORD		style,
						int			width,
						int			height,
						UINT		uID)
{
	m_nWidth = width;
	m_nHeight = height;
	m_nStyle = style;

	DWORD dwStyle = WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
	return CFBWnd::Create(CLS_FBSTDWNDCLASS,
						  lpszCaption,
						  pParent->GetInstance(),
						  pParent,
						  dwStyle,
						  WS_EX_TOOLWINDOW,
						  (HMENU)uID);
}
//////////////////////////////////////////////////////////////////////////
void CFBCtrlBar::ReCalcLayout(LPRECT pRect)
{
	if(!m_bDock || !IsShow())return;

	RECT rc;
	CopyRect(&rc,pRect);

	switch(m_nDockState)
	{
	case CB_DOCK_TOP:
		rc.bottom = rc.top + m_nHeight;
		pRect->top += m_nHeight;
		break;
	case CB_DOCK_BOTTOM:
		rc.top = rc.bottom - m_nHeight;
		pRect->bottom -= m_nHeight;
		break;
	case CB_DOCK_LEFT:
		rc.right = rc.left + m_nWidth;
		pRect->left += m_nWidth;
		break;
	case CB_DOCK_RIGHT:
		rc.left = rc.right - m_nWidth;
		pRect->right -= m_nWidth;
		break;
	default:
		break;
	}

	if(m_nDockState != CB_DOCK_NON)
		SetWindowPos(m_hWnd,NULL,rc.left,rc.top,
			rc.right-rc.left,rc.bottom-rc.top,
			SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOCOPYBITS);
}
//////////////////////////////////////////////////////////////////////////
void CFBCtrlBar::OnSize()
{
	if((m_nStyle&CBS_FLYBY) && (m_nDockState == CB_DOCK_NON))
	{
		RECT rc;
		GetWindowRect(m_hWnd,&rc);
		CopyRect(&m_rcOver,&rc);
	}
}
///////////////////////////////////////////////////////////////////////////
void CFBCtrlBar::OnPaint(HDC hDC,LPRECT prcPaint)
{
	if(!m_bDock)return;

	RECT rc;
	GetClientRect(m_hWnd,&rc);

	UINT style = m_nStyle & CBS_BORDER_RECT;

	if(style)//画边框
	{
		if(style == CBS_BORDER_RECT)
			DrawEdge(GetDC(m_hWnd),&rc,EDGE_ETCHED,BF_RECT);
		else
		{
			if(style & CBS_BORDER_TOP)
				DrawEdge(GetDC(m_hWnd),&rc,EDGE_ETCHED,BF_TOP);
			if(style & CBS_BORDER_BOTTOM)
				DrawEdge(GetDC(m_hWnd),&rc,EDGE_ETCHED,BF_BOTTOM);
			if(style & CBS_BORDER_LEFT)
				DrawEdge(GetDC(m_hWnd),&rc,EDGE_ETCHED,BF_LEFT);
			if(style & CBS_BORDER_RIGHT)
				DrawEdge(GetDC(m_hWnd),&rc,EDGE_ETCHED,BF_RIGHT);
		}
	}
	if(m_nStyle & CBS_GRIPPER)//画把手
		DrawGripper(hDC,&rc);
}
////////////////////////////////////////////////////////////////////////
void CFBCtrlBar::Docking(UINT nDockState)
{
	m_bDock = TRUE;
	m_nDockState = nDockState;
	m_nPreState = nDockState;
}
////////////////////////////////////////////////////////////////////////////
//画把手
void CFBCtrlBar::DrawGripper(HDC hDC,LPRECT pRc)
{
	switch(m_nDockState)
	{
	case CB_DOCK_TOP:
	case CB_DOCK_BOTTOM:
		m_rcGripper.top = pRc->top + 2;
		m_rcGripper.bottom = pRc->bottom - 2;
		m_rcGripper.left = pRc->left + 4;
		m_rcGripper.right = m_rcGripper.left +8;
		pRc->top += 2;
		pRc->bottom -= 2;
		pRc->left += 4;
		pRc->right = pRc->left + 3;
		DrawEdge(hDC,pRc,BDR_RAISEDINNER,BF_RECT);
		pRc->left += 4;
		pRc->right += 4;
		DrawEdge(hDC,pRc,BDR_RAISEDINNER,BF_RECT);
		break;
	case CB_DOCK_LEFT:
	case CB_DOCK_RIGHT:
		m_rcGripper.left = pRc->left + 2;
		m_rcGripper.right = pRc->right - 2;
		m_rcGripper.top = pRc->top + 4;
		m_rcGripper.bottom = m_rcGripper.top +8;
		pRc->left += 2;
		pRc->right -= 2;
		pRc->top += 5;
		pRc->bottom = pRc->top + 3;
		DrawEdge(hDC,pRc,BDR_RAISEDINNER,BF_RECT);
		pRc->top += 4;
		pRc->bottom += 4;
		DrawEdge(hDC,pRc,BDR_RAISEDINNER,BF_RECT);
		break;
	}
}
////////////////////////////////////////////////////////////////////////////
void CFBCtrlBar::OnNotify(LPNMHDR pNMHDR,LRESULT& lResult)
{
	if(pNMHDR->hwndFrom != m_hWnd)
		SendMessage(pNMHDR->hwndFrom,WM_NOTIFY,(WPARAM)pNMHDR->idFrom,(LPARAM)pNMHDR);
}
////////////////////////////////////////////////////////////////////////////
void CFBCtrlBar::OnLButtonDown(LPPOINT pPos,UINT key)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -