?? dockingwindow.h
字號:
{
assert(!IsDocking());
m_hBarOwner=hBar;
}
void OnUndocked(HDOCKBAR /*hBar*/)
{
assert(IsDocking());
m_hBarOwner=HNONDOCKBAR;
}
////////////////messages handlers/////////////////////////////////
BEGIN_MSG_MAP(thisClass)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
MESSAGE_HANDLER(WM_CLOSE, OnClose)
MESSAGE_HANDLER(WM_NCLBUTTONDOWN,OnNcLButtonDown)
MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, OnWindowPosChanged)
MESSAGE_HANDLER(WMDF_NDOCKSTATECHANGED,OnDockStateChanged)
MESSAGE_HANDLER(WM_MENUCHAR,OnMenuChar)
END_MSG_MAP()
LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
return 1;
}
LRESULT OnWindowPosChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
{
LPWINDOWPOS pWPos=reinterpret_cast<LPWINDOWPOS>(lParam);
if(
(pWPos->flags&SWP_SHOWWINDOW
|| ((pWPos->flags&(SWP_NOSIZE | SWP_NOMOVE))!=(SWP_NOSIZE | SWP_NOMOVE)))
&& !IsDocking()
&& IsWindowVisible()
/*&& !(pWPos->flags&SWP_HIDEWINDOW)*/)
{
m_rcUndock.left=pWPos->x;
m_rcUndock.top=pWPos->y;
m_rcUndock.right=m_rcUndock.left+pWPos->cx;
m_rcUndock.bottom=m_rcUndock.top+pWPos->cy;
}
bHandled = FALSE;
return 0;
}
LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM/* lParam*/, BOOL& bHandled)
{
T* pThis=reinterpret_cast<T*>(this);
bHandled=!pThis->OnClosing();
return !bHandled;
}
LRESULT OnNcLButtonDown(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
bHandled=(wParam==HTCAPTION);
if(bHandled)
{
SetWindowPos(HWND_TOP,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE );
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
if(::DragDetect(m_hWnd,pt))
{
T* pThis=static_cast<T*>(this);
pThis->ScreenToClient(&pt);
pThis->BeginMoving(pt);
}
}
return 0;
}
LRESULT OnDockStateChanged(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
T* pThis=static_cast<T*>(this);
if(wParam!=FALSE)
pThis->OnDocked(reinterpret_cast<HDOCKBAR>(lParam),(DOCKED2HORIZONTAL(wParam)==TRUE));
else
pThis->OnUndocked(reinterpret_cast<HDOCKBAR>(lParam));
return TRUE;
}
LRESULT OnMenuChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
LRESULT lRes = DefWindowProc(uMsg, wParam, lParam);
if( HIWORD(lRes) == MNC_IGNORE ) {
return ::SendMessage(this->GetTopLevelParent(), uMsg, wParam, lParam);
}
return lRes;
}
protected:
CDocker m_docker;
HDOCKBAR m_hBarOwner;
CRect m_rcUndock;
};
template<class T>
class CDockingWindowPlacement : public DFDOCKPOS
{
public:
CDockingWindowPlacement(T& dw)
:DFDOCKPOS(0),m_dw(dw)
{
hdr.hBar=HNONDOCKBAR;
}
bool IsVisible() const
{
assert(::IsWindow(dw.m_hWnd));
return (m_dw.IsWindowVisible()!=FALSE);
}
bool IsDocking() const
{
assert(::IsWindow(dw.m_hWnd));
return m_dw.IsDocking();
}
bool Hide()
{
assert(::IsWindow(dw.m_hWnd));
bool bRes=true;
if(m_dw.IsDocking())
{
bRes=m_dw.GetDockingPosition(this);
assert(bRes);
if(bRes)
bRes=m_dw.Undock();
assert(bRes);
}
else
hdr.hBar=HNONDOCKBAR;
return (bRes && m_dw.ShowWindow(SW_HIDE));
}
bool Show()
{
assert(::IsWindow(dw.m_hWnd));
bool bRes=true;
if(hdr.hBar!=HNONDOCKBAR)
bRes=m_dw.SetDockingPosition(this);
else
m_dw.ShowWindow(SW_SHOW);
assert(bRes);
return bRes;
}
CDockingWindowPlacement& operator = (const DFDOCKPOS& pos)
{
dwDockSide=pos.dwDockSide;
nBar=pos.nBar;
fPctPos=pos.fPctPos;
nWidth=pos.nWidth;
nHeight=pos.nHeight;
return *this;
}
protected:
T& m_dw;
};
class CCaptionBase : public COrientedRect
{
typedef COrientedRect baseClass;
public:
struct CButton: CRect
{
virtual void CalculateRect(CRect& rc,bool bHorizontal)=0;
virtual void Draw (CDC& dc)=0;
virtual void Press(HWND /*hWnd*/){};
virtual void Release(HWND /*hWnd*/){};
virtual void Hot(HWND /*hWnd*/){}
};
class CBtnClickTracker : public CDDTrackerBaseT<CBtnClickTracker>
{
public:
CBtnClickTracker(HWND hWnd,CButton& btn)
:m_hWnd(hWnd),m_btn(btn)
{
}
void BeginDrag()
{
m_btn.Press(m_hWnd);
}
void EndDrag(bool /*bCanceled*/)
{
m_btn.Release(m_hWnd);
}
protected:
HWND m_hWnd;
CButton& m_btn;
};
protected:
template<class T>
class CHotBtnTracker : public CDDTrackerBaseT<CHotBtnTracker<T> >
{
public:
CHotBtnTracker(CButton& btn,T& owner,HWND hWnd,int nHotHitTest)
:m_btn(btn),m_owner(owner),m_hWnd(hWnd),m_nHotHitTest(nHotHitTest),m_bDoAction(false)
{
CRect rc;
::GetClientRect(m_hWnd,&rc);
m_offset.x=rc.left;
m_offset.y=rc.top;
::ClientToScreen(m_hWnd,&m_offset);
::GetWindowRect(hWnd,&rc);
m_offset.x-=rc.left;
m_offset.y-=rc.top;
}
void BeginDrag()
{
m_btn.Hot(m_hWnd);
}
void EndDrag(bool /*bCanceled*/)
{
m_btn.Release(m_hWnd);
}
void OnDropLeftButton(long x, long y)
{
CPoint pt(x+m_offset.x,y+m_offset.y);
m_bDoAction=(m_owner.HitTest(pt)==m_nHotHitTest);
}
void OnMove(long x, long y)
{
CPoint pt(x+m_offset.x,y+m_offset.y);
if(m_owner.HitTest(pt)!=m_nHotHitTest)
::ReleaseCapture();
}
bool ProcessWindowMessage(MSG* pMsg)
{
bool bRes=false;
bRes=(pMsg->message==WM_LBUTTONDOWN);
if(bRes)
m_btn.Press(m_hWnd);
return bRes;
}
operator bool () const
{
return m_bDoAction;
}
protected:
bool m_bDoAction;
CPoint m_offset;
T& m_owner;
CButton& m_btn;
HWND m_hWnd;
int m_nHotHitTest;
};
public:
CCaptionBase(bool bHorizontal=true)
:COrientedRect(bHorizontal,::GetSystemMetrics(SM_CYSMCAPTION))
{
}
CCaptionBase(unsigned long thickness,bool bHorizontal=true)
:COrientedRect(bHorizontal,thickness)
{
}
bool CalculateRect(CRect& rc,bool bTop)
{
return baseClass::CalculateRect(rc,bTop);
}
LRESULT HitTest(const CPoint& /*pt*/) const
{
return HTNOWHERE;
}
void Draw(HWND /*hWnd*/,CDC& dc)
{
dc.FillRect(this,(HBRUSH)LongToPtr(COLOR_3DFACE + 1));
}
bool OnAction(HWND hWnd,unsigned int nHitTest)
{
return HotTrack(hWnd,nHitTest);
}
bool HotTrack(HWND /*hWnd*/,unsigned int /*nHitTest*/)
{
return false;
}
void UpdateMetrics()
{
// Override in derived class if it depends on system metrics
}
};
template <class TCaption,DWORD t_dwStyle = 0, DWORD t_dwExStyle = 0>
struct CDockingWindowTraits : CDockingBarWinTraits<t_dwStyle,t_dwExStyle>
{
typedef TCaption CCaption;
};
typedef CDockingWindowTraits<CCaptionBase,WS_OVERLAPPEDWINDOW | WS_POPUP/* WS_CHILD*/ | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,WS_EX_TOOLWINDOW/* WS_EX_CLIENTEDGE*/> CEmptyTitleDockingWindowTraits;
template <class T,
class TBase = CWindow,
class TDockingWinTraits = CEmptyTitleDockingWindowTraits>
class ATL_NO_VTABLE CTitleDockingWindowBaseImpl :
public CDockingWindowBaseImpl< T, TBase, TDockingWinTraits >
{
typedef CDockingWindowBaseImpl< T, TBase, TDockingWinTraits > baseClass;
typedef CTitleDockingWindowBaseImpl< T, TBase, TDockingWinTraits > thisClass;
protected:
typedef typename TDockingWinTraits::CCaption CCaption;
public:
LRESULT NcHitTest(const CPoint& pt)
{
LRESULT lRes=m_caption.HitTest(pt);
if(lRes==HTNOWHERE)
lRes=HTCLIENT;
else
{
if(GetCapture()==NULL)
m_caption.HotTrack(m_hWnd,lRes);
}
return lRes;
}
void GetMinMaxInfo(LPMINMAXINFO pMinMaxInfo) const
{
long width=m_caption.GetThickness();
if(pMinMaxInfo->ptMinTrackSize.y<width)
pMinMaxInfo->ptMinTrackSize.y=width;
if(pMinMaxInfo->ptMinTrackSize.x<width)
pMinMaxInfo->ptMinTrackSize.x=width;
}
void NcCalcSize(CRect* pRc)
{
DWORD style = GetWindowLong(GWL_STYLE);
if((style&WS_CAPTION)==0)
m_caption.SetRectEmpty();
else
m_caption.CalculateRect(*pRc,true);
}
void NcDraw(CDC& dc)
{
DWORD style = GetWindowLong(GWL_STYLE);
if((style&WS_CAPTION)!=0)
m_caption.Draw(m_hWnd,dc);
}
void OnDocked(HDOCKBAR hBar,bool bHorizontal)
{
m_caption.SetOrientation(!bHorizontal);
baseClass::OnDocked(hBar,bHorizontal);
}
void OnUndocked(HDOCKBAR hBar)
{
m_caption.SetOrientation(true);
baseClass::OnUndocked(hBar);
}
bool CloseBtnPress()
{
PostMessage(WM_CLOSE);
return false;
}
#ifdef DF_AUTO_HIDE_FEATURES
bool PinUp(const CDockingSide& side)
{
CRect rc;
GetWindowRect(&rc);
T* pThis=static_cast<T*>(this);
assert(rc.Width()>0);
assert(rc.Height()>0);
return pThis->PinUp(side,(side.IsHorizontal() ? rc.Width() : rc.Height()));
}
bool PinUp(const CDockingSide& side,unsigned long width,bool bVisualize=false)
{
if(IsDocking())
Undock();
DFPINUP pinHdr;
pinHdr.hdr.hWnd=m_hWnd;
pinHdr.hdr.hBar=GetOwnerDockingBar();
// pinHdr.hdr.code=DC_PINUP;
pinHdr.dwDockSide=side;
pinHdr.nWidth=width;
pinHdr.dwFlags= bVisualize ? DFPU_VISUALIZE : 0 ;
pinHdr.n=0;
return m_docker.PinUp(&pinHdr);
}
bool PinBtnPress(bool bVisualize=true)
{
assert(IsDocking());
DFDOCKPOS dockHdr={0};
// dockHdr.hdr.code=DC_GETDOCKPOSITION;
dockHdr.hdr.hWnd=m_hWnd;
dockHdr.hdr.hBar=GetOwnerDockingBar();
bool bRes=GetDockingPosition(&dockHdr);
if(bRes)
{
bRes=Undock();
if(bRes)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -