📄 drawvw.cpp
字号:
}
BOOL CDrawView::OnEraseBkgnd(CDC*)
{
return TRUE;
}
void CDrawView::OnObjectFillColor()
{
CColorDialog dlg;
if (dlg.DoModal() != IDOK)
return;
COLORREF color = dlg.GetColor();
POSITION pos = m_selection.GetHeadPosition();
while (pos != NULL)
{
CDrawObj* pObj = m_selection.GetNext(pos);
pObj->SetFillColor(color);
}
}
void CDrawView::OnObjectLineColor()
{
CColorDialog dlg;
if (dlg.DoModal() != IDOK)
return;
COLORREF color = dlg.GetColor();
POSITION pos = m_selection.GetHeadPosition();
while (pos != NULL)
{
CDrawObj* pObj = m_selection.GetNext(pos);
pObj->SetLineColor(color);
}
}
void CDrawView::OnObjectMoveBack()
{
CDrawDoc* pDoc = GetDocument();
CDrawObj* pObj = m_selection.GetHead();
CDrawObjList* pObjects = pDoc->GetObjects();
POSITION pos = pObjects->Find(pObj);
ASSERT(pos != NULL);
if (pos != pObjects->GetHeadPosition())
{
POSITION posPrev = pos;
pObjects->GetPrev(posPrev);
pObjects->RemoveAt(pos);
pObjects->InsertBefore(posPrev, pObj);
InvalObj(pObj);
}
}
void CDrawView::OnObjectMoveForward()
{
CDrawDoc* pDoc = GetDocument();
CDrawObj* pObj = m_selection.GetHead();
CDrawObjList* pObjects = pDoc->GetObjects();
POSITION pos = pObjects->Find(pObj);
ASSERT(pos != NULL);
if (pos != pObjects->GetTailPosition())
{
POSITION posNext = pos;
pObjects->GetNext(posNext);
pObjects->RemoveAt(pos);
pObjects->InsertAfter(posNext, pObj);
InvalObj(pObj);
}
}
void CDrawView::OnObjectMoveToBack()
{
CDrawDoc* pDoc = GetDocument();
CDrawObj* pObj = m_selection.GetHead();
CDrawObjList* pObjects = pDoc->GetObjects();
POSITION pos = pObjects->Find(pObj);
ASSERT(pos != NULL);
pObjects->RemoveAt(pos);
pObjects->AddHead(pObj);
InvalObj(pObj);
}
void CDrawView::OnObjectMoveToFront()
{
CDrawDoc* pDoc = GetDocument();
CDrawObj* pObj = m_selection.GetHead();
CDrawObjList* pObjects = pDoc->GetObjects();
POSITION pos = pObjects->Find(pObj);
ASSERT(pos != NULL);
pObjects->RemoveAt(pos);
pObjects->AddTail(pObj);
InvalObj(pObj);
}
void CDrawView::OnEditCopy()
{
ASSERT_VALID(this);
ASSERT(m_cfDraw != NULL);
// Create a shared file and associate a CArchive with it
CSharedFile file;
CArchive ar(&file, CArchive::store);
// Serialize selected objects to the archive
m_selection.Serialize(ar);
ar.Close();
COleDataSource* pDataSource = NULL;
TRY
{
pDataSource = new COleDataSource;
// put on local format instead of or in addation to
pDataSource->CacheGlobalData(m_cfDraw, file.Detach());
// if only one item and it is a COleClientItem then also
// paste in that format
CDrawObj* pDrawObj = m_selection.GetHead();
if (m_selection.GetCount() == 1 &&
pDrawObj->IsKindOf(RUNTIME_CLASS(CDrawOleObj)))
{
CDrawOleObj* pDrawOle = (CDrawOleObj*)pDrawObj;
pDrawOle->m_pClientItem->GetClipboardData(pDataSource, FALSE);
}
pDataSource->SetClipboard();
}
CATCH_ALL(e)
{
delete pDataSource;
THROW_LAST();
}
END_CATCH_ALL
}
void CDrawView::OnUpdateEditCopy(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!m_selection.IsEmpty());
}
void CDrawView::OnEditCut()
{
OnEditCopy();
OnEditClear();
}
void CDrawView::OnUpdateEditCut(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!m_selection.IsEmpty());
}
void CDrawView::OnEditPaste()
{
COleDataObject dataObject;
dataObject.AttachClipboard();
// invalidate current selection since it will be deselected
OnUpdate(NULL, HINT_UPDATE_SELECTION, NULL);
m_selection.RemoveAll();
if (dataObject.IsDataAvailable(m_cfDraw))
{
PasteNative(dataObject);
// now add all items in m_selection to document
POSITION pos = m_selection.GetHeadPosition();
while (pos != NULL)
GetDocument()->Add(m_selection.GetNext(pos));
}
else
PasteEmbedded(dataObject, GetInitialPosition().TopLeft() );
GetDocument()->SetModifiedFlag();
// invalidate new pasted stuff
GetDocument()->UpdateAllViews(NULL, HINT_UPDATE_SELECTION, &m_selection);
}
void CDrawView::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
// determine if private or standard OLE formats are on the clipboard
COleDataObject dataObject;
BOOL bEnable = dataObject.AttachClipboard() &&
(dataObject.IsDataAvailable(m_cfDraw) ||
COleClientItem::CanCreateFromData(&dataObject));
// enable command based on availability
pCmdUI->Enable(bEnable);
}
void CDrawView::OnFilePrint()
{
CScrollView::OnFilePrint();
GetDocument()->ComputePageSize();
}
void CDrawView::OnViewShowObjects()
{
CDrawOleObj::c_bShowItems = !CDrawOleObj::c_bShowItems;
GetDocument()->UpdateAllViews(NULL, HINT_UPDATE_OLE_ITEMS, NULL);
}
void CDrawView::OnUpdateViewShowObjects(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(CDrawOleObj::c_bShowItems);
}
void CDrawView::OnEditProperties()
{
if (m_selection.GetCount() == 1 && CDrawTool::c_drawShape == selection)
{
CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape);
ASSERT(pTool != NULL);
pTool->OnEditProperties(this);
}
}
void CDrawView::OnUpdateEditProperties(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_selection.GetCount() == 1 &&
CDrawTool::c_drawShape == selection);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawView diagnostics
#ifdef _DEBUG
void CDrawView::AssertValid() const
{
CScrollView::AssertValid();
}
void CDrawView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// new
// support for drag/drop
int CDrawView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
// register drop target
if( m_dropTarget.Register( this ) )
return 0;
else
return -1;
}
BOOL CDrawView::GetObjectInfo(COleDataObject* pDataObject,
CSize* pSize, CSize* pOffset)
{
ASSERT(pSize != NULL);
// get object descriptor data
HGLOBAL hObjDesc = pDataObject->GetGlobalData(m_cfObjectDescriptor);
if (hObjDesc == NULL)
{
if (pOffset != NULL)
*pOffset = CSize(0, 0); // fill in defaults instead
*pSize = CSize(0, 0);
return FALSE;
}
ASSERT(hObjDesc != NULL);
// otherwise, got CF_OBJECTDESCRIPTOR ok. Lock it down and extract size.
LPOBJECTDESCRIPTOR pObjDesc = (LPOBJECTDESCRIPTOR)GlobalLock(hObjDesc);
ASSERT(pObjDesc != NULL);
pSize->cx = (int)pObjDesc->sizel.cx;
pSize->cy = (int)pObjDesc->sizel.cy;
if (pOffset != NULL)
{
pOffset->cx = (int)pObjDesc->pointl.x;
pOffset->cy = (int)pObjDesc->pointl.y;
}
GlobalUnlock(hObjDesc);
GlobalFree(hObjDesc);
// successfully retrieved pSize & pOffset info
return TRUE;
}
DROPEFFECT CDrawView::OnDragEnter(COleDataObject* pDataObject,
DWORD grfKeyState, CPoint point)
{
ASSERT(m_prevDropEffect == DROPEFFECT_NONE);
m_bDragDataAcceptable = FALSE;
if (!COleClientItem::CanCreateFromData(pDataObject))
return DROPEFFECT_NONE;
m_bDragDataAcceptable = TRUE;
GetObjectInfo(pDataObject, &m_dragSize, &m_dragOffset);
CClientDC dc(NULL);
dc.HIMETRICtoDP(&m_dragSize);
dc.HIMETRICtoDP(&m_dragOffset);
return OnDragOver(pDataObject, grfKeyState, point);
}
DROPEFFECT CDrawView::OnDragOver(COleDataObject*,
DWORD grfKeyState, CPoint point)
{
if(m_bDragDataAcceptable == FALSE)
return DROPEFFECT_NONE;
point -= m_dragOffset; // adjust target rect by original cursor offset
// check for point outside logical area -- i.e. in hatched region
// GetTotalSize() returns the size passed to SetScrollSizes
CRect rectScroll(CPoint(0, 0), GetTotalSize());
CRect rectItem(point,m_dragSize);
rectItem.OffsetRect(GetDeviceScrollPosition());
DROPEFFECT de = DROPEFFECT_NONE;
CRect rectTemp;
if (rectTemp.IntersectRect(rectScroll, rectItem))
{
// check for force link
if ((grfKeyState & (MK_CONTROL|MK_SHIFT)) == (MK_CONTROL|MK_SHIFT))
de = DROPEFFECT_NONE; // DRAWCLI isn't a linking container
// check for force copy
else if ((grfKeyState & MK_CONTROL) == MK_CONTROL)
de = DROPEFFECT_COPY;
// check for force move
else if ((grfKeyState & MK_ALT) == MK_ALT)
de = DROPEFFECT_MOVE;
// default -- recommended action is move
else
de = DROPEFFECT_MOVE;
}
if (point == m_dragPoint)
return de;
// otherwise, cursor has moved -- need to update the drag feedback
CClientDC dc(this);
if (m_prevDropEffect != DROPEFFECT_NONE)
{
// erase previous focus rect
dc.DrawFocusRect(CRect(m_dragPoint, m_dragSize));
}
m_prevDropEffect = de;
if (m_prevDropEffect != DROPEFFECT_NONE)
{
m_dragPoint = point;
dc.DrawFocusRect(CRect(point, m_dragSize));
}
return de;
}
BOOL CDrawView::OnDrop(COleDataObject* pDataObject,
DROPEFFECT /*dropEffect*/, CPoint point)
{
ASSERT_VALID(this);
// clean up focus rect
OnDragLeave();
// offset point as appropriate for dragging
GetObjectInfo(pDataObject, &m_dragSize, &m_dragOffset);
CClientDC dc(NULL);
dc.HIMETRICtoDP(&m_dragSize);
dc.HIMETRICtoDP(&m_dragOffset);
point -= m_dragOffset;
// invalidate current selection since it will be deselected
OnUpdate(NULL, HINT_UPDATE_SELECTION, NULL);
m_selection.RemoveAll();
if (m_bDragDataAcceptable)
PasteEmbedded(*pDataObject, point);
// update the document and views
GetDocument()->SetModifiedFlag();
GetDocument()->UpdateAllViews(NULL, 0, NULL); // including this view
return TRUE;
}
void CDrawView::OnDragLeave()
{
CClientDC dc(this);
if (m_prevDropEffect != DROPEFFECT_NONE)
{
dc.DrawFocusRect(CRect(m_dragPoint,m_dragSize)); // erase previous focus rect
m_prevDropEffect = DROPEFFECT_NONE;
}
}
void CDrawView::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
// make sure window is active
GetParentFrame()->ActivateFrame();
CPoint local = point;
ScreenToClient(&local);
ClientToDoc(local);
CDrawObj* pObj;
pObj = GetDocument()->ObjectAt(local);
if(pObj != NULL)
{
if(!IsSelected(pObj))
Select( pObj, FALSE ); // reselect item if appropriate
UpdateWindow();
CMenu menu;
if (menu.LoadMenu(ID_POPUP_MENU))
{
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
pPopup->TrackPopupMenu(TPM_RIGHTBUTTON | TPM_LEFTALIGN,
point.x, point.y,
AfxGetMainWnd()); // route commands through main window
}
}
}
void CDrawView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
if (pInfo->m_bPreview == FALSE)
((CDrawDoc*)GetDocument())->m_pSummInfo->RecordPrintDate();
OnDraw(pDC);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -