Patch level : 2.1 nopatch

Files correlati     : agalib.lib
Ricompilazione Demo : [ ]
Commento            :

Aggiunta classe TRectangle (TPoint esisteva gia') per gestire
rettangoli logici ed operazioni con punti logici


git-svn-id: svn://10.65.10.50/trunk@11919 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2004-03-26 14:52:28 +00:00
parent 0d1caf6829
commit aa56dda073
2 changed files with 141 additions and 14 deletions

View File

@ -11,6 +11,79 @@
#include <window.h>
#include <xvtility.h>
///////////////////////////////////////////////////////////
// TRectangle
///////////////////////////////////////////////////////////
void TRectangle::copy(const TRectangle& r)
{
x = r.x; y = r.y;
_size = r._size;
}
void TRectangle::normalize()
{
if (_size.x < 0)
{
x += _size.x;
_size.x = -_size.x;
}
if (_size.y < 0)
{
y += _size.y;
_size.y = -_size.y;
}
}
void TRectangle::set(long cx, long cy, long dx, long dy)
{
x = cx; y = cy;
_size.set(dx, dy);
normalize();
}
void TRectangle::set(const TPoint& pt, const TPoint& sz)
{
set(pt.x, pt.y, sz.x, sz.y);
}
void TRectangle::set_bounds(long left, long top, long right, long bottom)
{
set(left, top, right-left, bottom-top);
}
bool TRectangle::contains(const TPoint& p) const
{
if (p.x < left()) return false;
if (p.y < top()) return false;
if (p.x > right()) return false;
if (p.y > bottom()) return false;
return true;
}
bool TRectangle::intersects(const TRectangle& r) const
{
if (left() > r.right()) return false;
if (right() < r.left()) return false;
if (top() > r.bottom()) return false;
if (bottom() < r.top()) return false;
return true;
}
void TRectangle::merge(const TRectangle& rct)
{
long l = x, t = y, r = right(), b = bottom();
if (rct.x < l) l = rct.x;
if (rct.y < t) t = rct.y;
if (rct.right() > r) r = rct.right();
if (rct.bottom() > b) b = rct.bottom();
set_bounds(l, t, r, b);
}
///////////////////////////////////////////////////////////
// Utilities
///////////////////////////////////////////////////////////
HIDDEN MENU_ITEM* find_menu_item(MENU_ITEM* menu, MENU_TAG id, bool ismbar)
{
MENU_ITEM* fnd = NULL;
@ -761,9 +834,7 @@ int TWindow::char2pixel(int len) const
PNT TWindow::log2dev(long x, long y) const
{
PNT pnt;
pnt.h = (int)x;
pnt.v = (int)y;
PNT pnt = { short(y), short(x) };
if (!_pixmap)
{
pnt.h = char2pixel(pnt.h);
@ -783,6 +854,23 @@ TPoint TWindow::dev2log(const PNT& p) const
return pnt;
}
void TWindow::log2dev(const TRectangle& lrct, RCT& drct) const
{
const PNT dp0 = log2dev(lrct.x, lrct.y);
const PNT dp1 = log2dev(lrct.right(), lrct.bottom());
drct.left = dp0.h; drct.top = dp0.v;
drct.right = dp1.h; drct.bottom = dp1.v;
}
void TWindow::dev2log(const RCT& rctd, TRectangle& rctl) const
{
const PNT dp0 = { rctd.top, rctd.left };
const PNT dp1 = { rctd.bottom, rctd.right };
const TPoint lp0 = dev2log(dp0);
const TPoint lp1 = dev2log(dp1);
rctl.set_bounds(lp0.x, lp0.y, lp1.x, lp1.y);
}
void TWindow::stringat(short x, short y, const char* str)
{
PNT pnt = log2dev(x,y);

View File

@ -20,28 +20,28 @@ WINDOW cur_win();
// @author:(INTERNAL) Guido
struct TPoint
{
// @cmember Coordinata x del punto
long x;
// @cmember Coordinata y del punto
long y;
// @cmember Coordinate del punto
long x,y;
// @cmember Costruttore
TPoint(long sx = 0, long sy = 0) : x(sx), y(sy)
{}
// @cmember Costruttore (occorre passare il punto)
TPoint(const PNT& pnt)
{ set(pnt); }
// @cmember Setta le coordinate x e y del punto
void set(long sx, long sy)
{ x = sx; y = sy; }
/*
//TPoint(const PNT& pnt) { set(pnt); }
// @cmember Setta le coordinate x e y del punto
void set(const PNT& pnt)
{ x = pnt.h/CHARX; y = pnt.v/CHARY; }
// @cmember Setta le coordinate x e y del punto
// @cmember Operatore di assegnamento tra punti
TPoint& operator= (const PNT& pnt)
{ set(pnt); return *this; }
*/
void set(long sx, long sy)
{ x = sx; y = sy; }
// @cmember Operatore di assegnamento tra punti
TPoint& operator= (TPoint pnt)
TPoint& operator= (const TPoint& pnt)
{ set(pnt.x,pnt.y); return *this; }
// @cmember Confronta se due punti sono uguali (TRUE se uguali)
bool operator ==(const TPoint& p)
@ -51,6 +51,42 @@ struct TPoint
{ return p.x != x || p.y != y; }
};
class TRectangle : public TPoint
{
TPoint _size;
protected:
void copy(const TRectangle& r);
void normalize();
public:
long left() const { return x; }
long right() const { return x + _size.x; }
long top() const { return y; }
long bottom() const { return y + _size.y; }
long width() const { return _size.x; }
long height() const { return _size.y; }
const TPoint& pos() const { return *this; }
const TPoint& size() const { return _size; }
void set_width(long w) { _size.x = w; normalize(); }
void set_height(long h) { _size.y = h; normalize(); }
void set(long cx, long cy, long dx, long dy);
void set(const TPoint& pt, const TPoint& sz);
void set_bounds(long left, long top, long right, long bottom);
bool contains(const TPoint& p) const;
bool intersects(const TRectangle& r) const;
void merge(const TRectangle& r);
bool is_empty() const { return _size.x > 0 && _size.y > 0; }
TRectangle& operator=(const TRectangle& r) { copy(r); return *this; }
TRectangle() : TPoint(0,0), _size(0,0) { }
TRectangle(const TPoint& p, const TPoint& s) : TPoint(p), _size(s) { }
TRectangle(long cx, long cy, long dx, long dy) { set(cx, cy, dx, dy); }
TRectangle(const TRectangle& r) { copy(r); }
};
// @doc EXTERNAL
// @class TWindow | Classe per la definizione di una finestra generica
@ -238,6 +274,9 @@ public:
// @cmember Converte le coordinate fisiche (pixel) in coordinate logiche (caratteri)
virtual TPoint dev2log(const PNT& p) const;
virtual void log2dev(const TRectangle& rctl, RCT& rctd) const;
virtual void dev2log(const RCT& rctd, TRectangle& rctl) const;
// @cmember Disegna un rettangolo con la possibilita' di settare la penna e il draw_mode
void frame(short left, short top, short right, short bottom, int flag);