📄 movestatic.cpp
字号:
// MoveStatic.cpp : implementation file
//
#include "stdafx.h"
#include "MoveStatic.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define SCROLLAMOUNT -1
#define DISPLAY_SLOW 70
#define DISPLAY_MEDIUM 40
#define DISPLAY_FAST 10
#define DISPLAY_SPEED DISPLAY_MEDIUM
#define RED RGB(255,0,0)
#define GREEN RGB(0,255,0)
#define BLUE RGB(0,0,255)
#define WHITE RGB(255,255,255)
#define YELLOW RGB(255,255,0)
#define TURQUOISE RGB(0,255,255)
#define PURPLE RGB(255,0,255)
#define BLACK RGB(0,0,0)
#define BACKGROUND_COLOR BLACK
#define TOP_LEVEL_TITLE_COLOR RED
#define TOP_LEVEL_GROUP_COLOR YELLOW
#define GROUP_TITLE_COLOR TURQUOISE
#define NORMAL_TEXT_COLOR WHITE
#define TOP_LEVEL_TITLE_HEIGHT 32
#define TOP_LEVEL_GROUP_HEIGHT 21
#define GROUP_TITLE_HEIGHT 19
#define NORMAL_TEXT_HEIGHT 17
#define TOP_LEVEL_TITLE '\n'
#define TOP_LEVEL_GROUP '\r'
#define GROUP_TITLE '\t'
#define NORMAL_TEXT '\f'
#define DISPLAY_BITMAP '\b'
////////////////////////////////////////////////
//
////////////////////////////////////////////////
////////////////////////////////////////////////
//
////////////////////////////////////////////////
CMoveStatic::CMoveStatic()
{
m_arArrCredit.SetSize(0);
}
CMoveStatic::~CMoveStatic()
{
}
////////////////////////////////////////////////
//
////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CMoveStatic, CStatic)
//{{AFX_MSG_MAP(CMoveStatic)
ON_WM_PAINT()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
////////////////////////////////////////////////
//
////////////////////////////////////////////////
void CMoveStatic::Init()
{
nCurrentFontHeight = NORMAL_TEXT_HEIGHT;
CClientDC dc(this);
m_dcMem.CreateCompatibleDC(&dc);
m_bProcessingBitmap=FALSE;
nArrIndex=0;
nCounter=1;
nClip=0;
m_bFirstTime=TRUE;
m_bDrawText=FALSE;
m_hBmpOld = 0;
GetClientRect(&m_ScrollRect);
SetTimer(DISPLAY_TIMER_ID,DISPLAY_SPEED,NULL);
}
////////////////////////////////////////////////
//
////////////////////////////////////////////////
void CMoveStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
dc.SetBkMode(TRANSPARENT);
CFont m_fntArial;
CFont* pOldFont;
BOOL bSuccess;
BOOL bUnderline;
BOOL bItalic;
if (!m_szWork.IsEmpty())
switch (m_szWork[m_szWork.GetLength()-1] )
{
case NORMAL_TEXT:
default:
bItalic = FALSE;
bUnderline = FALSE;
nCurrentFontHeight = NORMAL_TEXT_HEIGHT;
bSuccess = m_fntArial.CreateFont(NORMAL_TEXT_HEIGHT, 0, 0, 0,
FW_THIN, bItalic, bUnderline, 0,
GB2312_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
VARIABLE_PITCH | 0x04 | FF_DONTCARE,
(LPSTR)"楷体_GB2312");
dc.SetTextColor(NORMAL_TEXT_COLOR);
pOldFont = dc.SelectObject(&m_fntArial);
break;
case TOP_LEVEL_GROUP:
bItalic = FALSE;
bUnderline = FALSE;
nCurrentFontHeight = TOP_LEVEL_GROUP_HEIGHT;
bSuccess = m_fntArial.CreateFont(TOP_LEVEL_GROUP_HEIGHT, 0, 0, 0,
FW_BOLD, bItalic, bUnderline, 0,
GB2312_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
VARIABLE_PITCH | 0x04 | FF_DONTCARE,
(LPSTR)"楷体_GB2312");
dc.SetTextColor(TOP_LEVEL_GROUP_COLOR);
pOldFont = dc.SelectObject(&m_fntArial);
break;
case GROUP_TITLE:
bItalic = FALSE;
bUnderline = FALSE;
nCurrentFontHeight = GROUP_TITLE_HEIGHT;
bSuccess = m_fntArial.CreateFont(GROUP_TITLE_HEIGHT, 0, 0, 0,
FW_BOLD, bItalic, bUnderline, 0,
GB2312_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
VARIABLE_PITCH | 0x04 | FF_DONTCARE,
(LPSTR)"楷体_GB2312");
dc.SetTextColor(GROUP_TITLE_COLOR);
pOldFont = dc.SelectObject(&m_fntArial);
break;
case TOP_LEVEL_TITLE:
bItalic = FALSE;
bUnderline = TRUE;
nCurrentFontHeight = TOP_LEVEL_TITLE_HEIGHT;
bSuccess = m_fntArial.CreateFont(TOP_LEVEL_TITLE_HEIGHT, 0, 0, 0,
FW_BOLD, bItalic, bUnderline, 0,
GB2312_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
VARIABLE_PITCH | 0x04 | FF_DONTCARE,
(LPSTR)"楷体_GB2312");
dc.SetTextColor(TOP_LEVEL_TITLE_COLOR);
pOldFont = dc.SelectObject(&m_fntArial);
break;
case DISPLAY_BITMAP:
if (!m_bProcessingBitmap)
{
CString szBitmap = m_szWork.Left(m_szWork.GetLength()-1);
if (!m_bmpWork.LoadBitmap((const char *)szBitmap))
{
CString str;
str.Format("Could not find bitmap resource \"%s\". "
"Be sure to assign the bitmap a QUOTED resource name", szBitmap);
KillTimer(DISPLAY_TIMER_ID);
MessageBox(str);
return;
}
m_bmpCurrent = &m_bmpWork;
m_bmpCurrent->GetObject(sizeof(BITMAP), &m_bmpInfo);
m_size.cx = m_bmpInfo.bmWidth; // width of dest rect
RECT workRect;
GetClientRect(&workRect);
ClientToScreen(&workRect);
ScreenToClient(&workRect);
// upper left point of dest
m_pt.x = (workRect.right -
((workRect.right-workRect.left)/2) - (m_bmpInfo.bmWidth/2));
m_pt.y = workRect.bottom;
pBmpOld = m_dcMem.SelectObject(m_bmpCurrent);
if (m_hBmpOld == 0)
m_hBmpOld = (HBITMAP) pBmpOld->GetSafeHandle();
m_bProcessingBitmap = TRUE;
}
break;
}
CBrush bBrush(BLUE);
CBrush* pOldBrush;
pOldBrush = dc.SelectObject(&bBrush);
// Only fill rect comprised of gap left by bottom of scrolling window
r=m_ScrollRect;
r.top = r.bottom-abs(SCROLLAMOUNT);
dc.DPtoLP(&r);
if (m_bFirstTime)
{
m_bFirstTime=FALSE;
dc.FillRect(&m_ScrollRect,&bBrush);
}
else
dc.FillRect(&r,&bBrush);
r=m_ScrollRect;
r.top = r.bottom-nClip;
if (!m_bProcessingBitmap)
{
int x = dc.DrawText((const char *)m_szWork,m_szWork.GetLength()-1,&r,DT_TOP|DT_CENTER|
DT_NOPREFIX | DT_SINGLELINE);
m_bDrawText=FALSE;
}
else
{
dc.StretchBlt( m_pt.x, m_pt.y-nClip, m_size.cx, nClip,
&m_dcMem, 0, 0, m_bmpInfo.bmWidth-1, nClip,
SRCCOPY );
if (nClip > m_bmpInfo.bmHeight)
{
m_bmpWork.DeleteObject();
m_bProcessingBitmap = FALSE;
nClip=0;
m_szWork.Empty();
nCounter=1;
}
dc.SelectObject(pOldBrush);
bBrush.DeleteObject();
return;
}
dc.SelectObject(pOldBrush);
bBrush.DeleteObject();
if (!m_szWork.IsEmpty())
{
dc.SelectObject(pOldFont);
m_fntArial.DeleteObject();
}
}
////////////////////////////////////////////////
//
////////////////////////////////////////////////
void CMoveStatic::OnTimer(UINT nIDEvent)
{
if (!m_bProcessingBitmap)
if (nCounter++ % nCurrentFontHeight == 0) // every x timer events, show new line
{
nCounter=1;
m_szWork = m_arArrCredit[nArrIndex++];
//if (nArrIndex > ARRAYCOUNT-1)
if(nArrIndex>=m_arArrCredit.GetSize())
nArrIndex=0;
nClip = 0;
m_bDrawText=TRUE;
}
ScrollWindow(0,SCROLLAMOUNT,&m_ScrollRect,&m_ScrollRect);
nClip = nClip + abs(SCROLLAMOUNT);
CRect r;
GetClientRect(&r);
ClientToScreen(r);
ScreenToClient(&r);
InvalidateRect(r,FALSE); // FALSE does not erase background
CStatic::OnTimer(nIDEvent);
}
////////////////////////////////////////////////
//
////////////////////////////////////////////////
BOOL CMoveStatic::DestroyWindow()
{
KillTimer(DISPLAY_TIMER_ID);
m_dcMem.SelectObject(CBitmap::FromHandle(m_hBmpOld));
m_bmpWork.DeleteObject();
return CStatic::DestroyWindow();
}
////////////////////////////////////////////////
//
////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -