📄 rsimagestarview.cpp
字号:
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 + -