rect.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:8k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: rect.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 19:56:42  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_FL___RECT__HPP
  10. #define GUI_WIDGETS_FL___RECT__HPP
  11. /*  $Id: rect.hpp,v 1000.0 2004/06/01 19:56:42 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Andrey Yazhuk
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. /** @addtogroup GUI_FltkWidgets
  42.  *
  43.  * @{
  44.  */
  45. BEGIN_NCBI_SCOPE
  46. class CPoint
  47. {
  48. public:
  49.     CPoint() 
  50.         : m_X(0), m_Y(0) {}
  51.     CPoint(int x, int y)
  52.         : m_X(x), m_Y(y) {}
  53.     int X()   const   { return m_X; }
  54.     int Y()   const   { return m_Y; }
  55.     inline CPoint&     operator+=(const CPoint& pt)
  56.     {
  57.         m_X += pt.m_X;
  58.         m_Y += pt.m_Y;
  59.         return *this;
  60.     }
  61. public:
  62.     int m_X;
  63.     int m_Y;
  64. };
  65. /// CRect represent a rectangle int screen coordinate system (origin in the top 
  66. /// left corner).
  67. class CRect
  68. {
  69. public:
  70.     CRect() 
  71.     : m_Left(0), m_Top(0), m_Right(0), m_Bottom(0)  
  72.     {
  73.     }
  74.     CRect(int x, int y) 
  75.     : m_Left(x), m_Top(y), m_Right(x), m_Bottom(y)  
  76.     {
  77.     }
  78.     CRect(int left, int top, int right, int bottom)
  79.     : m_Left(left), m_Top(top), m_Bottom(bottom), m_Right(right)
  80.     {
  81.     }
  82.     void  Init();
  83.     void  Init(int x, int y);
  84.     void  Init(int left, int top, int right, int bottom);
  85.     inline  int Left()   const;
  86.     inline  int Top()   const;
  87.     inline  int Right()   const;    
  88.     inline  int Bottom()   const;
  89.     inline  int Width()     const;
  90.     inline  int Height()    const;
  91.     inline  CPoint  CenterPoint() const;
  92.     inline  void    SetLeft(int left);
  93.     inline  void    SetBottom(int bottom);
  94.     inline  void    SetRight(int right);
  95.     inline  void    SetTop(int top);
  96.     inline  void    SetHorz(int left, int right);
  97.     inline  void    SetVert(int bottom, int top);
  98.     inline  void    SetSize(int width, int height);
  99.     
  100.     inline  void    MoveLeft(int shift);
  101.     inline  void    MoveRight(int shift);
  102.     inline  void    MoveBottom(int shift);
  103.     inline  void    MoveTop(int shift);
  104.     inline  bool    operator==(const CRect& rc) const;
  105.     inline  bool    operator!=(const CRect& rc) const;
  106.     
  107.     inline  bool    IsEmpty()   const;
  108.     
  109.     inline  bool    PtInRect(int x, int )  const;
  110.     bool    PtInRect(const CPoint& pt)  const;    
  111.     bool    Intersects(const CRect& rc) const;
  112.     
  113.     // operations
  114.     inline void     Inflate(int d_x, int d_y);
  115.     inline void     Offset(int d_x, int d_y);
  116.     inline CRect&   IntersectWith(const CRect& r);
  117.     inline CRect&   CombineWith(const CRect& r);
  118. public:        
  119.     int m_Left;
  120.     int m_Top;
  121.     int m_Right;
  122.     int m_Bottom;
  123. };
  124. inline void    CRect::Init() 
  125.     m_Left = m_Top = m_Right = m_Bottom = 0;  
  126. }
  127. inline void    CRect::Init(int x, int y)
  128. {
  129.     m_Left = m_Right = x;
  130.     m_Bottom = m_Top = y;
  131. }
  132. inline void    CRect::Init(int left, int top, int right, int bottom)
  133. {
  134.     m_Left = left;
  135.     m_Top = top;        
  136.     m_Right = right;
  137.     m_Bottom = bottom;
  138. }
  139. inline int   CRect::Left()   const   {   return m_Left;  }
  140. inline int   CRect::Top()    const   {   return m_Top;  }
  141. inline int   CRect::Right()  const   {   return m_Right;  }
  142. inline int   CRect::Bottom() const   {   return m_Bottom;  }
  143. inline int  CRect::Width() const
  144. {   
  145.     return m_Right - m_Left + 1;    
  146. }  
  147. inline int   CRect::Height() const
  148. {
  149.     return m_Bottom - m_Top + 1;    
  150. }
  151. inline CPoint     CRect::CenterPoint() const
  152. {
  153.     return CPoint((m_Left + m_Right) / 2, (m_Top + m_Bottom) / 2);
  154. }
  155. inline void    CRect::SetLeft(int left)      {   m_Left = left;  }
  156. inline void    CRect::SetBottom(int bottom)  {   m_Bottom = bottom;  }
  157. inline void    CRect::SetRight(int right)    {   m_Right = right;  }
  158. inline void    CRect::SetTop(int top)        {   m_Top = top;  }
  159. inline void    CRect::SetHorz(int left, int right)
  160. {
  161.     m_Left = left;
  162.     m_Right = right;
  163. }
  164. inline void    CRect::SetVert(int bottom, int top)
  165. {
  166.     m_Bottom = bottom;
  167.     m_Top = top;
  168. }
  169. inline void   CRect::SetSize(int width, int height)
  170. {
  171.     m_Right = m_Left + width - 1;
  172.     m_Top = m_Bottom + height - 1;
  173. }
  174. inline void   CRect::MoveLeft(int shift)    {   m_Left += shift;    }
  175. inline void   CRect::MoveRight(int shift)   {   m_Right += shift;    }
  176. inline void   CRect::MoveBottom(int shift)  {   m_Bottom += shift;    }
  177. inline void   CRect::MoveTop(int shift)     {   m_Top += shift;    }
  178. inline bool    CRect::operator==(const CRect& rc) const
  179. {
  180.     return m_Left == rc.m_Left && m_Right == rc.m_Right 
  181.             && m_Bottom == rc.m_Bottom  &&  m_Top == rc.m_Top;
  182. }
  183. inline bool    CRect::operator!=(const CRect& rc) const
  184. {
  185.     return ! (*this == rc);
  186. }
  187. inline bool    CRect::IsEmpty()   const
  188. {
  189.     return (m_Left == m_Right) || (m_Bottom == m_Top);
  190. }
  191. inline bool    CRect::PtInRect(int X, int Y)  const
  192. {
  193.     return (X >= m_Left  &&  X<=m_Right)  &&  (Y >= m_Bottom  && Y <= m_Top);
  194. }
  195. inline bool    CRect::PtInRect(const CPoint& pt)  const
  196. {
  197.     return (pt.X() >= m_Left  &&  pt.X() <= m_Right)
  198.             &&  (pt.Y() >= m_Bottom  && pt.Y() <= m_Top);
  199. }
  200. inline bool    CRect::Intersects(const CRect& R) const
  201. {
  202.     return ! ( (R.m_Bottom > m_Top) || (R.m_Top < m_Bottom) 
  203.                || (R.m_Left > m_Right) || (R.m_Right < m_Left) );
  204. }
  205. inline void     CRect::Inflate(int d_x, int d_y)
  206. {
  207.     m_Left -= d_x;
  208.     m_Right += d_x;
  209.     m_Bottom -= d_y;
  210.     m_Top += d_y;        
  211. }
  212. inline void    CRect::Offset(int d_x, int d_y)
  213. {
  214.     m_Left += d_x;
  215.     m_Right += d_x;
  216.     m_Bottom += d_y;
  217.     m_Top += d_y;        
  218. }
  219. inline CRect&    CRect::IntersectWith(const CRect& r)
  220. {
  221.     m_Left = max(m_Left, r.m_Left);
  222.     m_Right = min(m_Right, r.m_Right);
  223.     m_Bottom = max(m_Bottom, r.m_Bottom);
  224.     m_Top = min(m_Top, r.m_Top);
  225.     
  226.     // correcting Right and Top if intersection is empty
  227.     m_Right = max(m_Right, m_Left);
  228.     m_Top = max(m_Top, m_Bottom);
  229.     return *this;
  230. }
  231. inline CRect&    CRect::CombineWith(const CRect& r)
  232. {
  233.     m_Left = min(m_Left, r.m_Left);
  234.     m_Right = max(m_Right, r.m_Right);
  235.     m_Bottom = min(m_Bottom, r.m_Bottom);
  236.     m_Top = max(m_Top, r.m_Top);
  237.     return *this;
  238. }
  239. END_NCBI_SCOPE
  240. /* @} */
  241. /*
  242.  * ===========================================================================
  243.  * $Log: rect.hpp,v $
  244.  * Revision 1000.0  2004/06/01 19:56:42  gouriano
  245.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  246.  *
  247.  * Revision 1.4  2004/05/13 17:25:34  yazhuk
  248.  * Addressed GCC warning
  249.  *
  250.  * Revision 1.3  2004/05/11 18:55:14  dicuccio
  251.  * Added doxygen modules info
  252.  *
  253.  * Revision 1.2  2004/05/03 20:02:54  rsmith
  254.  * took out CRect:: qualifiers inside CRect definition.
  255.  *
  256.  * Revision 1.1  2004/04/22 16:53:18  yazhuk
  257.  * Initial revision: menu_window.hpp
  258.  *
  259.  * ===========================================================================
  260.  */
  261. #endif  // GUI_WIDGETS_FL___RECT__HPP