struct SNAPINFO { enum { MAXDELTA = (1<<30) }; DWORD snapWidth; RECT rold; RECT rnew; RECT rdelta; RECT rout; void Init(RECT const & oldRect, RECT const & newRect, DWORD snapwidth); void Init(RECT const & r, DWORD snapWidth, bool moveOnly = false); void SnapHLine(long y); // snap to a horizontal line void SnapVLine(long x); // snap to a vertical line RECT & EndSnap(); // final coords in rout }; class CMDISnapper { public: protected: DWORD m_snapWidth; // helper for "move" coordinates CWnd * m_wndMoving; POINT m_mouseStart; POINT m_rectStart; public: CMDISnapper(DWORD snapWidth = 8); virtual ~CMDISnapper(); void SetSnapWidth(DWORD snapWidth); DWORD GetSnapWidth() const { return m_snapWidth; } LRESULT OnMessage(CWnd * wnd, UINT msg, WPARAM wp, LPARAM lp); void Sizing(CWnd * wnd, RECT & rnew); void OnEnterSizeMove(CWnd * wnd); void OnExitSizeMove(); void OnSizing(CWnd * wnd, WPARAM edge, LPRECT newrect); void OnMoving(CWnd * wnd, WPARAM edge, LPRECT newrect); };