📄 sketcherview.cpp
字号:
// Select the first element that appears under the cursor
if(aRect.PtInRect(point))
{
m_pSelected = pElement;
break;
}
}
if(m_pSelected == pOldSelection) // If new selection is same as old
return; // we are done
// Unhighlight old selection if there is one
if(pOldSelection != 0) // Verify there is one
{
aRect = pOldSelection->GetBoundRect();
aDC.LPtoDP(aRect); // Convert to device coords
aRect.NormalizeRect(); // Normalize
InvalidateRect(aRect, FALSE); // Invalidate area
}
// Highlight new selection if there is one
if(m_pSelected != 0) // Verify there is one
{
aRect = m_pSelected->GetBoundRect();
aDC.LPtoDP(aRect); // Convert to device coords
aRect.NormalizeRect(); // Normalize
InvalidateRect(aRect, FALSE); // Invalidate area
}
}
}
// Create a new element on the heap
CElement* CSketcherView::CreateElement(void)
{
// Get a pointer to the document for this view
CSketcherDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); // Verify the pointer is good
// Now select the element using the type stored in the document
switch(pDoc->GetElementType())
{
case RECTANGLE:
return new CRectangle(m_FirstPoint, m_SecondPoint,
pDoc->GetElementColor(), pDoc->GetPenWidth());
case CIRCLE:
return new CCircle(m_FirstPoint, m_SecondPoint,
pDoc->GetElementColor(), pDoc->GetPenWidth());
case CURVE:
return new CCurve(m_FirstPoint, m_SecondPoint,
pDoc->GetElementColor(), pDoc->GetPenWidth());
case LINE:
return new CLine(m_FirstPoint, m_SecondPoint,
pDoc->GetElementColor(), pDoc->GetPenWidth());
default:
// Something's gone wrong
AfxMessageBox(_T("Bad Element code"), MB_OK);
AfxAbort();
return NULL;
}
}
void CSketcherView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// Invalidate the area corresponding to the element pointed to
// if there is one, otherwise invalidate the whole client area
if(pHint)
{
CClientDC aDC(this); // Create a device context
OnPrepareDC(&aDC); // Get origin adjusted
// Get the enclosing rectangle and convert to client coordinates
CRect aRect=((CElement*)pHint)->GetBoundRect();
aDC.LPtoDP(aRect);
aRect.NormalizeRect();
InvalidateRect(aRect); // Get the area redrawn
}
else
InvalidateRect(0); // Invalidate the client area
}
void CSketcherView::OnInitialUpdate()
{
ResetScrollSizes(); // Set up the scrollbars
CScrollView::OnInitialUpdate();
}
void CSketcherView::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu menu;
menu.LoadMenu(IDR_CURSOR_MENU);
// Set check marks if it's the no element menu
if(m_pSelected == 0)
{
// Check color menu items
COLORREF Color = GetDocument()->GetElementColor();
menu.CheckMenuItem(ID_COLOR_BLACK,
(BLACK==Color?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
menu.CheckMenuItem(ID_COLOR_RED,
(RED==Color?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
menu.CheckMenuItem(ID_COLOR_GREEN,
(GREEN==Color?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
menu.CheckMenuItem(ID_COLOR_BLUE,
(BLUE==Color?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
// Check element menu items
unsigned int ElementType = GetDocument()->GetElementType();
menu.CheckMenuItem(ID_ELEMENT_LINE,
(LINE==ElementType?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
menu.CheckMenuItem(ID_ELEMENT_RECTANGLE,
(RECTANGLE==ElementType?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
menu.CheckMenuItem(ID_ELEMENT_CIRCLE,
(CIRCLE==ElementType?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
menu.CheckMenuItem(ID_ELEMENT_CURVE,
(CURVE==ElementType?MF_CHECKED:MF_UNCHECKED)|MF_BYCOMMAND);
}
CMenu* pPopup = menu.GetSubMenu(m_pSelected == 0 ? 1 : 0);
ASSERT(pPopup != NULL);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
void CSketcherView::OnElementMove()
{
CClientDC aDC(this);
OnPrepareDC(&aDC); // Set up the device context
GetCursorPos(&m_CursorPos); // Get cursor position in screen coords
ScreenToClient(&m_CursorPos); // Convert to client coords
aDC.DPtoLP(&m_CursorPos); // Convert to logical
m_FirstPos = m_CursorPos; // Remember first position
m_MoveMode = TRUE; // Start move mode
}
void CSketcherView::OnElementDelete()
{
if(m_pSelected)
{
CSketcherDoc* pDoc = GetDocument();// Get the document pointer
pDoc->DeleteElement(m_pSelected); // Delete the element
pDoc->UpdateAllViews(0); // Redraw all the views
m_pSelected = 0; // Reset selected element ptr
}
}
void CSketcherView::MoveElement(CClientDC& aDC, CPoint& point)
{
CSize Distance = point - m_CursorPos; // Get move distance
m_CursorPos = point; // Set current point as 1st for next time
// If there is an element, selected, move it
if(m_pSelected)
{
aDC.SetROP2(R2_NOTXORPEN);
m_pSelected->Draw(&aDC,m_pSelected); // Draw the element to erase it
m_pSelected->Move(Distance); // Now move the element
m_pSelected->Draw(&aDC,m_pSelected); // Draw the moved element
}
}
void CSketcherView::OnRButtonDown(UINT nFlags, CPoint point)
{
if(m_MoveMode)
{
// In moving mode, so drop element back in original position
CClientDC aDC(this);
OnPrepareDC(&aDC); // Get origin adjusted
MoveElement(aDC, m_FirstPos); // Move element to orig position
m_MoveMode = FALSE; // Kill move mode
m_pSelected = 0; // De-select element
GetDocument()->UpdateAllViews(0); // Redraw all the views
return; // We are done
}
//CScrollView::OnRButtonDown(nFlags, point);
}
void CSketcherView::OnElementSendtoback()
{
GetDocument()->SendToBack(m_pSelected); // Move element in list
}
void CSketcherView::OnViewScale()
{
CScaleDialog aDlg; // Create a dialog object
aDlg.m_Scale = m_Scale; // Pass the view scale to the dialog
if(aDlg.DoModal() == IDOK)
{
m_Scale = 1 + aDlg.m_Scale; // Get the new scale
// Get the frame that wraps this view
CChildFrame* childFrame = static_cast<CChildFrame*>(GetParentFrame());
// Build the message string
CString StatusMsg("View Scale:");
StatusMsg += static_cast<char>('1' + m_Scale - 1);
// Set the status bar
childFrame->m_StatusBar.GetStatusBarCtrl().SetText(StatusMsg, 0, 0);
ResetScrollSizes(); // Adjust scrolling to the new scale
InvalidateRect(0); // Invalidate the whole window
}
}
void CSketcherView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class
CScrollView::OnPrepareDC(pDC, pInfo);
CSketcherDoc* pDoc = GetDocument();
pDC->SetMapMode(MM_ANISOTROPIC); // Set the map mode
CSize DocSize = pDoc->GetDocSize(); // Get the document size
// y extent must be negative because we want MM_LOENGLISH
DocSize.cy = -DocSize.cy; // Change sign of y
pDC->SetWindowExt(DocSize); // Now set the window extent
// Get the number of pixels per inch in x and y
int xLogPixels = pDC->GetDeviceCaps(LOGPIXELSX);
int yLogPixels = pDC->GetDeviceCaps(LOGPIXELSY);
// Calculate the viewport extent in x and y
long xExtent = static_cast<long>(DocSize.cx)*m_Scale*xLogPixels/100L;
long yExtent = static_cast <long>(DocSize.cy)*m_Scale*yLogPixels/100L;
pDC->SetViewportExt(static_cast<int>(xExtent),
static_cast<int>(-yExtent)); // Set viewport extent
}
void CSketcherView::ResetScrollSizes(void)
{
CClientDC aDC(this);
OnPrepareDC(&aDC); // Set up the device context
CSize DocSize = GetDocument()->GetDocSize(); // Get the document size
aDC.LPtoDP(&DocSize); // Get the size in pixels
SetScrollSizes(MM_TEXT, DocSize); // Set up the scrollbars
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -