📄 diagramentity.cpp
字号:
============================================================*/
{
CRect rect( static_cast< int >( GetLeft() ),
static_cast< int >( GetTop() ),
static_cast< int >( GetRight() ),
static_cast< int >( GetBottom() ) );
return rect;
}
void CDiagramEntity::SetRect( CRect rect )
/* ============================================================
Function : CDiagramEntity::SetRect
Description : Sets the object rectangle, normalized.
Access : Public
Return : void
Parameters : CRect rect - The rectangle to set.
Usage : Call to place the object.
============================================================*/
{
rect.NormalizeRect();
SetRect( static_cast< double >( rect.left ),
static_cast< double >( rect.top ),
static_cast< double >( rect.right ),
static_cast< double >( rect.bottom ) );
}
void CDiagramEntity::SetRect( double left, double top, double right, double bottom )
/* ============================================================
Function : CDiagramEntity::SetRect
Description : Sets the object rectangle.
Access : Public
Return : void
Parameters : double left - Left edge
double top - Top edge
double right - Right edge
double bottom - Bottom edge
Usage : Call to place the object.
============================================================*/
{
SetLeft( left );
SetTop( top );
SetRight( right );
SetBottom( bottom );
if( GetMinimumSize().cx != -1 )
if( GetRect().Width() < GetMinimumSize().cx )
SetRight( GetLeft() + GetMinimumSize().cx );
if( GetMinimumSize().cy != -1 )
if( GetRect().Height() < GetMinimumSize().cy )
SetBottom( GetTop() + GetMinimumSize().cy );
if( GetMaximumSize().cx != -1 )
if( GetRect().Width() > GetMaximumSize().cx )
SetRight( GetLeft() + GetMaximumSize().cx );
if( GetMaximumSize().cy != -1 )
if( GetRect().Height() > GetMaximumSize().cy )
SetBottom( GetTop() + GetMaximumSize().cy );
if( GetPropertyDialog() )
GetPropertyDialog()->SetValues();
}
void CDiagramEntity::MoveRect( double x, double y )
/* ============================================================
Function : CDiagramEntity::MoveRect
Description : Moves the object rectangle.
Access : Public
Return : void
Parameters : double x - Move x steps horizontally.
double y - Move y steps vertically.
Usage : Call to move the object on screen.
============================================================*/
{
SetRect( GetLeft() + x, GetTop() + y, GetRight() + x, GetBottom() + y );
}
void CDiagramEntity::Select( BOOL selected )
/* ============================================================
Function : CDiagramEntity::Select
Description : Sets the object select state.
Access : Public
Return : void
Parameters : BOOL selected - "TRUE" to select, "FALSE"
to unselect.
Usage : Call to select/deselect the object.
============================================================*/
{
m_selected = selected;
if( selected && GetGroup() )
{
CDiagramEntityContainer* parent = GetParent();
if( parent )
parent->SendMessageToObjects( CMD_SELECT_GROUP, FALSE, this, NULL, FALSE );
}
}
BOOL CDiagramEntity::IsSelected() const
/* ============================================================
Function : CDiagramEntity::IsSelected
Description : Checks if the object is selected.
Access : Public
Return : BOOL - "TRUE" if the object is selected.
Parameters : none
Usage : Call to see if the object is selected.
============================================================*/
{
return m_selected;
}
BOOL CDiagramEntity::BodyInRect( CRect rect ) const
/* ============================================================
Function : CDiagramEntity::BodyInRect
Description : Used to see if any part of the object lies
in "rect".
Access : Public
Return : BOOL - "TRUE" if any part of the
object lies inside rect.
Parameters : CRect rect - The rectangle to check.
Usage : Call to see if the object overlaps - for
example - a selection rubberband.
============================================================*/
{
BOOL result = FALSE;
CRect rectEntity = GetRect();
CRect rectIntersect;
rect.NormalizeRect();
rectEntity.NormalizeRect();
rectIntersect.IntersectRect( rect, rectEntity );
if( !rectIntersect.IsRectEmpty() )
result = TRUE;
return result;
}
int CDiagramEntity::GetHitCode( CPoint point ) const
/* ============================================================
Function : CDiagramEntity::GetHitCode
Description : Returns the hit point constant for "point".
Access : Public
Return : int - The hit point,
"DEHT_NONE" if none.
Parameters : CPoint point - The point to check
Usage : Call to see in what part of the object point
lies. The hit point can be one of the following:
"DEHT_NONE" No hit-point
"DEHT_BODY" Inside object body
"DEHT_TOPLEFT" Top-left corner
"DEHT_TOPMIDDLE" Middle top-side
"DEHT_TOPRIGHT" Top-right corner
"DEHT_BOTTOMLEFT" Bottom-left corner
"DEHT_BOTTOMMIDDLE" Middle bottom-side
"DEHT_BOTTOMRIGHT" Bottom-right corner
"DEHT_LEFTMIDDLE" Middle left-side
"DEHT_RIGHTMIDDLE" Middle right-side
============================================================*/
{
CRect rect = GetRect();
return GetHitCode( point, rect );
}
BOOL CDiagramEntity::DoMessage( UINT msg, CDiagramEntity* sender, CWnd* from )
/* ============================================================
Function : CDiagramEntity::DoMessage
Description : Message handler for the object.
Access : Public
Return : BOOL - "TRUE" to stop
further processing.
Parameters : UINT msg - The message.
CDiagramEntity* sender - Original sender of
this message, or
"NULL" if not an object.
Usage : The container can send messages to all
objects. The messages should lie in the
range "CMD_START" to "CMD_STOP" inclusively -
a few are already predefined in
DiagramEntity.h. This function will be
called as response to those messages. This
mechanism is already used for sending back
messages from "CDiagramEditor" to the
relevant object when a object popup menu
alternative is selected.
============================================================*/
{
BOOL stop = FALSE;
switch( msg )
{
case CMD_CUT:
if( m_parent && IsSelected() )
{
stop = TRUE;
m_parent->Cut( this );
}
break;
case CMD_COPY:
if( m_parent && IsSelected() )
{
stop = TRUE;
m_parent->Copy( this );
}
break;
case CMD_UP:
if( m_parent && IsSelected() )
{
stop = TRUE;
m_parent->Up( this );
}
break;
case CMD_DOWN:
if( m_parent && IsSelected() )
{
stop = TRUE;
m_parent->Down( this );
}
break;
case CMD_FRONT:
if( m_parent && IsSelected() )
{
stop = TRUE;
m_parent->Front( this );
}
break;
case CMD_BOTTOM:
if( m_parent && IsSelected() )
{
stop = TRUE;
m_parent->Bottom( this );
}
break;
case CMD_DUPLICATE:
if( m_parent && IsSelected() )
{
stop = TRUE;
m_parent->Duplicate( this );
Select( FALSE );
}
break;
case CMD_PROPERTIES:
if( IsSelected() )
{
ShowProperties( from );
stop = TRUE;
}
break;
case CMD_SELECT_GROUP:
if( sender != this )
if( sender->GetGroup() == GetGroup() )
m_selected = TRUE;
break;
}
return stop;
}
void CDiagramEntity::ShowPopup( CPoint point, CWnd* parent )
/* ============================================================
Function : CDiagramEntity::ShowPopup
Description : Shows the popup menu for the object.
Access : Public
Return : void
Parameters : CPoint point - The point to track.
CWnd* parent - The parent "CWnd" of the
menu (should be the
"CDiagramEditor")
Usage : The function uses hardcoded strings to
avoid having to include resource file
fragments. Derived classes needing a non-
standard or localized menu should load
menues from resources instead.
============================================================*/
{
CMenu menu;
if( menu.CreatePopupMenu() )
{
menu.AppendMenu( MF_STRING, CMD_CUT, _T( "Cut" ) );
menu.AppendMenu( MF_STRING, CMD_COPY, _T( "Copy" ) );
menu.AppendMenu( MF_STRING, CMD_DUPLICATE, _T( "Duplicate" ) );
menu.AppendMenu( MF_SEPARATOR );
menu.AppendMenu( MF_STRING, CMD_UP, _T( "Up" ) );
menu.AppendMenu( MF_STRING, CMD_DOWN, _T( "Down" ) );
menu.AppendMenu( MF_STRING, CMD_FRONT, _T( "To front" ) );
menu.AppendMenu( MF_STRING, CMD_BOTTOM, _T( "To back" ) );
menu.AppendMenu( MF_SEPARATOR );
menu.AppendMenu( MF_STRING, CMD_PROPERTIES, _T( "Properties" ) );
menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, parent );
}
}
void CDiagramEntity::ShowProperties( CWnd* parent, BOOL show )
/* ============================================================
Function : CDiagramEntity::ShowProperties
Description : Shows the property dialog for the object.
Access : Public
Return : void
Parameters : CWnd* parent - Parent of the dialog
BOOL show - "TRUE" to show, "FALSE"
to hide.
Usage : Call to show the property dialog for this
object.
============================================================*/
{
if( m_propertydlg )
{
if( show )
{
if( !m_propertydlg->m_hWnd )
m_propertydlg->Create( ( UINT ) m_propertydlgresid, parent );
m_propertydlg->ShowWindow( SW_SHOW );
m_propertydlg->SetValues();
m_propertydlg->SetFocus();
}
else
if( m_propertydlg->m_hWnd )
m_propertydlg->ShowWindow( SW_HIDE );
}
}
void CDiagramEntity::DrawObject( CDC* dc, double zoom )
/* ============================================================
Function : CDiagramEntity::DrawObject
Description : Top-level drawing function for the object.
Access : Public
Return : void
Parameters : CDC* dc - "CDC" to draw to.
double zoom - Zoom level to use
Usage : Even though virtual, this function should
normally not be overridden (use "Draw"
instead). The function stores the zoom and
calculates the true drawing rectangle.
============================================================*/
{
SetZoom( zoom );
CRect rect( round( GetLeft() * zoom ),
round( GetTop() * zoom ),
round( GetRight() * zoom ),
round( GetBottom() * zoom ) );
Draw( dc, rect );
if( IsSelected() )
DrawSelectionMarkers( dc, rect );
}
void CDiagramEntity::Draw( CDC* dc, CRect rect )
/* ============================================================
Function : CDiagramEntity::Draw
Description : Draws the object.
Access : Public
Return : void
Parameters : CDC* dc - The "CDC" to draw to.
CRect rect - The real rectangle of the
object.
Usage : The function should clean up all selected
objects. Note that the "CDC" is a memory "CDC",
so creating a memory "CDC" in this function
will probably not speed up the function.
============================================================*/
{
dc->SelectStockObject( BLACK_PEN );
dc->SelectStockObject( WHITE_BRUSH );
dc->Rectangle( rect );
}
HCURSOR CDiagramEntity::GetCursor( int hit ) const
/* ============================================================
Function : CDiagramEntity::GetCursor
Description : Returns the cursor for the given hit point.
Access : Public
Return : HCURSOR - The cursor to show
Parameters : int hit - The hit point constant ("DEHT_")
to get the cursor for.
Usage : Call to get the cursor for a specific hit
point constant.
"hit" can be one of the following:
"DEHT_NONE" No hit-point
"DEHT_BODY" Inside object body
"DEHT_TOPLEFT" Top-left corner
"DEHT_TOPMIDDLE" Middle top-side
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -