📄 diagrameditor.cpp
字号:
{
m_zoomMin = max( 0, zoommin );
}
void CDiagramEditor::SetModified( BOOL dirty )
/* ============================================================
Function : CDiagramEditor::SetModified
Description : Set the modified-state of the data for the
document.
Access : Public
Return : void
Parameters : BOOL dirty - "TRUE" if the data should be
set as modified.
Usage : Call to mark the data as modified/saved.
============================================================*/
{
if( m_objs )
m_objs->SetModified( dirty );
}
BOOL CDiagramEditor::IsModified() const
/* ============================================================
Function : CDiagramEditor::IsModified
Description : Returns "TRUE" if the data in the editor is
modified.
Access : Public
Return : BOOL - "TRUE" if modified.
Parameters : none
Usage : Call to check if the data is modified.
============================================================*/
{
BOOL res = FALSE;
if( m_objs )
res = m_objs->IsModified();
return res;
}
CSize CDiagramEditor::GetMarkerSize() const
/* ============================================================
Function : CDiagramEditor::GetMarkerSize
Description : Gets the current selection marker size for
the editor background.
Access : Public
Return : CSize - The current size.
Parameters : none
Usage : Call to get the selection marker size.
============================================================*/
{
return m_markerSize;
}
void CDiagramEditor::SetMarkerSize( CSize markerSize )
/* ============================================================
Function : CDiagramEditor::SetMarkerSize
Description : Sets the size of the selection markers for
the editor background.
Access : Public
Return : void
Parameters : CSize markerSize - New size of
markers.
Usage : Call to set the selection marker size.
Will not set the selection marker size for
objects.
============================================================*/
{
m_markerSize = markerSize;
}
UINT CDiagramEditor::GetKeyboardInterface() const
/* ============================================================
Function : CDiagramEditor::GetKeyboardInterface
Description : Returns the flags for the keyboard
interface
Access : Public
Return : UINT - The current flags
Parameters : none
Usage : The keyboard interface decides what keys
should be reacted on. The following flags
can be used:
"KEY_ARROW" Will handle arrow keys. If shift is pressed, the selected objects will be resized, moved otherwise.
"KEY_PGUPDOWN" Will handle Pg up & pg down. If Ctrl is pressed, the selected object will move to the top or the bottom of the z-order, one step up or down otherwise.
"KEY_DELETE" Will handle delete key. The selected object(s) will be deleted, put into the container clipboard if Ctrl is pressed.
"KEY_ESCAPE" Will handle escape key. If multi-draw mode, no object type is selected for drawing.
"KEY_INSERT" Will handle insert key. The selected object will be copied if Ctrl is pressed, duplicated otherwise.
"KEY_PLUSMINUS" Will handle the plus- and minus key. Will zoom in or out.
"KEY_CTRL" Will handle Ctrl+A,Z,X,C,V,Y and Enter keys. A = Select all Z = Undo Y = Redo X = Cut C = Copy V = Paste Enter = Show property dialog for the selected object.
KEY_ALL sets all flags. KEY_NONE no flags.
============================================================*/
{
return m_keyInterface;
}
void CDiagramEditor::SetKeyboardInterface( int keyInterface )
/* ============================================================
Function : CDiagramEditor::SetKeyboardInterface
Description : Sets the keyboard interface flag.
Access : Public
Return : void
Parameters : int keyInterface - The new flags
Usage : Call to set the keys the editor will handle.
See "GetKeyboardInterface".
============================================================*/
{
m_keyInterface = keyInterface;
}
void CDiagramEditor::SetPopupMenu( CDiagramMenu* popupmenu )
/* ============================================================
Function : CDiagramEditor::SetPopupMenu
Description : Sets the editor popup menu to popupmenu.
Access : Public
Return : void
Parameters : CDiagramMenu* popupmenu - The popup menu
to use.
Usage : Call to set the popup menu for the editor.
Note that the editor owns the popup menu.
============================================================*/
{
if( m_popupMenu )
delete m_popupMenu;
m_popupMenu = popupmenu;
}
CDiagramMenu* CDiagramEditor::GetPopupMenu() const
/* ============================================================
Function : CDiagramEditor::GetPopupMenu
Description : Returns a pointer to the editor popup menu.
Access : Public
Return : CDiagramMenu* - The popup menu.
Might be "NULL".
Parameters : none
Usage : Call to get a pointer to the editor popup
menu. Note that the editor owns the menu.
============================================================*/
{
return m_popupMenu;
}
/////////////////////////////////////////////////////////////////////////////
// CDiagramEditor mouse handling
void CDiagramEditor::OnLButtonDown( UINT nFlags, CPoint point )
/* ============================================================
Function : CDiagramEditor::OnLButtonDown
Description : Handles the "WM_LBUTTONDOWN" message. We
select/deselect objects and set internal
modes as appropriate.
Access : Protected
Return : void
Parameters : UINT nFlags - Key-down flag
CPoint point - Mouse position
Usage : Called from MFC. Do not call from code.
============================================================*/
{
SetPanning( FALSE );
m_savedMousePoint = point;
// Declarations
int count = 0;
CDiagramEntity* obj;
CPoint virtpoint( point );
ScreenToVirtual( virtpoint );
// Setting up
SetFocus();
SetCapture();
// Resetting modes
if( m_interactMode != MODE_DRAWING )
{
m_interactMode = MODE_NONE;
m_subMode = DEHT_NONE;
m_subModeSelected = NULL;
}
m_bgResizeSelected = FALSE;
m_multiSelObj = NULL;
// If we click on an already selected object,
// and have more than one object selected,
// we want to move all selected objects
if( m_objs && GetSelectCount() > 1 && !( nFlags & MK_CONTROL ) )
{
while( ( obj = m_objs->GetAt( count++ ) ) )
{
if( obj->GetHitCode( virtpoint ) == DEHT_BODY && obj->IsSelected() )
{
m_interactMode = MODE_MOVING;
CRect rect = obj->GetRect();
// We might need to use a denormalized
// rect, as lines will not be normalized.
BOOL useright = FALSE;
BOOL usebottom = FALSE;
if( rect.left > rect.right )
useright = TRUE;
if( rect.top > rect.bottom )
usebottom = TRUE;
VirtualToScreen( rect );
int startx = rect.left;
if( useright )
startx = rect.right;
int starty = rect.top;
if( usebottom )
starty = rect.bottom;
// Anchor object
m_multiSelObj = obj;
// Offset from top-left corner
// in the anchor object.
m_deltaPoint = point - CPoint( startx, starty );
}
}
if( m_interactMode == MODE_MOVING )
{
// We have clicked in one of many selected objects.
// Set cursor and snapshot for Undo.
::SetCursor( m_multiSelObj->GetCursor( DEHT_BODY ) );
m_objs->Snapshot();
}
}
if( m_objs && m_interactMode == MODE_DRAWING )
{
// The user wants to draw an object.
// We add it to the data container and sets the appropriate mode
if( OutsideRestraints( virtpoint ) )
{
m_interactMode = MODE_NONE;
return;
}
m_objs->Snapshot();
UnselectAll();
CDiagramEntity* newobj = m_drawObj->Clone();
// If snap-to-grid is on, we must
// update the desired position
if( m_snap )
{
virtpoint.x = SnapX( virtpoint.x );
virtpoint.y = SnapY( virtpoint.y );
}
newobj->SetRect( CRect( virtpoint.x, virtpoint.y, virtpoint.x , virtpoint.y ) );
Select( newobj, TRUE );
// Add the object to the container
AddObject( newobj );
// Set modes
m_interactMode = MODE_RESIZING;
m_subMode = DEHT_BOTTOMRIGHT;
m_subModeSelected = newobj;
}
if( m_objs && m_interactMode == MODE_NONE )
{
BOOL goon = TRUE;
// If we have a single object selected, and we are
// located on a resize point, we should resize
// regardless of what objects are above the selected
// object.
if( GetSelectCount() == 1 )
{
obj = GetSelectedObject();
if( obj )
{
CRect rect = obj->GetRect();
VirtualToScreen( rect );
int hitCode = obj->GetHitCode( point, rect );
if( hitCode != DEHT_NONE && hitCode != DEHT_BODY )
{
m_interactMode = MODE_RESIZING;
m_subMode = hitCode;
m_subModeSelected = obj;
goon = FALSE;
}
}
}
if( goon )
{
// Clearing states
// If Ctrl is not held down, we
// clear all selections
if( !( nFlags & MK_CONTROL ) )
UnselectAll();
count = GetObjectCount();
}
// We check if we click on any object. If that is
// the case, we return on what part of the object
// we clicked.
while( goon && ( obj = m_objs->GetAt( --count ) ) )
{
CRect rect = obj->GetRect();
VirtualToScreen( rect );
int hitCode = obj->GetHitCode( point, rect );
if( hitCode != DEHT_NONE )
{
goon = FALSE;
if( !( nFlags & MK_CONTROL ) )
{
// We unselect all again, as we might
// have overlapping objects
UnselectAll();
Select( obj, TRUE );
}
else
{
// We toggle the selection of the
// object if Ctrl is pressed
if( obj->IsSelected() )
Select( obj, FALSE );
else
Select( obj, TRUE );
}
// We set the appropriate mode, either
// moving or resizing depending on where
// the click hit.
if( hitCode == DEHT_BODY && !( nFlags & MK_CONTROL ) )
{
::SetCursor( obj->GetCursor( DEHT_BODY ) );
m_interactMode = MODE_MOVING;
CRect rect = obj->GetRect();
// We might need to use a denormalized
// rect, as lines will not be normalized.
BOOL useright = FALSE;
BOOL usebottom = FALSE;
if( rect.left > rect.right )
useright = TRUE;
if( rect.top > rect.bottom )
usebottom = TRUE;
VirtualToScreen( rect );
int startx = rect.left;
if( useright )
startx = rect.right;
int starty = rect.top;
if( usebottom )
starty = rect.bottom;
if( GetSelectCount() > 1 )
m_multiSelObj = obj;
m_deltaPoint = point - CPoint( startx, starty );
}
else if( !( nFlags & MK_CONTROL ) )
{
m_interactMode = MODE_RESIZING;
m_subMode = hitCode;
m_subModeSelected = obj;
}
else
m_interactMode = MODE_NONE;
}
}
// Save to undo-stack...
if( m_interactMode != MODE_NONE )
m_objs->Snapshot();
// If no objects were selected, we assume either
// rubberbanding or background resize
if( !IsAnyObjectSelected() )
{
if( m_bgResize )
{
// If we allow background resizing, we test if
// the click was inside the resize zone.
if( ( virtpoint.x >= GetVirtualSize().cx - m_bgResizeZone &&
virtpoint.x <= GetVirtualSize().cx )
||
( virtpoint.y >= GetVirtualSize().cy - m_bgResizeZone &&
virtpoint.y <= GetVirtualSize().cy )
)
{
m_bgResizeSelected = TRUE;
int hitCode = GetHitCode( virtpoint );
if( hitCode != DEHT_NONE && hitCode != DEHT_BODY )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -