C:\home\SVGCats_src\src\rect.h
1|/*********************************************************************** 2| 1. <<< 矩形 (Rect) >>> 3|************************************************************************/ 4| 5|#ifndef __RECT_H 6|#define __RECT_H 7| 8| 9|/**************************************************************** 10| 2. <<< モジュール・プロパティ >>> 11|*****************************************************************/ 12|/*---------------------------------------------------------------------- 13|[Module Property] 14|name = Rect 15|title = 矩形 16|category = 基本型 17|src = rect.c 18|depend = 19|priority = 20|accord = 21|----------------------------------------------------------------------*/ 22| 23| 24|/**************************************************************** 25| 3. <<< 優先ヘッダ >>> 26|*****************************************************************/ 27|#ifndef USES_PRIORITY_HEADER 28|/*[START_OF_PRIORITY_HEADER]*/ 29| 30|#ifndef USES_RECT 31|#define USES_RECT 32|typedef struct _Rect Rect; 33|typedef struct _Rect_2XY Rect_2XY; 34|typedef struct _Rect_Ex Rect_Ex; 35| 36|/*#define RECT_USES_WINDOWS_DC*/ /* DC へ描画するルーチンを使う */ 37| 38|#endif 39| 40|/*[END_OF_PRIORITY_HEADER]*/ 41|#endif /* USES_PRIORITY_HEADER */ 42| 43| 44| 45|/*-----------------------------------------------------------------*/ 46|/* 4. <<< Interface Area ---------------------------------------- >>> */ 47|/*-----------------------------------------------------------------*/ 48| 49|#ifdef __cplusplus 50|extern "C" { 51|#endif 52| 53|/*********************************************************************** 54| 5. <<< [Rect] 矩形(幅・高さ指定) >>> 55|************************************************************************/ 56|struct _Rect { 57| int x, y; /* 左上(x,yの最小値)の座標 */ 58| int w, h; /* 幅と高さ */ 59|}; 60| 61|void Rect_init( Rect*, int x, int y, int w, int h ); 62|void Rect_init_by2XY( Rect*, int x1, int y1, int x2, int y2 ); 63|void Rect_copy( Rect*, Rect* ); 64|bool Rect_isEqual( Rect*, Rect* ); 65|void Rect_toAnd( Rect* ans, Rect* a, Rect* b ); 66|bool Rect_isPointIn( Rect* rect, int x, int y ); 67|int Rect_getPointPos( Rect* rect, int x, int y ); 68|#ifndef ERRORS_CUT_DEBUG_TOOL 69| void Rect_print( Rect*, const char* title ); 70|#endif 71| 72|#define Rect_nHandle 8 73|int Rect_getHitHandleNum( Rect*, int x, int y, int zoom, int* dx, int* dy, int* arrow ); 74|void Rect_moveByHandle( Rect*, int iHandle, int x, int y, bool bShift ); 75|void Rect_getCenterOfHandle( Rect*, int iHandle, int* x, int* y ); 76| 77| 78|/*********************************************************************** 79| 6. <<< [Rect_2XY] 矩形(2点指定)>>> 80|************************************************************************/ 81|struct _Rect_2XY { 82| int x1, y1; /* ある頂点の座標 */ 83| int x2, y2; /* x1,y1 と対角線上の頂点の座標 */ 84|}; 85| 86|void Rect_2XY_init( Rect_2XY*, int x1, int y1, int x2, int y2 ); 87|void Rect_2XY_copy( Rect_2XY* dst, Rect_2XY* src ); 88|void Rect_2XY_moveTo( Rect_2XY* m, int x, int y ); 89|void Rect_2XY_setInDesktop( Rect_2XY* wnd, Rect_2XY* desktop ); 90| 91| 92| 93|/*********************************************************************** 94| 7. <<< [RECT_X_LT] 矩形と点の位置関係 >>> 95|【補足】 96|・それぞれの座標が矩形領域に対して次の5つの領域に分けます。 97| LT = Less Than(<), LE = Less Equal(<=), E = In(Equal) 98| GT = Greater Than(<), GE = Greater Equal(<=) 99|・端を含む領域を判定する場合、次のようにします。 100| ret = getRelation(); 101| if ( ( ret & (RECT_X_LE | RECT_X_E | RECT_X_GE) ) && 102| ( ret & (RECT_Y_LE | RECT_Y_E | RECT_Y_GE) ) ) ... 103|************************************************************************/ 104|#define RECT_X 0x01F /* X 座標に関するマスク */ 105|#define RECT_X_LT 0x001 /* X が矩形領域の左外 */ 106|#define RECT_X_LE 0x002 /* X が左端 */ 107|#define RECT_X_E 0x004 /* X が中 */ 108|#define RECT_X_GE 0x008 /* X が右端 */ 109|#define RECT_X_GT 0x010 /* X が右外 */ 110| 111|#define RECT_Y 0x3E0 /* Y 座標に関するマスク */ 112|#define RECT_Y_LT 0x020 /* Y が上外 */ 113|#define RECT_Y_LE 0x040 /* Y が上端 */ 114|#define RECT_Y_E 0x080 /* Y が中 */ 115|#define RECT_Y_GE 0x100 /* Y が下端 */ 116|#define RECT_Y_GT 0x200 /* Y が下外 */ 117| 118| 119|#ifdef __cplusplus 120|} 121|#endif 122| 123|/*-----------------------------------------------------------------*/ 124|/* 8. <<< Mapping Area ------------------------------------------ >>> */ 125|/*-----------------------------------------------------------------*/ 126| 127| 128|/*********************************************************************** 129| 9. <<< [Rect_init_by2XY] 2点指定で初期化する >>> 130|************************************************************************/ 131|#define Rect_init_by2XY( this, _x1, _y1, _x2, _y2 ) \ 132| ( (this)->x = (_x1), \ 133| (this)->w = (_x2)-(_x1)+1, \ 134| (this)->y = (_y1), \ 135| (this)->h = (_y2)-(_y1)+1 ) 136| 137| 138|/*********************************************************************** 139| 10. <<< [Rect_copy] コピーする >>> 140|************************************************************************/ 141|#define Rect_copy( ra, rb ) *(ra) = *(rb) 142| 143| 144|/*********************************************************************** 145| 11. <<< [Rect_setSize] 矩形のサイズを変更する >>> 146|【補足】 147|・左上端は固定です。 148|************************************************************************/ 149|#define Rect_setSize( this, _w, _h ) \ 150| ( (this)->w = (_w), (this)->h = (_h) ) 151| 152| 153|/*********************************************************************** 154| 12. <<< [Rect_2XY_init] 初期化する >>> 155|************************************************************************/ 156|#define Rect_2XY_init( this, _x1, _y1, _x2, _y2 ) \ 157| ( (this)->x1 = (_x1), (this)->x2 = (_x2), (this)->y1 = (_y1), (this)->y2 = (_y2) ) 158| 159| 160|/*********************************************************************** 161| 13. <<< [Rect_2XY_copy] コピーする >>> 162|************************************************************************/ 163|#define Rect_2XY_copy( ra, rb ) *(ra) = *(rb) 164| 165| 166|/*********************************************************************** 167| 14. <<< [Rect_2XY_moveTo] 移動する >>> 168|【引数】 169| ・Rect_2XY* m; ウィンドウの位置(入出力) 170| ・int x,y; 移動先となるウィンドウ左上の座標 171|【補足】 172|・以下のように使います。 173| GetDesktopWindow()->GetWindowRect( &desktop ); 174| GetWindowRect( &rect ); 175| Rect_2XY_moveTo( (Rect_2XY*)&rect, m_domain->wnd_x, m_domain->wnd_y ); 176| Rect_2XY_setInDesktop( (Rect_2XY*)&rect, (Rect_2XY*)&desktop ); 177| MoveWindow( &rect ); 178|************************************************************************/ 179|#define Rect_2XY_moveTo( m, x, y ) \ 180| ( ((m)->x2 -= (m)->x1 - x), ((m)->x1 = x), \ 181| ((m)->y2 -= (m)->y1 - y), ((m)->y1 = y) ) 182| 183| 184| 185|#endif 186| 187|