重叠控件如何设置透明色

yyang0514 2015-04-15 06:42:12
派生了两个CStaitc控件,下面的显示图片,上面的显示滚动文字。但是上面的控件无法设置为透明色。请问应该如何处理?

已经调用了pDC->SetBkMode(TRANSPARENT );

void CTextScroller::OnPaint()
{
KillTimer(0);
CPaintDC dc(this); // device context for painting
DrawBkGround(&dc);
SetTimer(0,100,NULL);
}
void CTextScroller::DrawBkGround(CDC *pDC,CRect InvalidRect)
{
CRect rectClient;
GetClientRect(rectClient);
if(InvalidRect == CRect(0,0,0,0))
InvalidRect = rectClient;
if(m_bFirstTime)
{
if(m_Lines.GetCount())
{
POSITION pos = m_Lines.GetHeadPosition();
Line *_line = NULL;
int offset = rectClient.bottom;
CFont *pOldFont = pDC->SelectObject(&m_font);
CSize size = pDC->GetTextExtent(_T("TEST"));
pDC->SetBkMode(TRANSPARENT);
pDC->SelectObject(pOldFont);
while(pos)
{
_line = m_Lines.GetNext(pos);
if(_line)
{
_line->pos = offset;
_line->Initpos = offset;
offset += size.cy + 1;
}
}
m_bFirstTime = 0;
}
}
pDC->FillSolidRect(&InvalidRect,m_BkColor);
}

void CTextScroller::OnTimer(UINT nIDEvent)
{
if(nIDEvent == 0)
{
MoveTextToTheTop();
}
CStatic::OnTimer(nIDEvent);
}

void CTextScroller::MoveTextToTheTop()
{
int count = m_Lines.GetCount();
if(!count)
return;
CDC *pDC = GetDC();
CRect rectClient;
GetClientRect(rectClient);
CFont *pOldFont = pDC->SelectObject(&m_font);
int iOldMode = pDC->SetBkMode(TRANSPARENT);
COLORREF col = pDC->SetTextColor(m_TextColor);
CSize size = pDC->GetTextExtent(_T("TEST"));
Line *_line = NULL;
POSITION pos = m_Lines.GetHeadPosition();
int nIndex = -1;
while(pos)
{
_line = m_Lines.GetNext(pos);
nIndex++;
if(!_line)
return;
if(_line->bDecrease)
(_line->pos)--;
if(_line->pos < 0)
{
DrawBkGround(pDC,CRect(0,_line->pos - 1,rectClient.right,_line->pos + size.cy - 1));
_line->pos = _line->Initpos;
if(nIndex == m_Lines.GetCount()-1)
{
pos = m_Lines.GetHeadPosition();
while(pos)
{
_line = m_Lines.GetNext(pos);
_line->bDecrease = TRUE;
}
break;
}
else
_line->bDecrease = FALSE;
continue;
}
if(_line->pos > rectClient.bottom - size.cy)
continue;
DrawBkGround(pDC,CRect(0,_line->pos - 1,rectClient.right,_line->pos + size.cy + 1));
pDC->DrawText(_line->strLine,CRect(0,_line->pos,rectClient.right,_line->pos + size.cy),DT_CENTER);
}
pDC->SetBkMode(TRANSPARENT );
pDC->SelectObject(pOldFont);
pDC->SetTextColor(col);
//Clean the top of the window
DrawBkGround(pDC,CRect(0,0,rectClient.right,size.cy));
ReleaseDC(pDC);
}



...全文
174 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2015-05-16
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
yyang0514 2015-04-16
  • 打赏
  • 举报
回复
引用 3 楼 wxhxj0268 的回复:
我认为对显示而言只要一个静态控件,而可以有多块显示内存,你的图片和文字放在不同的内存中,使用显示内存中的内容刷新到显示控件中,即可完成动画也可使图像不闪烁。
我要实现的目标,包含显示3个图片,1个滚动字幕。如果都放在一个控件里面来做,对我来说难度有点大。觉得有以下困难: 1. 一个空间内的滚动字幕。 2.多图片重叠显示。某种情况下,显示由3个图片1个滚动字幕,切换为一个1个图片。
笨笨仔 2015-04-16
  • 打赏
  • 举报
回复
我认为对显示而言只要一个静态控件,而可以有多块显示内存,你的图片和文字放在不同的内存中,使用显示内存中的内容刷新到显示控件中,即可完成动画也可使图像不闪烁。
yyang0514 2015-04-16
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
WM_CTLCOLOR中返回一个NULL HBRUSH
能不能说的更详细一点呢。 1.是自己添加WM_CTLCOLOR的响应函数吗? 2.返回的NULL HBRUSH在哪里用呢?
yyang0514 2015-04-16
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
WM_CTLCOLOR中返回一个NULL HBRUSH

我在CTextScroller 类中加入了WM_CTLCOLOR消息处理,可是效果还是一样的。请问是消息加的位置是否正确。


yyang0514 2015-04-16
  • 打赏
  • 举报
回复
引用 5 楼 wxhxj0268 的回复:
你可能是在“舍易求难”
有没有可参考的例子呢
笨笨仔 2015-04-16
  • 打赏
  • 举报
回复
你可能是在“舍易求难”
Eleven 2015-04-15
  • 打赏
  • 举报
回复
WM_CTLCOLOR中返回一个NULL HBRUSH

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧