⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ladview.cpp

📁 PLC 编译器 VC++ SOURCE CODE
💻 CPP
字号:
// LADView.cpp : implementation file
//

#include "stdafx.h"
#include "MUL.h"
#include "LADDoc.h"
#include "LADView.h"
#include "AreSet.h"
#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//extern int CurrentCols;
//extern int CurrentRows;
extern int MaxRows;
extern int MaxCols;
extern int CurH;
extern int CurW;
/////////////////////////////////////////////////////////////////////////////
// CLADView

IMPLEMENT_DYNCREATE(CLADView, CScrollView)

CLADView::CLADView()
{
	m_pMemDc=new CDC;
	m_pBitmap=new CBitmap;
	OnSelectDrawType(ID_DRAW_FREE);
}

CLADView::~CLADView()
{
}


BEGIN_MESSAGE_MAP(CLADView, CScrollView)
	//{{AFX_MSG_MAP(CLADView)
	ON_WM_LBUTTONDBLCLK()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_SETCURSOR()
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_OPTION_WORKARE, OnOptionWorkare)
	//}}AFX_MSG_MAP
	ON_UPDATE_COMMAND_UI(ID_INDICATOR_MOUSE,OnUpdateMousePos)
	ON_COMMAND_RANGE(ID_DRAW_FREE,ID_DRAW_ERASE,OnSelectDrawType)
	ON_UPDATE_COMMAND_UI_RANGE(ID_DRAW_FREE,ID_DRAW_ERASE,OnUpdateSelectDrawType)
	ON_COMMAND_RANGE(ID_SELECT_SET,ID_SELECT_END,OnSelectWordType)
	ON_UPDATE_COMMAND_UI_RANGE(ID_SELECT_SET,ID_SELECT_END,UpdateWordType)
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLADView drawing

void CLADView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	CLADDoc*pDoc=GetDocument();
	ASSERT(pDoc);

	CSize sizeTotal;
	// TODO: calculate the total size of this view
	
	sign=FALSE;

	if (pDoc->OpenFlag)
	{
		MinWidth=pDoc->Cols;
		MinHigh=pDoc->Rows;
	}
	else
	{
		MinWidth=(GetSystemMetrics(SM_CXSCREEN)-57)/::CurW;
		MinHigh=GetSystemMetrics(SM_CYSCREEN)/::CurH;
	}
	if (MinWidth>(UINT)::MaxCols)
		MinWidth=::MaxCols;
 	
	CurrentCols=MinWidth;
	CurrentRows=MinHigh;
	pDoc->SetRowCol(CurrentRows,CurrentCols);

	m_nAreHigh=::CurH*MinHigh;
	m_nAreWidth=::CurW*MinWidth+50;
	//m_nCols=m_nAreWidth;
	sizeTotal.cx = m_nAreWidth+7;
	sizeTotal.cy =m_nAreHigh;
	SetScrollSizes(MM_TEXT, sizeTotal,CSize(600,400),CSize(60,80));
	
	CDC *pDC=GetDC();
	m_pMemDc->CreateCompatibleDC(pDC);
	m_pBitmap->CreateCompatibleBitmap(pDC,
		::MaxCols*::CurW+51,
		::MaxRows*::CurH);
	m_pOldBitmap=m_pMemDc->SelectObject(m_pBitmap);
	CFont myFont;
	myFont.CreateFont(12,
					  0,
					  0,
					  0,
					  FW_NORMAL,
					  FALSE,
					  FALSE,
					  FALSE,
					  GB2312_CHARSET,
					  OUT_DEFAULT_PRECIS,
					  CLIP_DEFAULT_PRECIS,
					  DEFAULT_QUALITY,
					  DEFAULT_PITCH|FF_MODERN,
					  "宋体");
	m_pMemDc->SelectObject(&myFont);
	m_pMemDc->SetTextColor(RGB(0,0,0));
	CPen drawpen;
	drawpen.CreateStockObject(BLACK_PEN);
	m_pMemDc->SelectObject(&drawpen);
	ReleaseDC(pDC);

	OnInitialWorkare();

	if (pDoc->OpenFlag)
		pDoc->UpdateWorkare(m_pMemDc);
}
void CLADView::OnDraw(CDC* pDC)
{
	CLADDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CRect workare;
	this->GetClientRect(&workare);
	CPoint workare_start=this->GetScrollPosition();
	pDC->BitBlt(workare_start.x,workare_start.y,
		workare.BottomRight().x,workare.BottomRight().y,
		m_pMemDc,workare_start.x,workare_start.y,SRCCOPY);
}

/////////////////////////////////////////////////////////////////////////////
// CLADView diagnostics

#ifdef _DEBUG
void CLADView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CLADView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLADView message handlers

CLADDoc* CLADView::GetDocument()
{
	return (CLADDoc*)m_pDocument;
}

void CLADView::OnUpdateMousePos(CCmdUI *pCmdUI)
{
	pCmdUI->Enable();
}

void CLADView::LINE(CPoint ptFrom, CPoint ptTo)
{
    CLADDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	int x1,y1,m,i;
	if (ptFrom.x==ptTo.x)
	{
		x1=ptFrom.x-::CurW;
		if (x1>=50)
		{
			if (ptFrom.y>ptTo.y)
				y1=ptTo.y;
			else
				y1=ptFrom.y;
			y1+=10;
			m=(abs(ptFrom.y-ptTo.y))/::CurH;
			for(i=0;i<m;i++)
			{
				pDoc->Process(51,x1,y1,m_pMemDc);
				y1+=::CurH;
			}
		}
	}
	if (ptFrom.y==ptTo.y)
	{
		y1=ptFrom.y-70;
		if (ptFrom.x>ptTo.x)
			x1=ptTo.x;
		else
			x1=ptFrom.x;
		m=(abs(ptFrom.x-ptTo.x))/::CurW;
		for(i=0;i<m;i++)
		{
			pDoc->Process(52,x1,y1,m_pMemDc);
			x1+=::CurW;
		}
	}
	this->Invalidate(FALSE);
}


void CLADView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	CScrollView::OnBeginPrinting(pDC, pInfo);
}

void CLADView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	CScrollView::OnEndPrinting(pDC, pInfo);
}

BOOL CLADView::OnPreparePrinting(CPrintInfo* pInfo) 
{
	// TODO: call DoPreparePrinting to invoke the Print dialog box
	
	return CScrollView::DoPreparePrinting(pInfo);
}

void CLADView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CLADDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);	
	CPoint drawseat;
	drawseat=this->GetScrollPosition();
	drawseat.x+=point.x;
	if (drawseat.x>50 && m_nDrawType==0)
	{
		drawseat.y+=point.y;
		pDoc->ReDraw(drawseat.x,drawseat.y,
			m_pMemDc);
		this->Invalidate(FALSE);
	}
	CScrollView::OnLButtonDblClk(nFlags, point);
}

void CLADView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CLADDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	SetCapture();
	
	if (point.x>50 && point.x<m_nAreWidth && m_nDrawType>0)
	{
		CPoint drawseat;
		drawseat=this->GetScrollPosition();
		drawseat+=point;
        drawseat.x=((drawseat.x-50)/::CurW)*::CurW+50;
		drawseat.y=(drawseat.y/::CurH)*::CurH;
		m_pFrom=drawseat;
		if (m_nDrawType==5)
		{
			sign=TRUE;
			m_pFrom=drawseat;
			m_pFrom.y+=70;
			m_pTo=m_pFrom;
		}
		else
		{
	   	pDoc->Process(m_nDrawType,drawseat.x,drawseat.y,
			m_pMemDc);
		this->Invalidate(FALSE);
		}

		CScrollView::OnLButtonDown(nFlags, point);
	}
}

void CLADView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if (m_nDrawType==5)
	{
		CPoint drawseat;
		sign=FALSE;
		drawseat=this->GetScrollPosition();
		drawseat+=point;
		if (point.x<=50)
			drawseat.x=drawseat.x-point.x+50;
		m_pTo.x=((drawseat.x-50)/::CurW)*::CurW+50;
		m_pTo.y=(drawseat.y/::CurH)*::CurH+70;
        if(abs(m_pFrom.x-drawseat.x)<abs(m_pFrom.y-drawseat.y))
        {
	      m_pTo.x=m_pFrom.x;
		}
	    else
        {
	      m_pTo.y=m_pFrom.y;
		}
		if (m_pFrom!=m_pTo)
			LINE(m_pFrom,m_pTo);
          
    }
	ReleaseCapture();
	CScrollView::OnLButtonUp(nFlags, point);
}

void CLADView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CPoint m_endpoint;
    CPoint pos;
	CPoint rcClient;
	pos=GetScrollPosition();
	rcClient=pos+point;
	if (point.x>50)
	{
		CString strMousePosition;
		m_nPos.x=(rcClient.x-50)/::CurW+1;
		m_nPos.y=rcClient.y/::CurH+1;
		strMousePosition.Format(" Ln %d,Col %d",
			m_nPos.y,m_nPos.x);
		CMainFrame *pMainFrame=(CMainFrame*)AfxGetMainWnd();
		pMainFrame->SetMousePosText(strMousePosition);
	}
	else
		rcClient.x=rcClient.x-point.x+50;
	
	if (m_nDrawType==5 && sign)
	{
		CDC *pDC;
		pDC=this->GetDC();
		CRect rect(m_pFrom,m_pTo);	
		rect.NormalizeRect();
		rect.InflateRect(1,1);
        CPoint temp1;
		temp1.x=rect.left-pos.x;
		temp1.y=rect.top-pos.y;
		pDC->BitBlt(temp1.x,temp1.y,rect.Width(),rect.Height(),
		    m_pMemDc,rect.left,rect.top,SRCCOPY);
		m_endpoint.x=((rcClient.x-50)/::CurW)*::CurW+50;
		m_endpoint.y=(rcClient.y/::CurH)*::CurH+70;
		if(abs(m_pFrom.x-rcClient.x)<abs(m_pFrom.y-rcClient.y))
			m_endpoint.x=m_pFrom.x;
		else
			m_endpoint.y=m_pFrom.y;
		temp1=m_pFrom-pos;
		CPoint temp2=m_endpoint-pos;
		pDC->MoveTo(temp1);
		pDC->LineTo(temp2);
		m_pTo=m_endpoint;
		ReleaseDC(pDC); 
	}
      
	CScrollView::OnMouseMove(nFlags, point);
}

BOOL CLADView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	// TODO: Add your message handler code here and/or call default
	switch(m_nDrawType)
	{
	case 1:
		::SetCursor(AfxGetApp()->LoadCursor(IDC_LD));
		break;
	case 2:
		::SetCursor(AfxGetApp()->LoadCursor(IDC_LDI));
		break;
	case 3:
		::SetCursor(AfxGetApp()->LoadCursor(IDC_OR));
		break;
	case 4:
		::SetCursor(AfxGetApp()->LoadCursor(IDC_ORI));
		break;
	case 5:
		::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));
		break;
	case 6:
		::SetCursor(AfxGetApp()->LoadCursor(IDC_OUT));
		break;
	case 7:
		::SetCursor(AfxGetApp()->LoadCursor(IDC_ADDITION));
		break;
	default:
		::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
		break;
	}
	return TRUE;
	//return CScrollView::OnSetCursor(pWnd, nHitTest, message);
}

void CLADView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	// TODO: Add your message handler code here
		CRect rect;
	AfxGetMainWnd()->GetWindowRect(&rect);
	rect.left=point.x-rect.left;
	if( rect.left>50)//m_nDrawType==7 &&
    {	
		CLADDoc* pDoc = GetDocument();
		ASSERT_VALID(pDoc);
		int row,col;
		row=m_nPos.y-1;
		col=m_nPos.x-1;
	    int pointype;
		pointype=pDoc->TestPointType(row,col);
		if (pointype==2)
		{
			CMenu menu;
			menu.LoadMenu(IDR_ITEMMENU);
			CMenu *pContexMenu=menu.GetSubMenu(0);
			pContexMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
			point.x,point.y,AfxGetMainWnd());
		}
	}
}

void CLADView::OnOptionWorkare() 
{
	// TODO: Add your command handler code here
	CLADDoc* pDoc=GetDocument();
	ASSERT(pDoc);
	CAreSet dlgAreSet(this);
	MinWidth=(GetSystemMetrics(SM_CXSCREEN)-57)/::CurW;
	if (MinWidth>(UINT)::MaxCols)
		MinWidth=::MaxCols;
	MinHigh=GetSystemMetrics(SM_CYSCREEN)/::CurH;
	dlgAreSet.InitData(MinWidth,(UINT)::MaxCols,MinHigh,(UINT)::MaxRows);
	int nRetCode=dlgAreSet.DoModal();
	if (nRetCode==IDOK)
	{
		CWaitCursor wait;
		m_nAreHigh=dlgAreSet.m_nHigh ;
		CurrentRows=m_nAreHigh;
		m_nAreWidth=dlgAreSet.m_nWidth;
		CurrentCols=m_nAreWidth;
		m_nAreHigh*=::CurH;
		m_nAreWidth*=::CurW;
		m_nAreWidth+=50;
		CSize sizeTotal;
		sizeTotal.cx = m_nAreWidth+7;
		sizeTotal.cy =m_nAreHigh;
		SetScrollSizes(MM_TEXT, sizeTotal,CSize(600,400),CSize(60,80));
		OnInitialWorkare();
		pDoc->SetRowCol(CurrentRows,CurrentCols);
		pDoc->UpdateWorkare(m_pMemDc);
	}
}

BOOL CLADView::PreCreateWindow(CREATESTRUCT& cs) 
{
	// TODO: Add your specialized code here and/or call the base class
	AfxGetApp()->BeginWaitCursor();
	return CScrollView::PreCreateWindow(cs);
}

void CLADView::OnInitialWorkare()
{
	CWaitCursor wait;
  	CBrush brush;
	brush.CreateStockObject(WHITE_BRUSH);
	CRect m_cWorkare(-1,-1,::MaxCols*::CurW+50,
		::MaxRows*::CurH);//MaxWidth,MaxHigh);
	m_pMemDc->FillRect(m_cWorkare,&brush);

	m_pMemDc->MoveTo(50,0);
	m_pMemDc->LineTo(50,m_nAreHigh);
	m_pMemDc->MoveTo(m_nAreWidth,m_nAreHigh);
	m_pMemDc->LineTo(m_nAreWidth,0);
	
	for (int i=::CurW+50;i<m_nAreWidth;i+=::CurW)
		for (int j=::CurH;j<m_nAreHigh;j+=::CurH)
			m_pMemDc->SetPixel(i,j-10,1);
	Invalidate(FALSE);
}

void CLADView::OnSelectDrawType(UINT nID)
{
	ASSERT(nID>=ID_DRAW_FREE && nID<=ID_DRAW_ERASE);
	m_nDrawType=nID-ID_DRAW_FREE;

}

void CLADView::OnUpdateSelectDrawType(CCmdUI *pCmdUI)
{

	UINT nID=pCmdUI->m_nID-ID_DRAW_FREE;
	if (nID==m_nDrawType)
		pCmdUI->SetCheck(TRUE);
	else
		pCmdUI->SetCheck(FALSE);
}

void CLADView::OnSelectWordType(UINT nID)
{
    ASSERT(nID>=ID_SELECT_SET && nID<=ID_SELECT_END);
	m_nWordType=nID-ID_SELECT_SET;
	CLADDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc); 
    int row,col;
	CString str;
	int flag;
	row=m_nPos.y-1;
	col=m_nPos.x-1;
	switch(m_nWordType)
	{
	case 0:
		flag=8;
		str="SET";
		break;
	case 1:
		flag=18;
		str="RST";
		break;
	case  2:
		flag=9;
		str="S";
		break;
	case  3:
		flag=19;
		str="R";
		break;
	case  4:
		flag=10;
		str="MC";
	    break;
	case  5:
		flag=11;
		str="MCR";
		break;
	case  6:
		flag=12;
		str="K";
		break;
	case  7:
		flag=13;
		str="F";
		break;
	case  10:
		flag=14;
		str="PLS";
		break;
	case  11:
		flag=15;
		str="END";
		break;
	case  8:
	case  9:
		flag=100;
		str="";
		break;
	}
	pDoc->SetAddition(row,col,flag,str);
	CPoint point;
	point.x=col*::CurW+80;
	point.y=row*::CurH+76;
	CBrush  brush;
	CBrush  *pOldBrush=NULL; 
	brush.CreateStockObject(WHITE_BRUSH);
	pOldBrush=m_pMemDc->SelectObject(&brush);
	CRect rect(point.x-13,point.y-11,point.x+12,point.y);
	m_pMemDc->FillRect(rect,&brush);
	m_pMemDc->SelectObject(pOldBrush);
	m_pMemDc->TextOut(point.x,point.y,str);
	this->Invalidate(FALSE);
	
}

void CLADView::UpdateWordType(CCmdUI *pCmdUI)
{
	UINT nID1=pCmdUI->m_nID-ID_SELECT_SET;
	if (nID1==m_nWordType)
		pCmdUI->SetCheck(TRUE);
	else
		pCmdUI->SetCheck(FALSE);  
}

void CLADView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) 
{
	// TODO: Add your specialized code here and/or call the base class
	AfxGetApp()->EndWaitCursor();
	CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);
}

void CLADView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
	int nWidth;
	int nHeight;
	
	//pDC->SetMapMode(MM_LOMETRIC);
	CRect m_rcPrintRect;
	
	if (pInfo) m_rcPrintRect=pInfo->m_rectDraw;

	double dWidthRatio=(double)m_rcPrintRect.Height()/
						(double)m_rcPrintRect.Width();
	
	nWidth=m_nAreWidth+7;//MaxWidth*m_nCurSorWidth+57
	nHeight=(int)(nWidth*dWidthRatio);
	
	int result=pDC->StretchBlt(m_rcPrintRect.TopLeft().x,m_rcPrintRect.TopLeft().y,
		m_rcPrintRect.Width(),m_rcPrintRect.Height(),m_pMemDc,0,0,nWidth,
		nHeight,SRCCOPY);
	//CScrollView::OnPrint(pDC, pInfo);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -