📄 vertialrolltext.cpp
字号:
if (m_nGradient && m_bitmap.m_hObject == NULL)
{
FillGradient(&memDC, &m_ScrollRect, &r1, m_arColors[BACKGROUND_COLOR]); // 填充倾斜度
}
else
{
memDC.FillSolidRect(&r1,BackColor);
}
memDC.SetBkMode(TRANSPARENT); // 设置背景为透明
if (!m_bProcessingBitmap) // 不是正在处理的位图
{
if (bCheck)
{
CSize size = memDC.GetTextExtent((LPCTSTR)m_csWork,
m_csWork.GetLength() - rmcode);
if (size.cx > m_nMaxWidth) // 大于最大宽度
{
m_nMaxWidth = (size.cx > m_ScrollRect.Width())? m_ScrollRect.Width():size.cx;
m_ClientRect.left = (m_ScrollRect.Width()-m_nMaxWidth)/2;
m_ClientRect.right = m_ClientRect.left + m_nMaxWidth;
}
}
CRect r(m_ClientRect);
r.top = r.bottom-m_nClip;
int x = memDC.DrawText((const char *)m_csWork,m_csWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER|
DT_NOPREFIX | DT_SINGLELINE); // 画文本
m_bDrawText=FALSE;
}
else // 正在处理的位图
{
if ( bCheck )
{
CSize size = memDC.GetTextExtent( (LPCTSTR)m_csWork,m_csWork.GetLength()-rmcode );
if ( m_size.cx > m_nMaxWidth )
{
m_nMaxWidth = ( m_size.cx > m_ScrollRect.Width() )? m_ScrollRect.Width():m_size.cx;
m_ClientRect.left = ( m_ScrollRect.Width()-m_nMaxWidth )/2;
m_ClientRect.right = m_ClientRect.left + m_nMaxWidth;
}
}
CRect r( m_pt.x, m_pt.y-m_nClip, m_pt.x+ m_size.cx, m_pt.y );
DrawBitmap( &memDC, &memDC2, &r ); // 画位图
if ( m_nClip >= m_size.cy )
{
m_bmpWork.DeleteObject();
m_bProcessingBitmap = FALSE;
m_nClip=0;
m_csWork.Empty();
m_nCounter=1;
}
}
if ( pOldMemDC2Bitmap != NULL )
{
memDC2.SelectObject( pOldMemDC2Bitmap );
}
if ( pOldFont != NULL )
{
memDC.SelectObject( pOldFont );
}
memDC.SelectObject( pOldMemDCBitmap );
return;
}
// 画信息
void CVertialRollText::DrawInfo( CDC* pDC, CRect& m_ScrollRect )
{
if (m_BmpMain.m_hObject != NULL)
{
return;
}
CDC memDC,memDC2; // 内存DC实例
memDC.CreateCompatibleDC( pDC );
memDC2.CreateCompatibleDC( pDC );
COLORREF BackColor = ( m_bTransparent && m_bitmap.m_hObject != NULL )? RGB( 192,192,192 ) : m_arColors[BACKGROUND_COLOR]; // 背景颜色
CBitmap *pOldMemDCBitmap = NULL;
m_BmpMain.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() ); // 创建位图
pOldMemDCBitmap = ( CBitmap* )memDC.SelectObject( &m_BmpMain );
if (m_nGradient && m_bitmap.m_hObject == NULL)
{
FillGradient(&memDC, &m_ScrollRect, &m_ScrollRect, m_arColors[BACKGROUND_COLOR]); // 填充倾斜度
}
else
{
memDC.FillSolidRect(&m_ScrollRect, BackColor);
}
POSITION pos = m_csList.GetHeadPosition(); // 取得顶部位置
int height = 0;
while ( pos != NULL && height <= m_ScrollRect.Height() )
{
CString m_csWork = m_csList.GetNext( pos );
CFont m_fntArial;
CFont *pOldFont = NULL;
CBitmap *pOldMemDC2Bitmap = NULL;
CDC memDC2;
memDC2.CreateCompatibleDC( pDC ); // 创建内存DC
BOOL bSuccess = FALSE;
BOOL bIsBitmap = FALSE;
BOOL bUnderline;
BOOL bItalic;
int rmcode = 0;
CBitmap bitmap; // 位图实例
if ( !m_csWork.IsEmpty() ) // 工作区不为空
{
char c = m_csWork[m_csWork.GetLength()-1];
if ( c == m_arEscape[TOP_LEVEL_GROUP] ) // 顶部水平组"溢出"
{
rmcode = 1;
bItalic = FALSE;
bUnderline = FALSE;
m_nCurrentFontHeight = m_arTextHeight[TOP_LEVEL_GROUP_HEIGHT]; // 字体高度
bSuccess = m_fntArial.CreateFont( m_arTextHeight[TOP_LEVEL_GROUP_HEIGHT], 0, 0, 0,
FW_BOLD, bItalic, bUnderline, 0,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
VARIABLE_PITCH | 0x04 | FF_DONTCARE,
(LPSTR)"Arial" ); // 创建字体
memDC.SetTextColor( m_arColors[TOP_LEVEL_GROUP_COLOR] );
pOldFont = memDC.SelectObject( &m_fntArial );
}
else if ( c == m_arEscape[GROUP_TITLE] ) // 组标题"溢出"
{
rmcode = 1;
bItalic = FALSE;
bUnderline = FALSE;
m_nCurrentFontHeight = m_arTextHeight[GROUP_TITLE_HEIGHT];
bSuccess = m_fntArial.CreateFont( m_arTextHeight[GROUP_TITLE_HEIGHT], 0, 0, 0,
FW_BOLD, bItalic, bUnderline, 0,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
VARIABLE_PITCH | 0x04 | FF_DONTCARE,
(LPSTR)"Arial" ); // 创建字体
memDC.SetTextColor( m_arColors[GROUP_TITLE_COLOR] );
pOldFont = memDC.SelectObject( &m_fntArial );
}
else if (c == m_arEscape[TOP_LEVEL_TITLE]) // 顶部水平标题"溢出"
{
rmcode = 1;
bItalic = FALSE;
bUnderline = TRUE;
bUnderline = FALSE;
m_nCurrentFontHeight = m_arTextHeight[TOP_LEVEL_TITLE_HEIGHT];
bSuccess = m_fntArial.CreateFont( m_arTextHeight[TOP_LEVEL_TITLE_HEIGHT], 0, 0, 0,
FW_BOLD, bItalic, bUnderline, 0,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
VARIABLE_PITCH | 0x04 | FF_DONTCARE,
(LPSTR)"Arial" );
memDC.SetTextColor( m_arColors[TOP_LEVEL_TITLE_COLOR] );
pOldFont = memDC.SelectObject( &m_fntArial );
}
else if ( c == m_arEscape[DISPLAY_BITMAP] ) // 显示位图"溢出"
{
CString szBitmap = m_csWork.Left( m_csWork.GetLength()-1 );
if ( bitmap.LoadBitmap((const char *)szBitmap) )
{
BITMAP m_bmpInfo;
bitmap.GetObject(sizeof(BITMAP), &m_bmpInfo);
m_size.cx = m_bmpInfo.bmWidth;
m_size.cy = m_bmpInfo.bmHeight;
m_pt.x = ( m_ScrollRect.right -
((m_ScrollRect.Width())/2) - (m_size.cx/2) );
m_pt.y = height;
pOldMemDC2Bitmap = memDC2.SelectObject( &bitmap );
bIsBitmap = TRUE;
}
else
{
c = ' ';
}
}
else
{
bItalic = FALSE;
bUnderline = FALSE;
m_nCurrentFontHeight = m_arTextHeight[NORMAL_TEXT_HEIGHT];
bSuccess = m_fntArial.CreateFont( m_arTextHeight[NORMAL_TEXT_HEIGHT], 0, 0, 0,
FW_THIN, bItalic, bUnderline, 0,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
VARIABLE_PITCH | 0x04 | FF_DONTCARE,
(LPSTR)"Arial" ); // 创建字体
memDC.SetTextColor( m_arColors[NORMAL_TEXT_COLOR] );
pOldFont = memDC.SelectObject( &m_fntArial );
}
}
memDC.SetBkMode( TRANSPARENT ); // 设置背景为透明
if ( !bIsBitmap ) // 不是位图
{
CRect r( m_ScrollRect );
r.top = height;
CSize size;
if ( m_csWork.GetLength()-rmcode != 0 )
{
int x = memDC.DrawText( (const char *)m_csWork,m_csWork.GetLength() - rmcode,&r,DT_TOP|DT_CENTER|
DT_NOPREFIX | DT_SINGLELINE ); // 画文本
size = memDC.GetTextExtent( (LPCTSTR)m_csWork,m_csWork.GetLength() - rmcode );
}
else
{
size = memDC.GetTextExtent((LPCTSTR)"W",1);
}
height += size.cy;
}
else // 是位图
{
CRect r( m_pt.x, m_pt.y, m_pt.x + m_size.cx, m_pt.y + m_size.cy );
DrawBitmap(&memDC, &memDC2, &r); // 画位图
height += m_size.cy;
}
if ( pOldMemDC2Bitmap != NULL )
{
memDC2.SelectObject(pOldMemDC2Bitmap); // 替换旧位图
}
if ( pOldFont != NULL )
{
memDC.SelectObject(pOldFont); // 替换旧字体
}
}
memDC.SelectObject(pOldMemDCBitmap); // 替换旧位图
return;
}
// 设定背景图
BOOL CVertialRollText::SetBkImage(UINT nIDResource)
{
return SetBkImage( (LPCTSTR)nIDResource );
}
// 设定背景图
BOOL CVertialRollText::SetBkImage(LPCTSTR lpszResourceName)
{
if ( m_bitmap.m_hObject != NULL )
{
m_bitmap.DeleteObject(); // 删除位图对象
}
if ( m_pal.m_hObject != NULL )
{
m_pal.DeleteObject(); // 删除调色板对象
}
HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
lpszResourceName,
IMAGE_BITMAP,
0,
0,
LR_CREATEDIBSECTION
); // 上载位图
if ( hBmp == NULL )
{
return FALSE;
}
m_bitmap.Attach( hBmp ); // 贴上位图
BITMAP bm;
m_bitmap.GetBitmap( &bm ); // 取得位图
m_cxBitmap = bm.bmWidth;
m_cyBitmap = bm.bmHeight;
DIBSECTION ds;
BITMAPINFOHEADER &bmInfo = ds.dsBmih;
m_bitmap.GetObject( sizeof(ds), &ds );
int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount;
CClientDC dc(NULL);
if ( nColors > 256 )
{
m_pal.CreateHalftonePalette( &dc ); // 创建中间色调色板
}
else
{
// 创建调色板
RGBQUAD *pRGB = new RGBQUAD[nColors];
CDC memDC;
memDC.CreateCompatibleDC(&dc); // 创建内存DC
CBitmap* pOldMemDCBitmap = memDC.SelectObject( &m_bitmap );
::GetDIBColorTable( memDC, 0, nColors, pRGB );
UINT nSize = sizeof( LOGPALETTE ) + ( sizeof(PALETTEENTRY) * nColors );
LOGPALETTE *pLP = ( LOGPALETTE * ) new BYTE[nSize];
pLP->palVersion = 0x300;
pLP->palNumEntries = nColors;
for ( int i=0; i < nColors; i++) // 为调色板设定颜色
{
pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
pLP->palPalEntry[i].peFlags = 0;
}
m_pal.CreatePalette( pLP );
memDC.SelectObject( pOldMemDCBitmap ); // 替换旧的位图
delete[] pLP;
delete[] pRGB;
}
return TRUE;
}
// 擦掉背景
BOOL CVertialRollText::OnEraseBkgnd( CDC* pDC )
{
return TRUE;
}
// 释放资源
void CVertialRollText::OnDestroy()
{
CStatic::OnDestroy();
m_csList.RemoveAll();
if (m_nTimerOn)
{
ASSERT(KillTimer(DISPLAY_TIMER_ID));
}
return;
}
// 绘图
void CVertialRollText::OnPaint()
{
CPaintDC dc( this );
if ( m_nTimerOn )
{
return;
}
CDC memDC; // 内存DC实例
memDC.CreateCompatibleDC(&dc);
CBitmap *pOldMemDCBitmap = NULL;
CRect m_ScrollRect;
GetClientRect(&m_ScrollRect); // 取得客户区
if (m_BmpMain.m_hObject == NULL)
{
CDC memDC2;
CBitmap bitmap;
memDC2.CreateCompatibleDC(&dc); // 创建内存DC
bitmap.CreateCompatibleBitmap(&dc,
m_ScrollRect.Width(),
m_ScrollRect.Height()
); // 创建位图
CBitmap *pOldMemDC2Bitmap = ( CBitmap* )memDC2.SelectObject( &bitmap ); // 替换位图
DrawInfo(&memDC2, m_ScrollRect); // 画信息
AddBackGround( &memDC2, m_ScrollRect, m_ScrollRect ); // 添加背景
pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
memDC.BitBlt(0,
0,
m_ScrollRect.Width(),
m_ScrollRect.Height(),
&memDC2,
0,
0,
SRCCOPY
); // 将一幅位图从一个设备场景复制到另一个
memDC2.SelectObject( pOldMemDC2Bitmap ); // 替换旧的位图
}
else
{
pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
}
dc.BitBlt(0,
0,
m_ScrollRect.Width(),
m_ScrollRect.Height(),
&memDC,
0,
0,
SRCCOPY
); // 将一幅位图从一个设备场景复制到另一个
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -