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

📄 rectplus.cpp

📁 本程序源码是为日本一家地震监测机构编写的
💻 CPP
字号:
// RectPlus.cpp: implementation of the CRectPlus class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "RectPlus.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CRectPlus::CRectPlus()
{}

CRectPlus::~CRectPlus()
{}

//计算一个居中于mainRect的长宽为size的矩形
void CRectPlus::CalcSizeInRect(CRect MainRect, CSize size, LPRECT pinRect)
{
	CSize adsize;
	adsize.cx = (MainRect.Width() - size.cx)/2;
	adsize.cy =	(MainRect.Height() - size.cy)/2;
	pinRect->top    = MainRect.top + adsize.cy;
	pinRect->left   = MainRect.left + adsize.cx;
	pinRect->right  = MainRect.right - adsize.cx;
	pinRect->bottom = MainRect.bottom - adsize.cy;	
}

//计算一个居中于mainRect的长宽为width,height的矩形
void CRectPlus::CalcSizeInRect(CRect MainRect, int width, int height, LPRECT pinRect)
{
	CSize adsize;
	adsize.cx = (MainRect.Width() - width)/2;
	adsize.cy =	(MainRect.Height() - height)/2;
	pinRect->top    = MainRect.top + adsize.cy;
	pinRect->left   = MainRect.left + adsize.cx;
	pinRect->right  = MainRect.right - adsize.cx;
	pinRect->bottom = MainRect.bottom - adsize.cy;	
}

void CRectPlus::CalcSizeInRect(CRect MainRect, int iwidth,    int iheight,    CSize size, LPRECT pinRect)
{
	int iMWidth  = MainRect.Width();
	int iMHeight = MainRect.Height();	
	int abswidth, absheight;
	iwidth  >= 0 ? abswidth  = iwidth  + size.cx : abswidth  = (-1)*iwidth  + size.cx;
	iheight >= 0 ? absheight = iheight + size.cy : absheight = (-1)*iheight + size.cy;
	if(abswidth >= iMWidth)
	{
		if(iwidth >= 0)
		{
			pinRect->right  = MainRect.right;
			pinRect->left   = MainRect.right - size.cx;
		}
		else
		{
			pinRect->left   = MainRect.left;
			pinRect->right  = MainRect.left + size.cx;
		}
	}
	else
	{
		if(iwidth >= 0)
		{
			pinRect->left    = MainRect.left + iwidth;
			pinRect->right   = pinRect->left + size.cx; 
		}
		else
		{
			pinRect->right   = MainRect.right - (-1)*iwidth;
			pinRect->left    = pinRect->right - size.cx;
		}
	}
	if(absheight >= iMHeight)
	{
		if(iheight >= 0)
		{
			pinRect->bottom = MainRect.bottom;
			pinRect->top    = MainRect.bottom - size.cy;
		}
		else
		{
			pinRect->top    = MainRect.top;
			pinRect->bottom = MainRect.top + size.cy;
		}
	}
	else
	{
		if(iheight >= 0)
		{
			pinRect->top     = MainRect.top + iheight;
			pinRect->bottom  = pinRect->top + size.cy; 
		}
		else
		{
			pinRect->bottom  = MainRect.bottom - (-1)*iheight;
			pinRect->top     = pinRect->bottom - size.cy;
		}
	}
}

void CRectPlus::CalcSizeInRect(CRect MainRect, double fwidth, int iheight,    CSize size, LPRECT pinRect)
{
	int iwidth = int(fwidth * MainRect.Width());
	CalcSizeInRect(MainRect,iwidth,iheight,size,pinRect);
}

void CRectPlus::CalcSizeInRect(CRect MainRect, int iwidth,    double fheight, CSize size, LPRECT pinRect)
{
	int iheight = int(fheight * MainRect.Height());
	CalcSizeInRect(MainRect,iwidth,iheight,size,pinRect);
}

void CRectPlus::CalcSizeInRect(CRect MainRect, double fwidth, double fheight, CSize size, LPRECT pinRect)
{
	int iwidth = int(fwidth * MainRect.Width());
	int iheight = int(fheight * MainRect.Height());
	CalcSizeInRect(MainRect,iwidth,iheight,size,pinRect);
}

void CRectPlus::CalcAboveRect(CRect CurRect, LPRECT abRect, unsigned int ispace /*= 0*/)
{
	abRect->bottom = CurRect.top - ispace;
	abRect->top    = abRect->bottom - CurRect.Height();
	abRect->left   = CurRect.left;
	abRect->right  = CurRect.right;	
}

void CRectPlus::CalcBelowRect(CRect CurRect, LPRECT beRect, unsigned int ispace /*= 0*/)
{
	beRect->top    = CurRect.bottom + ispace;
	beRect->bottom = beRect->top + CurRect.Height();
	beRect->left   = CurRect.left;
	beRect->right  = CurRect.right;
}

void CRectPlus::CalcLeftRect(CRect CurRect, LPRECT leftRect, unsigned int ispace /*= 0*/)
{
	leftRect->right  = CurRect.left - ispace;
	leftRect->left   = leftRect->right - CurRect.Width();
	leftRect->top    = CurRect.top;
	leftRect->bottom = CurRect.bottom;
}

void CRectPlus::CalcRightRect(CRect CurRect, LPRECT rightRect, unsigned int ispace /*= 0*/)
{
	rightRect->left   = CurRect.right + ispace;
	rightRect->right  = rightRect->left + CurRect.Width();
	rightRect->top    = CurRect.top;
	rightRect->bottom = CurRect.bottom;
}


//垂直切割MainRect,iheight为切割高度,切割后为pRectAbove和pRectBelow
//如果切割参数iheight < 0 则以下部为基准切割
void CRectPlus::DivideRectV(CRect MainRect, int iheight, LPRECT pRectAbove, LPRECT pRectBelow)
{
	if( MainRect.IsRectEmpty() ) return;
	if( pRectAbove == NULL && pRectBelow == NULL ) return;
	int iMHeight = MainRect.Height();
	if( iheight > iMHeight ) iheight = iMHeight;
	if( iheight < ((-1)*iMHeight) )	iheight = 0;
	if( iheight < 0 ) iheight += iMHeight;
	if( pRectAbove != NULL )
	{
		pRectAbove->top    = MainRect.top;
		pRectAbove->left   = MainRect.left;
		pRectAbove->right  = MainRect.right;
		pRectAbove->bottom = MainRect.top + iheight;
	}
	if(pRectBelow != NULL)
	{
		pRectBelow->top    = MainRect.top + iheight;
		pRectBelow->left   = MainRect.left;
		pRectBelow->right  = MainRect.right;
		pRectBelow->bottom = MainRect.bottom;
	}
}

//水平切割MainRect,iwidth为切割宽度,切割后为pRectLeft和pRectRight
//如果切割参数iwidth < 0 则以右边为基准切割
void CRectPlus::DivideRectH(CRect MainRect, int iwidth, LPRECT pRectLeft, LPRECT pRectRight)
{
	if( MainRect.IsRectEmpty() ) return;
	if( pRectLeft == NULL && pRectRight == NULL) return;
	int iMWidth = MainRect.Width();
	if( iwidth >= iMWidth ) iwidth = iMWidth;
	if( iwidth <= ((-1)*iMWidth) ) iwidth = 0;		
	if( iwidth < 0 ) iwidth += iMWidth;
	if( pRectLeft != NULL )
	{
		pRectLeft->top     = MainRect.top;
		pRectLeft->left    = MainRect.left;
		pRectLeft->right   = MainRect.left + iwidth;
		pRectLeft->bottom  = MainRect.bottom;
	}
	if( pRectRight != NULL )
	{
		pRectRight->top    = MainRect.top;
		pRectRight->left   = MainRect.left + iwidth;
		pRectRight->right  = MainRect.right;
		pRectRight->bottom = MainRect.bottom;
	}
}

//垂直切割MainRect,iRate为切割高度比例,切割后为RectAbove和RectBelow
void CRectPlus::DivideRectV(CRect MainRect, double iRate, LPRECT pRectAbove, LPRECT pRectBelow)
{
	if( MainRect.IsRectEmpty() ) return;
	if( pRectAbove == NULL && pRectBelow == NULL ) return;
	int iMHeight = MainRect.Height();
	int iheight = int(iRate * iMHeight);
	if( iheight > iMHeight ) iheight = iMHeight;
	if( iheight < ((-1)*iMHeight) )	iheight = 0;
	if( iheight < 0 ) iheight += iMHeight;
	if( pRectAbove != NULL )
	{
		pRectAbove->top    = MainRect.top;
		pRectAbove->left   = MainRect.left;
		pRectAbove->right  = MainRect.right;
		pRectAbove->bottom = MainRect.top + iheight;
	}
	if(pRectBelow != NULL)
	{
		pRectBelow->top    = MainRect.top + iheight;
		pRectBelow->left   = MainRect.left;
		pRectBelow->right  = MainRect.right;
		pRectBelow->bottom = MainRect.bottom;
	}
}

//水平切割MainRect,iRate为切割宽度比例,切割后为RectLeft和RectRight
void CRectPlus::DivideRectH(CRect MainRect, double iRate, LPRECT pRectLeft, LPRECT pRectRight)
{
	if( MainRect.IsRectEmpty() ) return;
	if( pRectLeft == NULL && pRectRight == NULL) return;
	int iMWidth = MainRect.Width();
	int iwidth = int(iRate * iMWidth);	
	if( iwidth >= iMWidth ) iwidth = iMWidth;
	if( iwidth <= ((-1)*iMWidth) ) iwidth = 0;		
	if( iwidth < 0 ) iwidth += iMWidth;
	if( pRectLeft != NULL )
	{
		pRectLeft->top     = MainRect.top;
		pRectLeft->left    = MainRect.left;
		pRectLeft->right   = MainRect.left + iwidth;
		pRectLeft->bottom  = MainRect.bottom;
	}
	if( pRectRight != NULL )
	{
		pRectRight->top    = MainRect.top;
		pRectRight->left   = MainRect.left + iwidth;
		pRectRight->right  = MainRect.right;
		pRectRight->bottom = MainRect.bottom;
	}
}

void CRectPlus::CalcProperRate(CPoint inWH, CPoint outWH, float &RateX, float &RateY, BOOL bKScale /*= TRUE*/)
{	
	float rate1(0), rate2(0);
	float finW  = float(inWH.x);
	float finH  = float(inWH.y);
	float foutW = float(outWH.x);	
	float foutH = float(outWH.y);
	TRACE(_T("%d%d%d%d\n"),inWH.x,inWH.y,outWH.x,outWH.y);
	if(bKScale)
	{		
		rate1 = foutW / foutH;
		rate2 = finW  / finH;
		if(rate1 > rate2)
		{//以绘图的高度作为基准条件
			RateY = foutH / finH;
			RateX = RateY;
		}
		else
		{//以绘图的宽度作为基准条件
			RateX = foutW / finW;
			RateY = RateX;	
		}
	}
	else
	{
		RateX = foutW / finW;
		RateY = foutH / finH;		
	}
}

⌨️ 快捷键说明

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