用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

150 lines
3.7 KiB

#include "stdafx.h"
#include "SScrollText.h"
namespace SOUI
{
SScrollText::SScrollText(void):m_nSpeed(20),m_nOffset(0),m_nScrollWidth(0),m_nRollType(0)
{
}
SScrollText::~SScrollText(void)
{
}
void SScrollText::OnPaint(IRenderTarget *pRT)
{
SPainter painter;
BeforePaint(pRT,painter);
CRect rcClient = GetClientRect();
if(m_nScrollWidth==0)
{
pRT->DrawText(m_strText.GetText(),m_strText.GetText().GetLength(),&rcClient,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
}else
{
pRT->PushClipRect(&rcClient);
CRect rcText = rcClient;
rcText.left -= m_nOffset;
pRT->DrawText(m_strText.GetText(),m_strText.GetText().GetLength(),&rcText,DT_SINGLELINE|DT_VCENTER);
if (m_nRollType==0)
{
if(m_nScrollWidth - m_nOffset < rcClient.Width())
{
rcText.left += m_nScrollWidth;
// pRT->SetTextColor(RGBA(0,0,0,255));
pRT->DrawText(m_strText.GetText(),m_strText.GetText().GetLength(),&rcText,DT_SINGLELINE|DT_VCENTER);
}
}
pRT->PopClip();
}
AfterPaint(pRT,painter);
}
void SScrollText::OnSize(UINT nType, CSize size)
{
__super::OnSize(nType,size);
UpdateScrollInfo(size);
}
void SScrollText::OnShowWindow(BOOL bShow, UINT nStatus)
{
__super::OnShowWindow(bShow,nStatus);
if(m_nScrollWidth>0)
{
if(IsVisible(TRUE))
{
GetContainer()->RegisterTimelineHandler(this);
m_nNextInterval = m_nSpeed;
}
else
{
GetContainer()->UnregisterTimelineHandler(this);
}
}
}
void SScrollText::SetWindowText(const SStringT & strText)
{
__super::SetWindowText(strText);
UpdateScrollInfo(GetClientRect().Size());//ÖØмÆËã¹ö¶¯³¤¶È
}
void SScrollText::UpdateScrollInfo(CSize size)
{
SAutoRefPtr<IRenderTarget> pRT;
GETRENDERFACTORY->CreateRenderTarget(&pRT,0,0);
BeforePaintEx(pRT);
SIZE sz;
pRT->MeasureText(m_strText.GetText(),m_strText.GetText().GetLength(),&sz);
if(sz.cx - size.cx>0)
{
m_nScrollWidth = sz.cx;
if (m_nRollType==1)
{
m_nOffset=-size.cx;
}
if(m_nScrollWidth>0)
{
if(IsVisible(TRUE))
{
GetContainer()->RegisterTimelineHandler(this);
m_nNextInterval = m_nSpeed;
}
else
{
GetContainer()->UnregisterTimelineHandler(this);
}
}
}
else
{
m_nOffset = 0;
m_nScrollWidth = 0;
}
}
void SScrollText::OnNextFrame()
{
m_nNextInterval -= 10;
if(m_nNextInterval < 0)
{
m_nNextInterval = m_nSpeed;
if (m_nScrollWidth>0)
{
m_nOffset ++;
if(m_nOffset>m_nScrollWidth)
{
if (m_nRollType==0)
{
m_nOffset = 0;
}
else if(m_nRollType==1)
{
m_nOffset = -GetClientRect().Width();
}
}
Invalidate();
}
}
}
void SScrollText::OnDestroy()
{
GetContainer()->UnregisterTimelineHandler(this);
SStatic::OnDestroy();
}
void SScrollText::OnContainerChanged(ISwndContainer *pOldContainer,ISwndContainer *pNewContainer)
{
if(pOldContainer)
pOldContainer->UnregisterTimelineHandler(this);
if(pNewContainer)
pNewContainer->RegisterTimelineHandler(this);
SWindow::OnContainerChanged(pOldContainer,pNewContainer);
}
}