📄 vertialrolltext.cpp
字号:
); // 将一幅位图从一个设备场景复制到另一个
// 替换旧位图
imageDC.SelectObject(pOldImageDCBitmap);
maskDC.SelectObject(pOldMaskDCBitmap);
tempDC.SelectObject(pOldTempDCBitmap);
memDC.SelectObject(pOldMemDCBitmap);
return;
}
// 画位图
void CVertialRollText::DrawBitmap(CDC* pDC, CDC* pDC2, CRect *rBitmap)
{
if (!m_bTransparent || m_bitmap.m_hObject != NULL)
{
pDC->BitBlt(rBitmap->left,
rBitmap->top,
rBitmap->Width(),
rBitmap->Height(),
pDC2,
0,
0,
SRCCOPY
); // 将一幅位图从一个设备场景复制到另一个
return;
}
CDC memDC; // // 内存DC实例
memDC.CreateCompatibleDC( pDC );
CBitmap bitmap;
bitmap.CreateCompatibleBitmap( pDC, rBitmap->Width(), rBitmap->Height() );
CBitmap* pOldMemDCBitmap = memDC.SelectObject( &bitmap );
memDC.BitBlt(0,
0,
rBitmap->Width(),
rBitmap->Height(),
pDC2,
0,
0,
SRCCOPY
); // 将一幅位图从一个设备场景复制到另一个
CDC maskDC; // 遮盖DC实例
maskDC.CreateCompatibleDC(pDC);
CBitmap maskBitmap;
maskBitmap.CreateBitmap( rBitmap->Width(), rBitmap->Height(), 1, 1, NULL );
CBitmap* pOldMaskDCBitmap = maskDC.SelectObject( &maskBitmap );
memDC.SetBkColor(RGB(192,192,192));
maskDC.BitBlt(0,
0,
rBitmap->Width(),
rBitmap->Height(),
&memDC,
0,
0,
SRCCOPY
); // 将一幅位图从一个设备场景复制到另一个
CDC imageDC; // 图像DC实例
CBitmap bmpImage;
imageDC.CreateCompatibleDC( pDC );
bmpImage.CreateCompatibleBitmap( pDC, rBitmap->Width(), rBitmap->Height() );
CBitmap* pOldImageDCBitmap = imageDC.SelectObject( &bmpImage );
imageDC.BitBlt(0,
0,
rBitmap->Width(),
rBitmap->Height(),
pDC,
rBitmap->left,
rBitmap->top,
SRCCOPY
); // 将一幅位图从一个设备场景复制到另一个
// 创建背景色为黑色,文本颜色为白色
memDC.SetBkColor(RGB(0,0,0));
memDC.SetTextColor(RGB(255,255,255));
memDC.BitBlt(0,
0,
rBitmap->Width(),
rBitmap->Height(),
&maskDC,
0,
0,
SRCAND
); // 将一幅位图从一个设备场景复制到另一个
// 创建背景色为白色,文本颜色为黑色
imageDC.SetBkColor(RGB(255,255,255));
imageDC.SetTextColor(RGB(0,0,0));
imageDC.BitBlt(0,
0,
rBitmap->Width(),
rBitmap->Height(),
&maskDC,
0,
0,
SRCAND
); // 将一幅位图从一个设备场景复制到另一个
imageDC.BitBlt(0,
0,
rBitmap->Width(),
rBitmap->Height(),
&memDC,
0,
0,
SRCPAINT
); // 将一幅位图从一个设备场景复制到另一个
pDC->BitBlt(rBitmap->left,
rBitmap->top,
rBitmap->Width(),
rBitmap->Height(),
&imageDC,
0,
0,
SRCCOPY
); // 将一幅位图从一个设备场景复制到另一个
// 替换旧位图
imageDC.SelectObject(pOldImageDCBitmap);
maskDC.SelectObject(pOldMaskDCBitmap);
memDC.SelectObject(pOldMemDCBitmap);
}
// 填充倾斜度
void CVertialRollText::FillGradient(CDC *pDC,
CRect *m_ScrollRect,
CRect *m_FillRect,
COLORREF color)
{
float fStep,fRStep,fGStep,fBStep;
int nOnBand;
WORD R = GetRValue(color); // 红
WORD G = GetGValue(color); // 绿
WORD B = GetBValue(color); // 蓝
// 计算每个段颜色的亮度值
if (m_nGradient % 2)
{
fRStep = (float)R / 255.0f;
fGStep = (float)G / 255.0f;
fBStep = (float)B / 255.0f;
}
else
{
fRStep = (float)(255-R) / 255.0f;
fGStep = (float)(255-G) / 255.0f;
fBStep = (float)(255-B) / 255.0f;
}
COLORREF OldCol = pDC->GetBkColor(); // 取得背景色
fStep = (float)m_ScrollRect->Width() / 256.0f;
for (nOnBand = (256*m_FillRect->left)/m_ScrollRect->Width();
(int)(nOnBand*fStep) < m_FillRect->right && nOnBand < 256; nOnBand++)
{
CRect r((int)(nOnBand * fStep), m_FillRect->top,
(int)((nOnBand+1) * fStep), m_FillRect->bottom+1);
COLORREF col;
switch(m_nGradient)
{
case GRADIENT_RIGHT_DARK: // 右边暗
col = RGB((int)(R-nOnBand*fRStep),
(int)(G-nOnBand*fGStep),
(int)(B-nOnBand*fBStep));
break;
case GRADIENT_RIGHT_LIGHT: // 右边亮
col = RGB((int)(R+nOnBand*fRStep),
(int)(G+nOnBand*fGStep),
(int)(B+nOnBand*fBStep));
break;
case GRADIENT_LEFT_DARK: // 左边暗
col = RGB((int)(nOnBand*fRStep),
(int)(nOnBand*fGStep),
(int)(nOnBand*fBStep));
break;
case GRADIENT_LEFT_LIGHT: // 左边亮
col = RGB(255 - (int)(nOnBand*fRStep),
255 - (int)(nOnBand*fGStep),
255 - (int)(nOnBand*fBStep));
break;
default:
return;
}
pDC->FillSolidRect(&r, col); // 填充平滑区域
}
pDC->SetBkColor(OldCol); // 设置背景颜色
}
#define SCROLLDC
// 移动信息
void CVertialRollText::MoveInfo(CDC* pDC,
CRect& m_ScrollRect,
CRect& m_ClientRect,
BOOL bCheck)
{
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;
CBitmap *pOldMemDC2Bitmap = NULL;
#ifdef SCROLLDC
CRect r1;
#endif
if (m_BmpMain.m_hObject == 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); // 填充平滑区域
}
}
else
{
pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
}
if (m_ClientRect.Width() > 0) // 客户区宽度大于0
{
#ifndef SCROLLDC
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,
m_ClientRect.Width(),
m_ClientRect.Height() ); // 创建位图
pOldMemDC2Bitmap = memDC2.SelectObject(&bitmap);
memDC2.BitBlt(0,
0,
m_ClientRect.Width(),
m_ClientRect.Height() - abs(m_nScrollAmount),
&memDC,
m_ClientRect.left,
abs(m_nScrollAmount),
SRCCOPY
); // 将一幅位图从一个设备场景复制到另一个
memDC.BitBlt(m_ClientRect.left,
0,
m_ClientRect.Width(),
m_ClientRect.Height(),
&memDC2,
0,
0,
SRCCOPY
); // 将一幅位图从一个设备场景复制到另一个
memDC2.SelectObject(pOldMemDC2Bitmap);
pOldMemDC2Bitmap = NULL;
#else
CRgn RgnUpdate;
memDC.ScrollDC(0,
m_nScrollAmount,
(LPCRECT)m_ScrollRect,
(LPCRECT)m_ClientRect,
&RgnUpdate,
(LPRECT)r1); // 滚动设备场景
}
else
{
r1 = m_ScrollRect;
r1.top = r1.bottom-abs(m_nScrollAmount);
#endif
}
m_nClip = m_nClip + abs(m_nScrollAmount);
CFont m_fntArial;
CFont* pOldFont = NULL;
BOOL bSuccess = FALSE;
BOOL bUnderline;
BOOL bItalic;
int rmcode = 0;
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]);
if (pOldFont != NULL) memDC.SelectObject(pOldFont);
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]);
if (pOldFont != NULL) memDC.SelectObject(pOldFont);
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]);
if (pOldFont != NULL) memDC.SelectObject(pOldFont);
pOldFont = memDC.SelectObject(&m_fntArial);
}
else if (c == m_arEscape[DISPLAY_BITMAP]) // 显示位图"溢出"
{
if (!m_bProcessingBitmap) // 不是正在处理的位图
{
CString szBitmap = m_csWork.Left(m_csWork.GetLength()-1);
if (m_bmpWork.LoadBitmap((const char *)szBitmap))
{
BITMAP m_bmpInfo;
m_bmpWork.GetObject(sizeof(BITMAP), &m_bmpInfo);
m_size.cx = m_bmpInfo.bmWidth; // 位图宽度
m_size.cy = m_bmpInfo.bmHeight; // 位图高度
m_pt.x = (m_ClientRect.right -
((m_ClientRect.Width())/2) - (m_size.cx/2));
m_pt.y = m_ClientRect.bottom;
m_bProcessingBitmap = TRUE;
if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);
pOldMemDC2Bitmap = memDC2.SelectObject(&m_bmpWork);
}
else
{
c = ' ';
}
}
else // 正在处理的位图
{
if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);
pOldMemDC2Bitmap = memDC2.SelectObject(&m_bmpWork);
}
}
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]);
if (pOldFont != NULL) memDC.SelectObject(pOldFont);
pOldFont = memDC.SelectObject(&m_fntArial); // 替代旧字体
}
}
#ifndef SCROLLDC
CRect r1(m_ScrollRect);
r1.top = r1.bottom-abs(m_nScrollAmount);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -