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

📄 drawpicture.cpp

📁 此为《Visual C++数字图像实用工程案例精选》一书随书光盘 徐惠等编著 人民邮电出版社出版
💻 CPP
字号:
// DrawPicture.cpp: implementation of the DrawPicture class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Designer.h"
#include "DrawPicture.h"
#include "DesignerView.h"
#include "DIBAPI.h"
#include "math.h"
#include "MainFrm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define LINELENTH 50
extern int global_STEP;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

DrawPicture::DrawPicture()
{	
	PaneNum =0;
}

DrawPicture::~DrawPicture()
{

}

void DrawPicture::Line(CPoint pFrom, CPoint pEnd, CDC *dc,COLORREF rgb,int steplen,float m_jwm,CPoint scroll,bool Saveornot)
{	
	

}
#define PI 3.1415926
void DrawPicture::Circle(CDC *pDC, CPoint MousePosition,  COLORREF rgb,float m_jwm, bool saveornot,CPoint scroll,RECTSINFO* PCircle)
{
	CBrush cbr;
	cbr.CreateSolidBrush(rgb);
	int templen = (int)(global_STEP*m_jwm);
	CPoint temp ;
	temp.x = PCircle->LeftTop.x + scroll.x;
	temp.y = PCircle->LeftTop.y + scroll.y;
	int radius =(int) (sqrt((MousePosition.x -PCircle->LeftTop.x )*(MousePosition.x - PCircle->LeftTop.x )+(MousePosition.y - PCircle->LeftTop.y)*(MousePosition.y - PCircle->LeftTop.y)));
	
	CPoint wglocation ;
	
	double step = 2*PI/180; 
	for(int i =0;i<4*LINENUM;i++)
		PCircle->RectsInfo[i].location.x = PCircle->RectsInfo[i].location.y = -1;
	CPoint currentPoint;
	PCircle->RectLen=1;
	for(double theta=0.0;theta<=2*PI;theta+=step)
	{
		int xoffset = (int)(radius*cos(theta));
		int yoffset = (int)(radius*sin(theta));
		currentPoint.x = PCircle->LeftTop.x + xoffset+scroll.x;
		currentPoint.y = PCircle->LeftTop.y + yoffset+scroll.y;
		CPoint kkk(0,0);
		wglocation = gLocatePoint(currentPoint,m_jwm,kkk);
		if(PCircle->RectsInfo[PCircle->RectLen-1].location.x != wglocation.x || 
			PCircle->RectsInfo[PCircle->RectLen-1].location.y != wglocation.y)
		{
			PCircle->RectsInfo[PCircle->RectLen].location = wglocation;
			PCircle->RectLen++;
		}
			
	}
	CMainFrame * pFrame = static_cast <CMainFrame *>(AfxGetMainWnd());
	CDesignerView *m_pShowPhotoView = pFrame->GetMainView();
	for( i=1;i<(int)PCircle->RectLen;i++)
	{
		if(PCircle->RectsInfo[i].location.x <0)
			PCircle->RectsInfo[i].location.x =0;
		if(PCircle->RectsInfo[i].location.y <0)
			PCircle->RectsInfo[i].location.y =0;
		if(PCircle->RectsInfo[i].location.x >m_pShowPhotoView->m_LineNum.x-1)
			PCircle->RectsInfo[i].location.x = m_pShowPhotoView->m_LineNum.x-1;
		if(PCircle->RectsInfo[i].location.y >m_pShowPhotoView->m_LineNum.y-1)
			PCircle->RectsInfo[i].location.y = m_pShowPhotoView->m_LineNum.y-1;
	}
	for(i =1;i<(int)PCircle->RectLen;i++)
	{
		if((PCircle->RectsInfo[i-1].location.y == PCircle->RectsInfo[i].location.y &&
			PCircle->RectsInfo[i-1].location.x > PCircle->RectsInfo[i].location.x &&
			PCircle->RectsInfo[i].location.y > PCircle->RectsInfo[i+1].location.y &&
			PCircle->RectsInfo[i].location.x == PCircle->RectsInfo[i+1].location.x )||
			(PCircle->RectsInfo[i-1].location.x == PCircle->RectsInfo[i].location.x &&
			PCircle->RectsInfo[i-1].location.y < PCircle->RectsInfo[i].location.y && 
			PCircle->RectsInfo[i].location.x > PCircle->RectsInfo[i+1].location.x && 
			PCircle->RectsInfo[i].location.y == PCircle->RectsInfo[i+1].location.y )||
			(PCircle->RectsInfo[i-1].location.x < PCircle->RectsInfo[i].location.x &&
			 PCircle->RectsInfo[i-1].location.y == PCircle->RectsInfo[i].location.y &&
			 PCircle->RectsInfo[i].location.x == PCircle->RectsInfo[i+1].location.x &&
			 PCircle->RectsInfo[i].location.y < PCircle->RectsInfo[i+1].location.y )||
			 (PCircle->RectsInfo[i-1].location.x == PCircle->RectsInfo[i].location.x &&
			 PCircle->RectsInfo[i-1].location.y > PCircle->RectsInfo[i].location.y &&
			 PCircle->RectsInfo[i].location.x < PCircle->RectsInfo[i+1].location.x &&
			 PCircle->RectsInfo[i].location.y == PCircle->RectsInfo[i+1].location.y))
			 PCircle->RectsInfo[i].location = PCircle->RectsInfo[i-1].location;
			   
	}
       
	if(PCircle->RectsInfo[2].location.x < PCircle->RectsInfo[1].location.x &&
		PCircle->RectsInfo[2].location.y == PCircle->RectsInfo[1].location.y)
		PCircle->RectsInfo[2].location = PCircle->RectsInfo[1].location;
	
	if(PCircle->RectsInfo[PCircle->RectLen-1].location.x < PCircle->RectsInfo[1].location.x &&
		PCircle->RectsInfo[PCircle->RectLen-1].location.y == PCircle->RectsInfo[1].location.y )
		PCircle->RectsInfo[PCircle->RectLen-1].location = PCircle->RectsInfo[1].location;
	
	for(i =1;i<PCircle->RectLen;i++)
	{
		PCircle->RectsInfo[i].pc = m_pShowPhotoView->m_picture_color[PCircle->RectsInfo[i].location.y][PCircle->RectsInfo[i].location.x];
	}

	for(i =1;i<(int)PCircle->RectLen;i++)
	{	
		pDC->FillRect(CRect(PCircle->RectsInfo[i].location.x*global_STEP+OFFSET+1-scroll.x,
			PCircle->RectsInfo[i].location.y *templen+OFFSET+1-scroll.y,
			PCircle->RectsInfo[i].location.x *global_STEP+OFFSET+global_STEP-scroll.x,
			PCircle->RectsInfo[i].location.y *templen+OFFSET-scroll.y + templen),&cbr);
			
				 

		if(saveornot == true)
		{
			m_pShowPhotoView->m_picture_edge[PCircle->RectsInfo[i].location.x][PCircle->RectsInfo[i].location.y] =TRUE;
		}
		
	}
	PCircle->RightBottom = MousePosition;
	cbr.DeleteObject();
}

void DrawPicture::Rectang(CDC *pDC,CPoint LeftTop,CPoint RightBottom,COLORREF rgb,int steplen,float m_jwm,bool Saveornot,CPoint Scroll)
{
	CPoint lt = gLocatePoint(LeftTop,m_jwm,Scroll);
	CPoint rb = gLocatePoint(RightBottom,m_jwm,Scroll);
	int x  = lt.x *steplen +OFFSET - Scroll.x ;
	int y  = lt.y *(int)(steplen *m_jwm) +OFFSET- Scroll.y;
	int xx =rb.x *steplen +OFFSET-Scroll.x;
	int yy = rb.y *(int)(steplen*m_jwm)+OFFSET-Scroll.y;
	CBrush cbr;
	cbr.CreateSolidBrush(rgb);
	CMainFrame * pFrame = static_cast <CMainFrame *>(AfxGetMainWnd());
	CDesignerView *m_pShowPhotoView = pFrame->GetMainView();
	CPoint maxline = m_pShowPhotoView->m_LineNum;
	for(int i=0;i<=rb.x-lt.x;i++)
	{	
		if(lt.y < 0 || lt.y >maxline.y-1)
			continue;
		else if(lt.x+i<0 || lt.x +i > maxline.x-1 )
			continue;
		pDC->FillRect(CRect(x+i*steplen+1,y+1,x+(i+1)*steplen,y+(int)(steplen*m_jwm)),&cbr);
		m_pShowPhotoView->m_RectsInfo.RectsInfo[m_pShowPhotoView->m_RectsInfo.RectLen].location.x = lt.x + i;
		m_pShowPhotoView->m_RectsInfo.RectsInfo[m_pShowPhotoView->m_RectsInfo.RectLen].location.y = lt.y;
		m_pShowPhotoView->m_RectsInfo.RectsInfo[m_pShowPhotoView->m_RectsInfo.RectLen].pc = m_pShowPhotoView->m_picture_color[lt.y][lt.x+i];
		m_pShowPhotoView->m_RectsInfo.RectLen++;
	}
	for(i =0;i<=rb.x-lt.x;i++)
	{	
		if(rb.y < 0 || rb.y >maxline.y-1)
			continue;
		else if(lt.x+i<0 || lt.x +i > maxline.x-1 )
			continue;
		pDC->FillRect(CRect(x+i*steplen+1,yy+1,x+(i+1)*steplen,yy+(int)(steplen*m_jwm)),&cbr);
		m_pShowPhotoView->m_RectsInfo.RectsInfo[m_pShowPhotoView->m_RectsInfo.RectLen].location.x = lt.x + i;
		m_pShowPhotoView->m_RectsInfo.RectsInfo[m_pShowPhotoView->m_RectsInfo.RectLen].location.y = rb.y;
		m_pShowPhotoView->m_RectsInfo.RectsInfo[m_pShowPhotoView->m_RectsInfo.RectLen].pc = m_pShowPhotoView->m_picture_color[rb.y][lt.x+i];
		m_pShowPhotoView->m_RectsInfo.RectLen++;
	}
	for(i =0;i<=rb.y-lt.y;i++)
	{	
		if(lt.x < 0 || lt.x >maxline.x-1)
			continue;
		else if(lt.y+i<0 || lt.y +i > maxline.y-1 )
			continue;
		pDC->FillRect(CRect(x+1,y+i*(int)(steplen*m_jwm)+1,x+steplen,y+(i+1)*(int)(steplen*m_jwm)),&cbr);
		m_pShowPhotoView->m_RectsInfo.RectsInfo[m_pShowPhotoView->m_RectsInfo.RectLen].location.x = lt.x ;
		m_pShowPhotoView->m_RectsInfo.RectsInfo[m_pShowPhotoView->m_RectsInfo.RectLen].location.y = lt.y+i;
		m_pShowPhotoView->m_RectsInfo.RectsInfo[m_pShowPhotoView->m_RectsInfo.RectLen].pc = m_pShowPhotoView->m_picture_color[lt.y+i][lt.x];
		m_pShowPhotoView->m_RectsInfo.RectLen++;
	}
	for(i =0;i<=rb.y -lt.y ;i++)
	{	
		if(rb.x < 0 || rb.x >maxline.x-1)
			continue;
		else if(lt.y+i<0 || lt.y +i > maxline.y-1 )
			continue;
		pDC->FillRect(CRect(xx+1,y+i*(int)(steplen*m_jwm)+1,xx+steplen,y+(i+1)*(int)(steplen*m_jwm)),&cbr);
		m_pShowPhotoView->m_RectsInfo.RectsInfo[m_pShowPhotoView->m_RectsInfo.RectLen].location.x = rb.x ;
		m_pShowPhotoView->m_RectsInfo.RectsInfo[m_pShowPhotoView->m_RectsInfo.RectLen].location.y = lt.y+i;
		m_pShowPhotoView->m_RectsInfo.RectsInfo[m_pShowPhotoView->m_RectsInfo.RectLen].pc = m_pShowPhotoView->m_picture_color[lt.y+i][rb.x];
		m_pShowPhotoView->m_RectsInfo.RectLen++;

	}
	//if(m_pShowPhotoView->m_RectsInfo.RectLen>=2*LINENUM)
	//	AfxMessageBox("ftaft");
	cbr.DeleteObject();
	
	if(Saveornot)
	{	
	
		for( i =lt.x ;i<=rb.x ;i++)
			m_pShowPhotoView->m_picture_edge[i][lt.y] = true;
		for(i = lt.x ;i<=rb.x ;i++)
			m_pShowPhotoView->m_picture_edge[i][rb.y] = true;
		for(i=lt.y;i<=rb.y;i++)
			m_pShowPhotoView->m_picture_edge[lt.x][i] = true;
		for(i=lt.y;i<=rb.y;i++)
			m_pShowPhotoView->m_picture_edge[rb.x][i] = true;

	}
	

}


void DrawPicture::Polygon(CDC *pDC, COLORREF rgb,float m_jwm, bool Saveornot, CPoint Scroll)
{
	
	
}

⌨️ 快捷键说明

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