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

📄 rsimagestarview.cpp

📁 c语言实现的遥感图像处理的一些基本操作
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				ymax=m_pDoc->pTempPt->point.y;	
   
			if(m_fScale<=1.0)
				DibToClient(pos[i]);
			i++;
			m_pDoc->pTempPt=m_pDoc->pTempPt->next;
		}

		if(i<=2)
		{
			m_pDoc->pTempPt=m_pDoc->pHead;
			if(m_pDoc->pTempPt!=NULL)
			{
				while(m_pDoc->pTempPt!=NULL)
				{
					struct Vertex *temp=m_pDoc->pTempPt;
					m_pDoc->pTempPt=m_pDoc->pTempPt->next;
					free(temp);
				}
				m_pDoc->pHead=NULL;
				Invalidate(false);
			}
			return;
		}

		m_DibRect.left=xmin;
		m_DibRect.right=xmax;
        m_DibRect.top=ymin;
		m_DibRect.bottom=ymax;
		m_DrawRect=m_DibRect;
        DibToClient(m_DrawRect);
        CreateRgn();
		if(time==-1)
			time=SetTimer(1,300,NULL);
	}

	else if(m_ToolOption==Text)
	{
		if(m_pDoc->pHead==NULL)
			return;
		CPoint pt = point;
		CClientDC dc(this);
		OnPrepareDC(&dc);

		dc.DPtoLP(&pt);
//		ClientToDib(pt);
//		CDC * pDibDC = m_pDoc->curptr->dib->BeginPaint(&dc);
		int nOldRop = dc.SetROP2(R2_NOTXORPEN);
		
		dc.MoveTo(temppoint);
		dc.LineTo(pt);
		dc.SetROP2(nOldRop);
//		m_pDoc->curptr->dib->EndPaint();
		Invalidate(false);

        m_TextCurve=false;

		int mm=logfont.lfHeight;
		float ratio =(float(GetSystemMetrics(SM_CXSCREEN))/float(GetSystemMetrics(SM_CYSCREEN))); 
        float width=float(-mm*ratio/4.0);

		int xmin,ymin,xmax,ymax;
		xmin=ymin= 100000;
	    xmax=ymax=-100000;

		m_pDoc->pTempPt=m_pDoc->pHead;
		float length=float(0.0);
        while(m_pDoc->pTempPt!=NULL)
		{
			if(m_pDoc->pTempPt->next!=NULL)
				length+=float(sqrt((m_pDoc->pTempPt->point.x-m_pDoc->pTempPt->next->point.x)*
				        (m_pDoc->pTempPt->point.x-m_pDoc->pTempPt->next->point.x)+
				        (m_pDoc->pTempPt->point.y-m_pDoc->pTempPt->next->point.y)*
				        (m_pDoc->pTempPt->point.y-m_pDoc->pTempPt->next->point.y)));
            m_pDoc->pTempPt->length=length;

			if(m_pDoc->pTempPt->point.x<xmin)
				xmin=m_pDoc->pTempPt->point.x;
			if(m_pDoc->pTempPt->point.x>xmax)
				xmax=m_pDoc->pTempPt->point.x;
			if(m_pDoc->pTempPt->point.y<ymin)
				ymin=m_pDoc->pTempPt->point.y;
			if(m_pDoc->pTempPt->point.y>ymax)
				ymax=m_pDoc->pTempPt->point.y;	

            m_pDoc->pTempPt=m_pDoc->pTempPt->next;
		}
		m_InVRect.left=xmin+mm;
		m_InVRect.top=int(ymin-width+0.5);
		m_InVRect.right=int(xmax+width+0.5);
		m_InVRect.bottom=ymax-mm;
		for(int i=0;i<200;i++)
		    num[i]=0;
        strfont1=strfont;
		int m,total,n=strfont1.GetLength();
		m=0;
		total=n;
		while(n)
		{
			char ch=strfont1.GetAt(total-n);
			if((ch>=0))
			{
			    while((ch>=0)&&(ch!=' '))
				{
					n--;
				    num[m]++;
					if(n>0)
				      ch=strfont1.GetAt(total-n);
					else
						ch=-1;

				}
				if(ch==' ')
				{
					while(ch==' ')
					{
						strfont1.Delete(total-n,1);
						n--;
						total-=1;
						if(n>0)
						   ch=strfont1.GetAt(total-n);
						else
							ch=-1;
					}
				}
			}
            else
			{
			   n-=2;
			   num[m]=2;
			}
			m++;
		}
		int m_TextPos,count;
		m_TextPos=0;
		count=strfont1.GetLength();
        float seg=float((length-count*width)/(m-1));
		if(seg<0.0)
		{
			AfxMessageBox("输入字符在指定线段上放不下!");
			m_pDoc->pTempPt=m_pDoc->pHead;
			while(m_pDoc->pTempPt!=NULL)
			{
				struct Vertex *temp=m_pDoc->pTempPt;
				m_pDoc->pTempPt=m_pDoc->pTempPt->next;
				free(temp);
			}
			m_pDoc->pHead=NULL;
			return;
		}
		float offset,m_res;
        m_res=float(0.0);
		m_pDoc->pTempPt=m_pDoc->pHead;

	    offset=0.0;

        while(m_pDoc->pTempPt->next!=NULL)
		{
			 int TextNum=0;	
             if(m_pDoc->pTempPt->pre==NULL)
			 {
				 if(seg!=0)
				    count=int((m_pDoc->pTempPt->length-offset*2)/seg+0.5);
				 if(count>200)
					 count=200;
				 for(int i=0;i<count;i++)
					 TextNum+=num[i];
				 while((m_pDoc->pTempPt->length-offset-(count-1)*seg-
					 TextNum*width+0.5)<0.0)
				 {
					 count--;
				     TextNum-=num[count];
				 }
				 i=0;
				 TextNum=0;
				 while(count>0)
				 {
					 float degree;
					 degree=float(atan2((m_pDoc->pTempPt->next->point.y-m_pDoc->pTempPt->point.y),
						 (m_pDoc->pTempPt->next->point.x-m_pDoc->pTempPt->point.x)));
					 CPoint pos;
					 if(m_TextPos)
						 TextNum+=num[m_TextPos-1];
					 pos.x=int(m_pDoc->pTempPt->point.x+(i*seg+offset+
						 TextNum*width)*cos(degree));
					 pos.y=int(m_pDoc->pTempPt->point.y+(i*seg+offset+
						 TextNum*width)*sin(degree));
					 i++;
					 count--;
				     degree=float(-degree*180/3.1415926);
                     DisPlayText(pos,degree,m_TextPos);
					 m_TextPos++;
				 }
				 if(i>0)
				   m_res=m_pDoc->pTempPt->length-(i-1)*seg-offset-(TextNum+num[m_TextPos-1])*width;
				 else
                   m_res=m_pDoc->pTempPt->length;
				 m_pDoc->pTempPt=m_pDoc->pTempPt->next;
			 }
			 else
			 {
				 count=int((m_pDoc->pTempPt->length-m_pDoc->pTempPt->pre->length-offset*2)/seg+0.5);
				 TextNum=0;
				 for(int i=0;i<count;i++)
					 TextNum+=num[m_TextPos+i];
				 while((m_pDoc->pTempPt->length-m_pDoc->pTempPt->pre->length-offset-(count-1)*seg-
					 TextNum*width+0.5)<0.0)
				 {
					 count--;
				     TextNum-=num[m_TextPos+count];
				 }
				 i=1;
				 TextNum=0;
				 while(count)
				 {
					 float degree;
					 degree=float(atan2((m_pDoc->pTempPt->next->point.y-m_pDoc->pTempPt->point.y),
						 (m_pDoc->pTempPt->next->point.x-m_pDoc->pTempPt->point.x)));
					 CPoint pos;
					 if(i>1)
						 TextNum+=num[m_TextPos-1];
					 pos.x=int(m_pDoc->pTempPt->point.x+(i*seg+offset-m_res+
						 TextNum*width)*cos(degree));
					 pos.y=int(m_pDoc->pTempPt->point.y+(i*seg+offset-m_res+
						 TextNum*width)*sin(degree));

					 i++;
					 count--;
				     degree=float(-degree*180/3.1415926);
                     DisPlayText(pos,degree,m_TextPos);
					 m_TextPos++;
				 }
				 if(i>1)
				   m_res=m_pDoc->pTempPt->length-m_pDoc->pTempPt->pre->length-(i-2)*seg-offset-(TextNum+num[m_TextPos-1])*width;
				 else
                   m_res=m_pDoc->pTempPt->length-m_pDoc->pTempPt->pre->length+m_res;
				 m_pDoc->pTempPt=m_pDoc->pTempPt->next;
			 }

		}
        m_pDoc->pTempPt=m_pDoc->pHead;
		while(m_pDoc->pTempPt!=NULL)
		{
			struct Vertex *temp=m_pDoc->pTempPt;
			m_pDoc->pTempPt=m_pDoc->pTempPt->next;
			free(temp);
		}
		m_pDoc->pHead=NULL;
		m_InValidateRect=true;
		DibToClient(m_InVRect);
		dc.LPtoDP(m_InVRect);
		InvalidateRect(m_InVRect,false);
	}
	CScrollView::OnRButtonDown(nFlags, point);
}

void CRSImageStarView::DisPlayText(CPoint pos,float degree,int count)
{
	CFont fontTest;
	degree*=10.0;
	logfont.lfClipPrecision=CLIP_LH_ANGLES;
	logfont.lfEscapement=int(degree);
	fontTest.CreateFont(logfont.lfHeight,logfont.lfWidth,
					logfont.lfEscapement,logfont.lfOrientation,
					logfont.lfWeight,logfont.lfItalic,
					logfont.lfUnderline,logfont.lfStrikeOut,
					logfont.lfCharSet,logfont.lfOutPrecision,
					logfont.lfClipPrecision,logfont.lfQuality,
					logfont.lfPitchAndFamily,logfont.lfFaceName);
				
				
	CClientDC dc(this);
	CString str;
	int m_TextPos=0;
	for(int i=0;i<=count;i++)
       m_TextPos+=num[i];
	str=strfont1.Left(m_TextPos);
	str=str.Right(num[count]);
	CDC * pDibDC = m_pDoc->curptr->dib->BeginPaint(&dc);
	pDibDC->SetBkMode(TRANSPARENT);
	CFont* pOldFont = pDibDC->SelectObject(&fontTest);
	pDibDC->SetTextColor(m_TextColor);
	pDibDC->TextOut(pos.x,pos.y,str);
	pDibDC->SelectObject(pOldFont);
	m_pDoc->curptr->dib->EndPaint();
	fontTest.DeleteObject();
//	m_pDoc->curptr->dib->DIBSectionToDIB(startpoint.y,startpoint.y+logfont.lfHeight);
}

BOOL CRSImageStarView::CreateRgn()
{
	int m_back=0;
	if(m_pDoc->curptr->dib->m_Rgn!=NULL)
	{
		delete m_pDoc->curptr->dib->m_Rgn;	
		m_pDoc->curptr->dib->m_Rgn=NULL;
	}
	m_pDoc->curptr->dib->m_Rgn=new CRgn;
	m_pDoc->curptr->dib->m_RgnRect=m_DibRect;
	m_pDoc->pTempPt=m_pDoc->pHead;
	if(m_pDoc->pTempPt!=NULL)
	{
		CPoint pos1[200];
		int i=0;
		m_pDoc->pTempPt=m_pDoc->pHead;
		while(m_pDoc->pTempPt!=NULL)
		{
			pos1[i]=m_pDoc->pTempPt->point;
			if(m_fScale<1.0)
			  DibToClient(pos1[i]);
			i++;
			m_pDoc->pTempPt=m_pDoc->pTempPt->next;
		}
		m_back=m_pDoc->curptr->dib->m_Rgn->CreatePolygonRgn(&pos1[0],i,WINDING);
	}
	else
	{
		if(m_fScale<1.0)
		{
			if(m_DrawType==SELECT)
				m_back=m_pDoc->curptr->dib->m_Rgn->CreateRectRgn(m_DrawRect.left,m_DrawRect.top,
				m_DrawRect.right,m_DrawRect.bottom);
			else if(m_DrawType==ROUND)
				m_back=m_pDoc->curptr->dib->m_Rgn->CreateRoundRectRgn(m_DrawRect.left,m_DrawRect.top,
				m_DrawRect.right,m_DrawRect.bottom,int(m_DrawRect.Width()/5.0),int(m_DrawRect.Height()/5.0));
			else if(m_DrawType==OVAL)
				m_back=m_pDoc->curptr->dib->m_Rgn->CreateEllipticRgn(m_DrawRect.left,m_DrawRect.top,
				m_DrawRect.right,m_DrawRect.bottom);
		}
		else
		{
			if(m_DrawType==SELECT)
				m_back=m_pDoc->curptr->dib->m_Rgn->CreateRectRgn(m_DibRect.left,m_DibRect.top,
				m_DibRect.right,m_DibRect.bottom);
			else if(m_DrawType==ROUND)
				m_back=m_pDoc->curptr->dib->m_Rgn->CreateRoundRectRgn(m_DibRect.left,m_DibRect.top,
				m_DibRect.right,m_DibRect.bottom,int(m_DibRect.Width()/5.0),int(m_DibRect.Height()/5.0));
			else if(m_DrawType==OVAL)
				m_back=m_pDoc->curptr->dib->m_Rgn->CreateEllipticRgn(m_DibRect.left,m_DibRect.top,
				m_DibRect.right,m_DibRect.bottom);
		}
	}

	if(m_back)
	  return true;
	else
	  return false;
}

BOOL CRSImageStarView::CreateRgn1(struct  Layer * Curptr)
{
	int m_back=0;
	if(Curptr->dib->m_Rgn!=NULL)
	{
		delete Curptr->dib->m_Rgn;	
		Curptr->dib->m_Rgn=NULL;
	}
	Curptr->dib->m_Rgn=new CRgn;
	Curptr->dib->m_RgnRect=m_DibRect;
	m_pDoc->pTempPt=m_pDoc->pHead;
	if(m_pDoc->pTempPt!=NULL)
	{
		CPoint pos1[200];
		int i=0;
		m_pDoc->pTempPt=m_pDoc->pHead;
		while(m_pDoc->pTempPt!=NULL)
		{
			pos1[i]=m_pDoc->pTempPt->point;
			i++;
			m_pDoc->pTempPt=m_pDoc->pTempPt->next;
		}
		m_back=Curptr->dib->m_Rgn->CreatePolygonRgn(&pos1[0],i,WINDING);
	}
	else
	{
		if(m_DrawType==SELECT)
			m_back=Curptr->dib->m_Rgn->CreateRectRgn(m_DibRect.left,m_DibRect.top,
			m_DibRect.right,m_DibRect.bottom);
		else if(m_DrawType==ROUND)
			m_back=Curptr->dib->m_Rgn->CreateRoundRectRgn(m_DibRect.left,m_DibRect.top,
			m_DibRect.right,m_DibRect.bottom,int(m_DibRect.Width()/5.0),int(m_DibRect.Height()/5.0));
		else if(m_DrawType==OVAL)
			m_back=Curptr->dib->m_Rgn->CreateEllipticRgn(m_DibRect.left,m_DibRect.top,
			m_DibRect.right,m_DibRect.bottom);
		else if(m_DrawType==OVAL)
			m_back=Curptr->dib->m_Rgn->CreateRectRgn(m_DibRect.left,m_DibRect.top,
			m_DibRect.right,m_DibRect.bottom);
	}

	if(m_back)
	  return true;
	else
	  return false;
}

void CRSImageStarView::RgnOffset(CPoint point)
{
	CPoint pos,pos1;
	pos=point;
	CClientDC dc(this);
	OnPrepareDC(&dc);
	dc.DPtoLP(&pos);
	pos1=pos;
	pos.x-=temppoint.x;
	pos.y-=temppoint.y;
	CSize size;
	size=GetTotalSize();
	if((m_DrawRect.left+pos.x)<=0)
		pos.x=-m_DrawRect.left;
	if((m_DrawRect.top+pos.y)<=0)
		pos.y=-m_DrawRect.top;
	if((m_DrawRect.right+pos.x)>=size.cx)
		pos.x=size.cx-m_DrawRect.right;
	if((m_DrawRect.bottom+pos.y)>=size.cy)
		pos.y=size.cy-m_DrawRect.bottom;
	ClientToDib(pos);
	m_pDoc->pTempPt=m_pDoc->pHead;
	while(m_pDoc->pTempPt!=NULL)
	{
		m_pDoc->pTempPt->point+=pos;
		m_pDoc->pTempPt=m_pDoc->pTempPt->next;
	}
    m_DibRect.OffsetRect(pos);
	m_DrawRect=m_DibRect;
	DibToClient(m_DrawRect);
	temppoint=pos1;
}

void CRSImageStarView::OnEditCut() 
{
	// TODO: Add your command handler code here
	CPoint Luppoint,Rbottompoint;
    
    CRect rect;
	rect=m_DibRect;

	Luppoint.x=rect.left;
	Luppoint.y=rect.top;
	Rbottompoint.x=rect.right;
	Rbottompoint.y=rect.bottom;
//拷贝选择区域到剪切板
    m_pDoc->m_Dib->GetCopyHandle(Luppoint,Rbottompoint);
	m_pDoc->m_Dib->CopyToClipboard();

	COLORREF FillColor;
	if(m_pDoc->curptr->pre==NULL)
		FillColor=m_crFillColor;
	else
		FillColor=TransColor;
	CBrush brush(FillColor);
	CClientDC dc(this);
	CBrush* pOldBrush = dc.SelectObject(&brush);
	CPen pen(PS_SOLID, 1, FillColor);
			  
	CDC * pDibDC = m_pDoc->m_Dib->BeginPaint(&dc);
	CPen *oldpen=pDibDC->SelectObject(&pen);
	pOldBrush = pDibDC->SelectObject(&brush);
	if(m_DrawRect.Width()>1)
	{
		CRect rect=m_DibRect;
		if(m_DrawType==SELECT)
			pDibDC->FillRect(rect,&brush);
		else if(m_DrawType==ROUND)
		{
			CPoint pos; 
			pos.x=int(rect.Width()/5.0);
			pos.y=int(rect.Height()/5.0);
			pDibDC->RoundRect(rect,pos);
		}
		else if(m_DrawType==OVAL)
		{
			pDibDC->Ellipse(rect);
		}
		else if(m_DrawType==CURVE)
		{
			if(m_pDoc->pHead!=NULL)
			{
				CPoint pos1[200];
				int i=0;
				m_pDoc->pTempPt=m_pDoc->pHead;
				while(m_pDoc->pTempPt!=NULL)
				{
					pos1[i]=m_pDoc->pTempPt->point;
					i++;
					m_pDoc->pTempPt=m_pDoc->pTempPt->next;
				}
				pDibDC->Polygon(&pos1[0],i); 
			}
		}
	}
	pDibDC->SelectObject(oldpen);
	pDibDC->SelectObject(pOldBrush);
	m_pDoc->m_Dib->EndPaint();
	InvalidateRect(m_DrawRect,false);
}

void CRSImageStarView::OnUpdateEditCut(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
    CRect rect;
	rect=m_DrawRect;
    pCmdUI->Enable((rect.Width()>=2)&&(rect.Height()>=2));	
}

void CRSImageStarView::OnLayerColor()
{
	if(m_pDoc->curptr->pre!=NULL)
	{
		CColorDialog dlgColor(m_crPenColor);
		if (dlgColor.DoModal() == IDOK)
		{
			COLORREF color = dlgColor.GetColor();
			if(IDOK==AfxMessageBox("你将会改变当前层画笔的颜色!",MB_OKCANCEL|MB_ICONQUESTION))
			{
//				m_pDoc->curptr->dib->C

⌨️ 快捷键说明

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