📄 rectplus.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 + -