📄 ccreditsscroller.cpp
字号:
//
// CCreditsScroller.cpp
// Implementation of CCreditsScroller
// Ryan Lederman, ryan@winprog.org
//
#include "stdafx.h"
#include "CCreditsScroller.h"
CCreditsScroller::CCreditsScroller(){}
BOOL CCreditsScroller::Initialize( HWND hWindow, HDC winDC, int iWidth, int iHeight, int iXpos, int iYpos, COLORREF clrBackground, COLORREF clrForeground, char *szFontName )
{
//
// Set underlying member variables to values passed, assuming they are valid.
//
if( iWidth <=0 || iHeight <=0 )
return false;
m_dcWinDC = winDC; /* Window DC to be drawn on */
m_iDrawWidth = iWidth; /* Width of screen to be drawn */
m_iDrawHeight = iHeight; /* Height of screen to be drawn */
m_iDrawX = iXpos; /* X-axis coordinate of upper left corner of screen to be drawn */
m_iDrawY = iYpos; /* Y-axis coordinate of upper left corner of screen to be drawn */
m_clrForeground = clrForeground;
m_clrBackground = clrBackground;
m_hWindow = hWindow;
m_iTextOutY = iHeight;
m_dcMemoryDC = CreateCompatibleDC( m_dcWinDC );
if( m_dcMemoryDC == NULL )
return false;
m_hMemoryBitmap = CreateCompatibleBitmap( m_dcWinDC, m_iDrawWidth, m_iDrawHeight );
if( m_hMemoryBitmap == NULL )
return false;
SetTextColor( m_dcMemoryDC, m_clrForeground );
SetBkColor( m_dcMemoryDC, m_clrBackground );
SelectObject( m_dcMemoryDC, m_hMemoryBitmap );
m_hBrushBackground = CreateSolidBrush( m_clrBackground );
m_hFont = CreateFont( 0,0,0,0,FW_BOLD,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH, szFontName );
SelectObject( m_dcMemoryDC, m_hFont );
m_rectangle.left = iXpos;
m_rectangle.top = iYpos;
m_rectangle.right = m_iDrawWidth;
m_rectangle.bottom = m_iDrawHeight;
m_buffer = NULL;
return true;
}
BOOL CCreditsScroller::Start(HWND hWindow, int iMilliseconds, int iPixelStep )
{
SCROLLSTRUCT scr;
//
// Make sure user didn't do something dumb
//
if( iMilliseconds <= 0 )
return false;
//
// Begin timer
//
if( SetTimer( hWindow, 0, iMilliseconds, (TIMERPROC)TimerProc ) == 0 )
return false;
//
// Call TextToScreen to calculate text's drawn height
//
if( !TextToScreen() )
return false;
//
// Copy address of rectangle, handle to window drawn on, and pixels to step to TimerProc
//
scr.hHandle = m_hWindow;
scr.iPixelStep = iPixelStep;
scr.iTextOutHeight = m_iTextOutHeight;
scr.iTextOutY = &m_iTextOutY;
scr.pRect = &m_rectangle;
TimerProc( NULL, WM_COPYDATA, 0, (DWORD)&scr );
return true;
}
VOID CALLBACK CCreditsScroller::TimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime )
{
static HWND hWnd;
static int iPixelStep = 0;
static int iTextOutHeight = 0;
static int *pTextOutY = NULL;
static RECT *pRect = NULL;
int iMinY = 0;
if( uMsg == WM_COPYDATA )
{
hWnd = ((PSCROLLSTRUCT)dwTime)->hHandle;
iPixelStep = ((PSCROLLSTRUCT)dwTime)->iPixelStep;
iTextOutHeight = ((PSCROLLSTRUCT)dwTime)->iTextOutHeight;
pTextOutY = ((PSCROLLSTRUCT)dwTime)->iTextOutY;
pRect = ((PSCROLLSTRUCT)dwTime)->pRect;
}
iMinY = (0 - iTextOutHeight);
if( *pTextOutY <= iMinY )
{
*pTextOutY = pRect->bottom;
KillTimer(hWnd, 0);
ShowWindow(hWnd, SW_HIDE);
DestroyWindow(hWnd);
}
*pTextOutY -= iPixelStep;
InvalidateRect( hWnd, pRect, FALSE );
UpdateWindow( hWnd );
}
BOOL CCreditsScroller::SetString( char *szString, int len )
{
if( m_buffer )
free( m_buffer );
if( len <= 0 )
return false;
m_bufferlen = len;
m_buffer = (char*)malloc( m_bufferlen );
if( m_buffer == NULL )
return false;
memcpy( m_buffer, szString, m_bufferlen );
return true;
}
BOOL CCreditsScroller::TextToScreen( void )
{
DWORD dwRead = 0;
RECT rectangle;
rectangle.top = 0;
rectangle.bottom = 278;
rectangle.left = 0;
rectangle.right = 412;
FillRect( m_dcMemoryDC, &rectangle, m_hBrushBackground );
m_iTextOutHeight = DrawTextEx( m_dcMemoryDC, m_buffer, m_bufferlen, &rectangle, DT_CALCRECT, 0 );
rectangle.top = m_iTextOutY;
rectangle.left = 0;
rectangle.right = m_iDrawWidth;
rectangle.bottom = m_iDrawHeight;
DrawTextEx( m_dcMemoryDC, m_buffer, m_bufferlen, &rectangle, DT_CENTER, 0 );
BitBlt( m_dcWinDC, m_iDrawX, m_iDrawY, m_iDrawWidth, m_iDrawHeight, m_dcMemoryDC, 0, 0, SRCCOPY );
return true;
}
void CCreditsScroller::Cleanup( void )
{
DeleteObject( m_hMemoryBitmap );
DeleteDC( m_dcMemoryDC );
DeleteObject( m_hBrushBackground );
DeleteObject( m_hFont );
if( m_buffer )
free( m_buffer );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -