📄 fbctrlbar.cpp
字号:
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
文件: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 + -