📄 drawview.cpp
字号:
m_CurrentPen.DeleteObject();
m_CurrentPen.CreatePen(PS_SOLID, globalSIZE, corCol);
dc.SelectObject(&m_CurrentPen);
if (GetCapture() != this)
return;
switch(m_var)
{
case 1: dc.MoveTo(loc);
break;
case 2: //dc.Rectangle(CRect(m_OldPoint,loc));
dc.SelectObject(&HollowBrush);
dc.Rectangle(rect1,rect2, loc.x, loc.y);
dc.SelectObject(&m_PreviousBrush);
break;
case 3: //dc.Rectangle(rect1, rect2, loc.x, loc.y);
dc.FillRect(CRect(rect1,rect2, loc.x, loc.y),&m_CurrentBrush);
break;
case 4: dc.SelectObject(&HollowBrush);
dc.RoundRect(rect1, rect2, loc.x, loc.y, 15, 13);
dc.SelectObject(&m_PreviousBrush); // select default brush
break;
case 5: dc.SelectObject(&m_CurrentBrush);
dc.RoundRect(rect1, rect2, loc.x, loc.y, 15, 13);
dc.SelectObject(&m_PreviousBrush);
break;
case 6: dc.SelectObject(&HollowBrush);
dc.Ellipse(rect1, rect2, loc.x, loc.y);
dc.SelectObject(&m_PreviousBrush);
break;
case 7: dc.SelectObject(&m_CurrentBrush);
dc.Ellipse(rect1, rect2, loc.x, loc.y);
dc.SelectObject(&m_PreviousBrush);
//dc.Ellipse(CRect(m_OldPoint,loc));
break;
case 8: b1=false; break;
case 9: dc.SelectObject(&eraserPEN);
dc.MoveTo(m_OldPoint.x, m_OldPoint.y);
// dc.LineTo(loc.x, loc.y);
default: break;
}
paint=0;
// canundo=true;
ReleaseCapture();
RecordHistory();
undo++;
CView::OnLButtonUp(nFlags, loc);
}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
m_CurrentPen.DeleteObject();
m_CurrentPen.CreatePen(PS_SOLID, globalSIZE, corCol);
// CPen pen(PS_SOLID,globalSIZE,corCol);
dc.SelectObject(&m_CurrentPen);
// CPen *p=dc.SelectObject(&pen);
CString str;
str.Format(_T("x=%4d , y=%4d"), str,point.x,point.y);
str=" Mouse located at: "+str; //在str2后追加str,返回str2
CString coordinatestext;
coordinatestext.Format(_T("x=%4d y=%4d"),point.x,point.y);
CMainFrame *pFrame=(CMainFrame *)AfxGetMainWnd();
// int index=pFrame->m_wndStatusBar.CommandToIndex(ID_INDICATOR_COORDINATES);
// pFrame->m_wndStatusBar.SetPaneText(index,coordinatestext);
pFrame->m_wndStatusBar.SetWindowText(str);
if(paint==1){
switch(m_var)
{
case 1: dc.SelectObject(&m_CurrentPen);
dc.SelectObject(&m_CurrentBrush);
dc.SetROP2(R2_NOTXORPEN);
dc.MoveTo(rect1, rect2);
dc.LineTo(point.x, point.y);
dc.MoveTo(rect1, rect2);
dc.LineTo(m_OldPoint.x, m_OldPoint.y);
break;
case 2: dc.SelectObject(&HollowBrush);
dc.SelectObject(&m_CurrentPen);
dc.SetROP2(R2_NOTXORPEN);
dc.Rectangle(rect1, rect2, point.x, point.y);
dc.Rectangle(rect1, rect2, m_OldPoint.x, m_OldPoint.y);
dc.SelectObject(&m_PreviousBrush);
break;
case 3: dc.SelectObject(&m_CurrentPen);
dc.SelectObject(&m_CurrentBrush);
dc.SetROP2(R2_NOTXORPEN);
dc.Rectangle(rect1, rect2, point.x, point.y);
dc.Rectangle(rect1, rect2, m_OldPoint.x, m_OldPoint.y);
break;
case 4: dc.SelectObject(&HollowBrush);
dc.SelectObject(&m_CurrentPen);
dc.SetROP2(R2_NOTXORPEN);
dc.RoundRect(rect1, rect2, point.x, point.y, 15, 13);
dc.RoundRect(rect1, rect2, m_OldPoint.x, m_OldPoint.y, 15, 13);
dc.SelectObject(&m_PreviousBrush);
break;
case 5: dc.SelectObject(&m_CurrentPen);
dc.SelectObject(&m_CurrentBrush);
dc.SetROP2(R2_NOTXORPEN);
dc.RoundRect(rect1, rect2, point.x, point.y, 15, 13);
dc.RoundRect(rect1, rect2, m_OldPoint.x, m_OldPoint.y, 15, 13);
break;
case 6: dc.SelectObject(&HollowBrush);
dc.SelectObject(&m_CurrentPen);
dc.SetROP2(R2_NOTXORPEN);
dc.Ellipse(rect1, rect2, point.x, point.y);
dc.Ellipse(rect1, rect2, m_OldPoint.x, m_OldPoint.y);
dc.SelectObject(&m_PreviousBrush); // select default brush
break;
case 7: dc.SelectObject(&m_CurrentPen);
dc.SelectObject(&m_CurrentBrush);
dc.SetROP2(R2_NOTXORPEN);
dc.Ellipse(rect1, rect2, point.x, point.y);
dc.Ellipse(rect1, rect2, m_OldPoint.x, m_OldPoint.y);
break;
case 9: dc.SetROP2(R2_WHITE);
dc.SelectObject(&eraserPEN);
//dc.SelectObject(&eraserPEN);
dc.MoveTo(m_OldPoint.x, m_OldPoint.y);
dc.LineTo(point.x, point.y);
// dc.MoveTo(m_OldPoint.x, m_OldPoint.y);
break;
default: break;
}
}
if(b1==TRUE)
{
dc.MoveTo(m_OldPoint);
dc.LineTo(point);
}
m_OldPoint=point;
CView::OnMouseMove(nFlags, point);
}
void CDrawView::OnReset()
{
// TODO: Add your command handler code here
CClientDC DC(this);
DC.SelectObject(&m_bkbrush);
m_pHistoryStack->Add(NULL);
InvalidateRect(NULL);
}
void CDrawView::OnBlackbrush()
{
// TODO: Add your command handler code here
m_PreviousBrush.DeleteObject();
m_PreviousBrush.CreateStockObject(BLACK_BRUSH);
m_CurrentBrush.DeleteObject();
m_CurrentBrush.CreateStockObject(BLACK_BRUSH);
}
void CDrawView::OnBluebrush()
{
// TODO: Add your command handler code here
m_PreviousBrush.DeleteObject();
m_PreviousBrush.CreateSolidBrush(RGB(0,0,255));
m_CurrentBrush.DeleteObject();
m_CurrentBrush.CreateSolidBrush(RGB(0,0,255));
}
void CDrawView::OnCustomBrush()
{
// TODO: Add your command handler code here
CHOOSECOLOR dlgColor;
dlgColor.Flags = CC_RGBINIT | CC_FULLOPEN | CC_ANYCOLOR |CC_ENABLEHOOK;
dlgColor.lStructSize=sizeof (CHOOSECOLOR);
dlgColor.hwndOwner=NULL; //父窗口句柄
dlgColor.rgbResult=0;
MessageBox(_T("brush"));
// if (dlgColor != IDOK)
// return;
// m_CurrentBrush.DeleteObject();
// m_CurrentBrush.CreateSolidBrush(dlgColor.GetColor());
this->InvalidateRect(NULL);
}
void CDrawView::OnGreenbrush()
{
// TODO: Add your command handler code here
m_PreviousBrush.DeleteObject();
m_PreviousBrush.CreateSolidBrush(RGB(0,255,0));
m_CurrentBrush.DeleteObject();
m_CurrentBrush.CreateSolidBrush(RGB(0,255,0));
}
void CDrawView::OnRedbrush()
{
// TODO: Add your command handler code here
m_PreviousBrush.DeleteObject();
m_PreviousBrush.CreateSolidBrush(RGB(255,0,0));
m_CurrentBrush.DeleteObject();
m_CurrentBrush.CreateSolidBrush(RGB(255,0,0));
}
void CDrawView::OnWhitebrush()
{
// TODO: Add your command handler code here
m_PreviousBrush.DeleteObject();
m_PreviousBrush.CreateStockObject(WHITE_BRUSH);
m_CurrentBrush.DeleteObject();
m_CurrentBrush.CreateStockObject(WHITE_BRUSH);
}
void CDrawView::OnYellowbrush()
{
// TODO: Add your command handler code here
m_PreviousBrush.DeleteObject();
m_PreviousBrush.CreateSolidBrush(RGB(255,255,0));
m_CurrentBrush.DeleteObject();
m_CurrentBrush.CreateSolidBrush(RGB(255,255,0));
}
/*
***************************************************
pen
***************************************************
*/
void CDrawView::setSize()
{
m_RedPen.DeleteObject();
m_GreenPen.DeleteObject();
m_BluePen.DeleteObject();
m_YellowPen.DeleteObject();
m_CustPen.DeleteObject();
m_CurrentPen.DeleteObject();
m_RedPen.CreatePen(PS_SOLID, globalSIZE, RGB(255,0,0));
m_GreenPen.CreatePen(PS_SOLID, globalSIZE, RGB(0,255,0));
m_BluePen.CreatePen(PS_SOLID, globalSIZE, RGB(0,0,255));
m_YellowPen.CreatePen(PS_SOLID, globalSIZE, RGB(255, 255, 0));
m_CurrentPen.CreatePen(PS_SOLID, globalSIZE, corCol);
m_CustPen.CreatePen(PS_SOLID, globalSIZE, bgCol);
m_OldPen.DeleteObject();
m_OldPen.CreatePen(PS_SOLID, globalSIZE, RGB(0, 0, 0));
}
void CDrawView::OnBlackpen()
{
// TODO: Add your command handler code here
corCol = RGB(0, 0, 0);
globalPEN = 5;
setSize();
}
void CDrawView::OnBluepen()
{
// TODO: Add your command handler code here
corCol = RGB(0, 0, 255);
globalPEN = 3;
setSize();
}
void CDrawView::OnGreenpen()
{
// TODO: Add your command handler code here
corCol = RGB(0, 255, 0);
globalPEN = 2;
setSize();
}
void CDrawView::OnRedpen()
{
// TODO: Add your command handler code here
corCol = RGB(255, 0, 0);
globalPEN = 1;
setSize();
}
void CDrawView::OnYellowpen()
{
// TODO: Add your command handler code here
corCol = RGB(255, 255, 0);
globalPEN = 4;
setSize();
}
void CDrawView::OnCustomPen()
{
// TODO: Add your command handler code here
}
/*
***************************************************
size
***************************************************
*/
void CDrawView::OnOne()
{
// TODO: Add your command handler code here
globalSIZE = 1;
setSize();
}
void CDrawView::OnTwo()
{
// TODO: Add your command handler code here
globalSIZE = 2;
setSize();
}
void CDrawView::OnThree()
{
// TODO: Add your command handler code here
globalSIZE = 3;
setSize();
}
void CDrawView::OnCustomSize()
{
// TODO: Add your command handler code here
CCustomSizeDlg diagOb3(_T("CCustomSizeDlg"), this,globalSIZE);
diagOb3.DoModal();
// m_memDC.SelectObject(&m_OldPen);
setSize();
}
//**************************************************************************
//**************************************************************************
// *****************stack **************************************************
//**************************************************************************
void CDrawView::InitHistory(HBITMAP hBmp)
{
m_pHistoryStack->Clear();
m_pHistoryStack->Add(hBmp);
}
void CDrawView::RecordHistory()
{
HBITMAP hBmp = CanvasToBmp();
// MessageBox(_T("fdfdfd"));
if (hBmp!=NULL)
{
m_pHistoryStack->Add(hBmp);
}
}
HBITMAP CDrawView::CanvasToBmp()
{
CDC *pdc;
pdc=GetDC();
HBITMAP bm;
CBitmap bitmap;
CRect rect;
GetClientRect(&rect);
CDC memdc;
memdc.CreateCompatibleDC(pdc);
bitmap.CreateCompatibleBitmap(pdc, rect.Width(),rect.Height());
memdc.SelectObject(&bitmap);
//将dc中的拷贝到memdc中,又bitmap关联到了memdc ,所以这个时候bitmap中就是背景图了
memdc.BitBlt(0, 0, rect.Width(),rect.Height(), pdc, 0, 0, SRCCOPY);
//获得截图
bm=(HBITMAP)bitmap.GetSafeHandle();
//重要 取消关联 避免被释放
bitmap.Detach();
memdc.DeleteDC();
ReleaseDC(pdc);
return bm;
}
//**************************************************************************
// *****************Redo and Undo*******************************************
//**************************************************************************
void CDrawView::OnEditRedo()
{
// TODO: Add your command handler code here
if(redo<0&&m_pHistoryStack->CanRedo())
{
// MessageBox(_T("Redo"));
redo++;
undo++;
InvalidateRect(NULL);
}
}
void CDrawView::OnEditUndo()
{
// TODO: Add your command handler code here
if(undo>0&&m_pHistoryStack->CanUndo())
{
// MessageBox(_T("undo"));
redo--;
undo--;
InvalidateRect(NULL);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -