再问双缓冲有关问题,怎么在一个背景图片上轮流显示不同透明的字符串
再问双缓冲问题,如何在一个背景图片上轮流显示不同透明的字符串
我的功能是这样的:
视图上显示了一个图片作为背景. 然后在这个上面要用双缓冲的方式在指定的一个区域内显示透明的字. 这个字其实就是一组抽奖名单,要不停地在这个区域内滚动显示.
知道的帮个忙,解决之后立即给分.
下面是我的代码,存在很多问题,一个就是在这块区域内除了字之外的背景为黑色.
二是滚动效果的时候图像重叠了.
CDC MemDC;
CRect rect; //视图上的一块区域
CDC *pDC = GetDC();
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
dcCache.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//MemDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));
MemDC.SetTextColor(color);
//MemDC.SetBkMode(TRANSPARENT);
CFont *pOldFont2 = (CFont*)MemDC.SelectObject(&font);
MemDC.TextOut(0,0,sName); //sName每次循环的时候都有不同的值
::TransparentBlt(pDC-> m_hDC,0,0,rect.Width(),rect.Height(),MemDC.m_hDC,0,0,rect.Width(),rect.Height(),RGB(255,255,255));
MemDC.SelectObject(pOldFont2);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
------解决方案--------------------
在把内存位图选入内存设备内容之后,用你指定的透明色FillRect一下,然后指定一个非透明色的颜色绘制文本,最后再把画好的图片刷上去就OK了。
------解决方案--------------------
晕。。。刚上班才见到这贴。。如果可以的话,把代码发给我,我晚上回去做好后发给你,公司里发不了邮件
------解决方案--------------------
其实就是背景图上写字,然后按设置时间刷新view使之看上去象动画...
void CxxxxView::mixFrame(CDC *pDC, HBITMAP hBGbitmap, const CPoint &pt,
const CString &drawText)
{
CDC memDC1,memDC2;
CBitmap srcBitmap,destBitmap;
CBitmap *pOld1,*pOld2;
//克隆原背景图,原背景图没变化
memDC1.CreateCompatibleDC(pDC);
memDC2.CreateCompatibleDC(pDC);
srcBitmap.Attach(hBGbitmap);
BITMAP bm;
srcBitmap.GetObject(sizeof(BITMAP),&bm);
destBitmap.CreateCompatibleBitmap(pDC,bm.bmWidth,bm.bmHeight);
pOld1 = (CBitmap *)memDC1.SelectObject(&srcBitmap);
pOld2 = (CBitmap *)memDC2.SelectObject(&destBitmap);
memDC2.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&memDC1,0,0,SRCCOPY);
memDC1.SelectObject(pOld1);
srcBitmap.Detach();
// draw the string
CFont *pOldfont = (CFont *)memDC2.SelectObject(&font);
COLORREF cr = memDC2.SetTextColor(color);
int oldMode = memDC2.SetBkMode(TRANSPARENT);
memDC2.TextOut(pt.x, pt.y, drawText);
//show it...
pDC-> BitBlt(0,0,bm.bmWidth,bm.bmheight,&memDC2,0,0,SRCCOPY);
// cleanup
memDC2.SelectObject(pOldfont);
memDC2.SelectObject(pOld2);
}
======================================================================
随手写的,可能有错误,参数hBGbitmap是载入的bg图句柄,pt是要写字的坐标..
把mixFrame放在ondraw(),只要在一个timer里不断改变pt坐标的值,然后Invalidate(),看上去就象动画在卷动.如果要拉伸,把BitBlt()改为StretchBlt(),防止闪烁在OnEraseBkgnd()里return 1.
------解决方案--------------------
楼上的,感觉下面这个可以不用吧?因为创建的DC是局部的,都销毁了还还原它的画图设备干吗?
memDC2.SelectObject(pOldfont);
memDC2.SelectObject(pOld2);
------解决方案--------------------
InvalidateRect一下。
------解决方案--------------------
将原始图象指定区块拷贝到画图缓冲,在该缓冲上写字,将缓冲拷贝到指定区块。
我的功能是这样的:
视图上显示了一个图片作为背景. 然后在这个上面要用双缓冲的方式在指定的一个区域内显示透明的字. 这个字其实就是一组抽奖名单,要不停地在这个区域内滚动显示.
知道的帮个忙,解决之后立即给分.
下面是我的代码,存在很多问题,一个就是在这块区域内除了字之外的背景为黑色.
二是滚动效果的时候图像重叠了.
CDC MemDC;
CRect rect; //视图上的一块区域
CDC *pDC = GetDC();
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
dcCache.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//MemDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));
MemDC.SetTextColor(color);
//MemDC.SetBkMode(TRANSPARENT);
CFont *pOldFont2 = (CFont*)MemDC.SelectObject(&font);
MemDC.TextOut(0,0,sName); //sName每次循环的时候都有不同的值
::TransparentBlt(pDC-> m_hDC,0,0,rect.Width(),rect.Height(),MemDC.m_hDC,0,0,rect.Width(),rect.Height(),RGB(255,255,255));
MemDC.SelectObject(pOldFont2);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
------解决方案--------------------
在把内存位图选入内存设备内容之后,用你指定的透明色FillRect一下,然后指定一个非透明色的颜色绘制文本,最后再把画好的图片刷上去就OK了。
------解决方案--------------------
晕。。。刚上班才见到这贴。。如果可以的话,把代码发给我,我晚上回去做好后发给你,公司里发不了邮件
------解决方案--------------------
其实就是背景图上写字,然后按设置时间刷新view使之看上去象动画...
void CxxxxView::mixFrame(CDC *pDC, HBITMAP hBGbitmap, const CPoint &pt,
const CString &drawText)
{
CDC memDC1,memDC2;
CBitmap srcBitmap,destBitmap;
CBitmap *pOld1,*pOld2;
//克隆原背景图,原背景图没变化
memDC1.CreateCompatibleDC(pDC);
memDC2.CreateCompatibleDC(pDC);
srcBitmap.Attach(hBGbitmap);
BITMAP bm;
srcBitmap.GetObject(sizeof(BITMAP),&bm);
destBitmap.CreateCompatibleBitmap(pDC,bm.bmWidth,bm.bmHeight);
pOld1 = (CBitmap *)memDC1.SelectObject(&srcBitmap);
pOld2 = (CBitmap *)memDC2.SelectObject(&destBitmap);
memDC2.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&memDC1,0,0,SRCCOPY);
memDC1.SelectObject(pOld1);
srcBitmap.Detach();
// draw the string
CFont *pOldfont = (CFont *)memDC2.SelectObject(&font);
COLORREF cr = memDC2.SetTextColor(color);
int oldMode = memDC2.SetBkMode(TRANSPARENT);
memDC2.TextOut(pt.x, pt.y, drawText);
//show it...
pDC-> BitBlt(0,0,bm.bmWidth,bm.bmheight,&memDC2,0,0,SRCCOPY);
// cleanup
memDC2.SelectObject(pOldfont);
memDC2.SelectObject(pOld2);
}
======================================================================
随手写的,可能有错误,参数hBGbitmap是载入的bg图句柄,pt是要写字的坐标..
把mixFrame放在ondraw(),只要在一个timer里不断改变pt坐标的值,然后Invalidate(),看上去就象动画在卷动.如果要拉伸,把BitBlt()改为StretchBlt(),防止闪烁在OnEraseBkgnd()里return 1.
------解决方案--------------------
楼上的,感觉下面这个可以不用吧?因为创建的DC是局部的,都销毁了还还原它的画图设备干吗?
memDC2.SelectObject(pOldfont);
memDC2.SelectObject(pOld2);
------解决方案--------------------
InvalidateRect一下。
------解决方案--------------------
将原始图象指定区块拷贝到画图缓冲,在该缓冲上写字,将缓冲拷贝到指定区块。