effectchang.cpp

来自「一个通过PCI卡向LED屏发送股票实时行情的系统」· C++ 代码 · 共 1,278 行 · 第 1/3 页

CPP
1,278
字号
					SingleChar=CurStr.GetAt(count);
					if(SingleChar&0x80)	
					{
						Chine_count++;	//一行中,中文字符计数
						bchine=TRUE;
					}
					else
						bchine=FALSE;

					strSize=pMemDC->GetTextExtent(CurStr.Left(count+1));
					if(strSize.cx>dw)
					{
						if(bchine)
						{
							if(Chine_count%2)//奇数,有中文字符被拆开
								count--;
						}
						else
								count--;
						break;
					}
				}
				WantStr=CurStr.Left(count);
				//输出一行满宽文本
				if(nLineCount*(nLineSpace+lp.lfHeight)<=dh-nLineSpace-lp.lfHeight)
				{
					pMemDC->TextOut(dx,nLineCount*(nLineSpace+lp.lfHeight),WantStr);//190
					pDC->BitBlt(dx,dy,dw,dh,pMemDC,0,0,SRCCOPY);
				}
				else
				{
				//	DynamicShow_Interface(pWnd,2,pDC,pMemDC,dx,dy,dw,dh,0,0,0,0);			
					Sleep(theApp.TxtPauseTime*1000);
					pMemDC->FillSolidRect(CRect(0,0,dw,dh),RGB(0,0,0));
					pMemDC->TextOut(dx,0,WantStr);
					nLineCount=0;
					pDC->BitBlt(dx,dy,dw,dh,pMemDC,0,0,SRCCOPY);
				}
				///////////////////////
				if(count<CurLen)
				{//再测量一次WantStr的最后一个字符
					SingleChar=CurStr.GetAt(count);
					if(SingleChar&0x80)
						bchine=TRUE;
					else
						bchine=FALSE;
				}

				if(bchine)
					CurStr=CurStr.Right(CurLen-count+1);
				else
					CurStr=CurStr.Right(CurLen-count);

				if(count==1)	CurStr="";
				CurLen=CurStr.GetLength();
				Chine_count=0;
				nLineCount++;
			}while(CurStr!="");
		}
	}
	TxtFile.Close();

	//收拾设备描述表
	pMemDC->SelectObject(m_FntOld);
	pMemDC->SelectObject(pOldbmp);
	m_bmp.DeleteObject();
	pMemDC->DeleteDC();
	delete pMemDC;
	return 1;
}
//上滚
//(dx,dy,dw,dh)目标屏幕的坐标,位图文件名,动画模式,宋体字号,源屏幕的坐标
BOOL CEffectChang::Open_DrawTxt3(CWnd* pWnd,CDC *pDC, 
								int dx, int dy, int dw, int dh, 
								CString fName,int DisplayMode,CFont* mTxtFnt)
{
	CString		Txtstr;
	int         nLineSpace=0;		//行间距
	CStdioFile	TxtFile;
	if (!TxtFile.Open(fName,CFile::modeRead|CFile::typeText|CFile::shareDenyNone))
		return 0;
	//新的内存
 	CFont*		m_FntOld;
	CDC*		pMemDC;
	CBitmap		m_bmp;
	CBitmap*	pOldbmp;
	LOGFONT lp;

	pMemDC=new CDC;
	pMemDC->CreateCompatibleDC(pDC);
	m_bmp.CreateCompatibleBitmap(pDC,dw,dh);
	pOldbmp=pMemDC->SelectObject(&m_bmp);
	pMemDC->FillSolidRect(CRect(0,0,dw,dh),RGB(0,0,0));
	pMemDC->SetBkColor(RGB(0,0,0));
	pMemDC->SetTextColor(RGB(255,0,0));
	m_FntOld=pMemDC->SelectObject(mTxtFnt);
	mTxtFnt->GetLogFont(&lp);

	BOOL	bOnePage=FALSE;
	int     nLineCount=0;
	CSize	strSize;
	TCHAR	SingleChar;
	CString ToNextLine="";
	BOOL	bchine;
	CString	WantStr,CurStr;
	int		Chine_count;
	int		CurLen;
		while(TxtFile.ReadString(Txtstr))			
		{
//			Txtstr.TrimRight();
			if(!Txtstr.IsEmpty())
			{
				CurStr=ToNextLine+Txtstr;
				bchine=FALSE;
				Chine_count=0;
				CurLen=Txtstr.GetLength();
				//分解一行文本
				do
				{
					for(int count=0;count<CurLen;count++)
					{
						SingleChar=CurStr.GetAt(count);
						if(SingleChar&0x80)
						{
							Chine_count++;	//一行中,中文字符计数
							bchine=TRUE;
						}
						else
							bchine=FALSE;
						strSize=pMemDC->GetTextExtent(CurStr.Left(count+1));
						if(strSize.cx>dw)
						{
							if(bchine)
							{
								if(Chine_count%2)//奇数,有中文字符被拆开
									count--;
							}
							else
									count--;
							break;
						}
					}
					WantStr=CurStr.Left(count);
				if((nLineCount*lp.lfHeight<=dh-lp.lfHeight)&&!bOnePage)
				{//先打出一页,
//					pMemDC->FillSolidRect(CRect(0,0,dw,lp.lfHeight),RGB(0,0,0));
					pMemDC->TextOut(dx,nLineCount*lp.lfHeight,WantStr);
					pDC->BitBlt(dx,dy,dw,dh,pMemDC,0,0,SRCCOPY);
				}
				else
				{//超过一页以后再逐行上滚
					if(!bOnePage)	
						Sleep(theApp.TxtPauseTime*1000);
					bOnePage=TRUE;
					//输出一行满宽文本
					pMemDC->FillSolidRect(CRect(0,0,dw,lp.lfHeight),RGB(0,0,0));
					pMemDC->TextOut(0,0,WantStr);
					for(int i=0;i<lp.lfHeight;i++)
					{
						pDC->OffsetViewportOrg(0,lp.lfHeight-i);
						pWnd->UpdateWindow();
						pWnd->ScrollWindow(0,-1,CRect(dx,dy,dx+dw,dy+dh),NULL);
						pDC->BitBlt( dx,dh+dy-lp.lfHeight, dw, lp.lfHeight, pMemDC, 0, 0, SRCCOPY );
						pDC->SetViewportOrg(0,0);
						Sleep(60);
					}
				}
				///////////////////////
				if(count<CurLen)
				{//再测量一次WantStr的最后一个字符
					SingleChar=CurStr.GetAt(count);
					if(SingleChar&0x80)
						bchine=TRUE;
					else
						bchine=FALSE;
				}
				if(bchine)
					CurStr=CurStr.Right(CurLen-count+1);
				else
					CurStr=CurStr.Right(CurLen-count);

				if(count==1)	CurStr="";
				CurLen=CurStr.GetLength();
				Chine_count=0;
				nLineCount++;
				}while(CurStr!="");
			}
		}
		TxtFile.Close();
		if(!bOnePage)	
			Sleep(theApp.TxtPauseTime*1000);//不超过一页
		else
		{//超过一页,总是移走满平屏,15行
			pMemDC->FillSolidRect(CRect(0,0,dw,lp.lfHeight),RGB(0,0,0));
			for(int j=0;j<15;j++)
			{
				for(int i=0;i<lp.lfHeight;i++)
				{
					pDC->OffsetViewportOrg(0,lp.lfHeight-i);
					pWnd->UpdateWindow();
					pWnd->ScrollWindow(0,-1,CRect(dx,dy,dx+dw,dy+dh),NULL);
					pDC->BitBlt( dx,dh+dy-lp.lfHeight, dw, lp.lfHeight, pMemDC, 0, 0, SRCCOPY );
					pDC->SetViewportOrg(0,0);
					Sleep(60);
				}
			}
		}

	//收拾设备描述表
	pMemDC->SelectObject(m_FntOld);
	pMemDC->SelectObject(pOldbmp);
	m_bmp.DeleteObject();
	pMemDC->DeleteDC();
	delete pMemDC;
	return 1;
}
void CEffectChang::OnePage_Displaystr(CDC* pDC,CDC* pMDC,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)
{
		pDC->StretchBlt( dx,dy,dw,dh,pMDC,sx,sy,sw,sh,SRCCOPY);
}
void CEffectChang::OnePage_Display(CDC* pDC,CDC* pMDC,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)
{
		pDC->BitBlt(dx,dy,dw,dh,pMDC,sx,sy,SRCCOPY);
}


BOOL CEffectChang::MoveEffect2(CWnd* pWnd,CDC* pDC,CDC* pMDC,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)	//下移入
{
	for(int i=0;i<dh;i+=2)
	{
		pWnd->UpdateWindow();
		pWnd->ScrollWindow(0,-2,NULL,NULL);
		pDC->OffsetViewportOrg(0,dh-i);
		pDC->BitBlt( dx, dy, dw, dh, pMDC, sx, sy, SRCCOPY );
		pDC->SetViewportOrg(0,0);
	}
	return 1;
}
BOOL CEffectChang::MoveEffect3(CWnd* pWnd,CDC* pDC,CDC* pMDC,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)	//下移入
{
	for(int i=0;i<dw;i+=2)
	{
		pWnd->UpdateWindow();
		pWnd->ScrollWindow(2,0,NULL,NULL);
		pDC->OffsetViewportOrg(-dw+i,0);
		pDC->BitBlt( dx, dy, dw, dh, pMDC, sx, sy, SRCCOPY );
		pDC->SetViewportOrg(0,0);
	}
	return 1;
}
BOOL CEffectChang::MoveEffect4(CWnd* pWnd,CDC* pDC,CDC* pMDC,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)	//下移入
{
	for(int i=0;i<dw;i+=2)
	{
		pWnd->UpdateWindow();
		pWnd->ScrollWindow(-2,0,NULL,NULL);
		pDC->OffsetViewportOrg(dw-i,0);
		pDC->BitBlt( dx, dy, dw, dh, pMDC, sx, sy, SRCCOPY );
		pDC->SetViewportOrg(0,0);
	}
	return 1;
}
BOOL CEffectChang::MoveEffect5(CDC *pDC,CDC* pMDC ,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)	//左上角移入
{	
	for(int i=0;i<dw;i++)
	{
		pDC->OffsetViewportOrg(-dw+i,-dh+i*dh/dw);
		pDC->BitBlt( dx, dy, dw, dh, pMDC, sx, sy, SRCCOPY );
		pDC->SetViewportOrg(0,0);
	}
	
	return 1;
}
BOOL CEffectChang::MoveEffect6(CDC *pDC,CDC* pMDC ,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)	//左下角移入
{	
	for(int i=0;i<dw;i++)
	{
		pDC->OffsetViewportOrg(-dw+i,dh-i*dh/dw);
		pDC->BitBlt( dx, dy, dw, dh, pMDC, sx, sy, SRCCOPY );
		pDC->SetViewportOrg(0,0);
	}
	
	return 1;
}
BOOL CEffectChang::MoveEffect7(CDC *pDC,CDC* pMDC ,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)	//右上角移入
{	
	for(int i=0;i<dw;i++)
	{
		pDC->OffsetViewportOrg(dw-i,-dh+i*dh/dw);
		pDC->BitBlt( dx, dy, dw, dh, pMDC, sx, sy, SRCCOPY );
		pDC->SetViewportOrg(0,0);
	}
	
	return 1;
}
BOOL CEffectChang::MoveEffect8(CDC *pDC,CDC* pMDC ,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)	//右下角移入
{	
	for(int i=0;i<dw;i++)
	{
		pDC->OffsetViewportOrg(dw-i,dh-i*dh/dw);
		pDC->BitBlt( dx, dy, dw, dh, pMDC, sx, sy, SRCCOPY );
		pDC->SetViewportOrg(0,0);
	}
	
	return 1;
}
BOOL  CEffectChang::ThreadEffect1(CDC *pDC,CDC* pMDC,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)		//水平线波浪
{		
	CRgn Rgn1;
		
    POINT point[4];
	point[0].x=0;
	point[0].y=0;
	point[1].x=dw;
	point[1].y=0;
	point[2].x=dw;         
	point[2].y=2;
	point[3].x=0;
	point[3].y=2;
	Rgn1.CreatePolygonRgn(point,4,WINDING);
	pDC->SelectClipRgn(&Rgn1);

	for(int j=0;j<100;j++)
	{
		for(int i=0;i<500;i++)
		{
			pDC->OffsetClipRgn(0,2*(rand()%dh));
			pDC->BitBlt( dx, dy, dw, dh, pMDC, sx, sy, SRCCOPY );
		}
	
	}
	pDC->SelectClipRgn( NULL );
	pDC->BitBlt( dx, dy, dw, dh, pMDC, sx, sy, SRCCOPY );

	pDC->SelectClipRgn( NULL );
	Rgn1.DeleteObject();
	return 1;

}
BOOL  CEffectChang::ThreadEffect2(CDC *pDC,CDC* pMDC ,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)		//垂直线波浪
{		CRgn Rgn1;
		
    POINT point[4];
	point[0].x=0;
	point[0].y=0;
	point[1].x=2;
	point[1].y=0;
	point[2].x=2;         
	point[2].y=dh;
	point[3].x=0;
	point[3].y=dh;
	Rgn1.CreatePolygonRgn(point,4,WINDING);
	pDC->SelectClipRgn(&Rgn1);

	for(int j=0;j<500;j++)
	{

		for(int i=0;i<500;i++)
		{
			pDC->OffsetClipRgn(1*(rand()%dw),0);
			pDC->BitBlt( dx, dy, dw, dh, pMDC, sx, sy, SRCCOPY );
		}
	}

	pDC->SelectClipRgn( NULL );
	pDC->BitBlt( dx, dy, dw, dh, pMDC, sx, sy, SRCCOPY );
	
	pDC->SelectClipRgn( NULL );
	Rgn1.DeleteObject();
	return 1;

}
BOOL CEffectChang::StretchEffect2(CDC *pDC,CDC* pMDC ,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)		//放大
{		
	CRgn Rgn1;
    POINT point[4];

	for(int i=0;i<dw/2;i++)
	{
		point[0].x=dw/2-i;
		point[0].y=dh/2-i*dh/dw;
		point[1].x=dw/2+i;
		point[1].y=dh/2-i*dh/dw;
		point[2].x=dw/2+i;         
		point[2].y=dh/2+i*dh/dw;
		point[3].x=dw/2-i;
		point[3].y=dh/2+i*dh/dw;
		Rgn1.CreatePolygonRgn(point,4,WINDING);


		pDC->SelectClipRgn( &Rgn1 );
		pDC->SetStretchBltMode(STRETCH_DELETESCANS);
		pDC->StretchBlt(dw/2-i,dh/2-i*dh/dw,
				 2*i,2*i*dh/dw, 
				 pMDC,0, 0, dw, dh,SRCCOPY   );
	
		pDC->SelectClipRgn( NULL );
		Rgn1.DeleteObject();
	}
	return 0;

}

BOOL CEffectChang::StretchEffect1(CDC *pDC,CDC* pMDC ,int dx, int dy, int dw, int dh,int sx,int sy,int sw,int sh)		//由大缩小
{	
	CRgn Rgn1,Rgn2,Rgn3,Rgn4;
	CBrush *OldBrush;
	COLORREF Color;
	Color=RGB(60,60,60);
	CBrush m_pBrush( Color );
	OldBrush = (CBrush *) pDC->SelectObject( &m_pBrush );
	Rgn1.CreateRectRgn(0 , 0, dw, dh);
	Rgn3.CreateRectRgn(0, 0, 0, 0);

	for(int i=0;i<dw/2;i++)
	{
		Rgn2.CreateRectRgn(i,i*dh/dw,dw-i,dh-i*dh/dw);
		Rgn3.CombineRgn(&Rgn1,&Rgn2,RGN_DIFF);
		pDC->FillRgn(&Rgn3,&m_pBrush);
		pDC->SelectObject( OldBrush );

		POINT point[4];
		point[0].x=i;
		point[0].y=i*dh/dw;
		point[1].x=dw-i;
		point[1].y=i*dh/dw;

⌨️ 快捷键说明

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