我的功能是这样的:
视图上显示了一个图片作为背景. 然后在这个上面要用双缓冲的方式在指定的一个区域内显示透明的字. 这个字其实就是一组抽奖名单,要不停地在这个区域内滚动显示.知道的帮个忙,解决之后立即给分.下面是我的代码,存在很多问题,一个就是在这块区域内除了字之外的背景为黑色.
二是滚动效果的时候图像重叠了.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();
视图上显示了一个图片作为背景. 然后在这个上面要用双缓冲的方式在指定的一个区域内显示透明的字. 这个字其实就是一组抽奖名单,要不停地在这个区域内滚动显示.知道的帮个忙,解决之后立即给分.下面是我的代码,存在很多问题,一个就是在这块区域内除了字之外的背景为黑色.
二是滚动效果的时候图像重叠了.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();
解决方案 »
- ADO连接数据库在对话框中显示
- 3D中如何 使用一点旋转。就是第3人称视角。
- 关于CONTAINING_RECORD
- 如何在MFC Dialog使用自己写的CWnd派生类?
- 怎么把其它程序的窗口调来最前方
- 两天了,我就研究了下面一点东西,分都贴光了,大虾救我
- 如何做会动的选择框
- 求救~~如何用installsheild监视软件的安装阿~~~
- 挺郁闷的问题(刚生成就有错误,自己也没动过)
- 那里有BoundsChecker Trial Version (free version 更好) 的国内下载地址?
- 关于CDialog的问题,是编译时说这个类被定义,急啊!!!
- 在opengl上绘制二维图形的问题
[email protected]
在把内存位图选入内存设备内容之后,用你指定的透明色FillRect一下,然后指定一个非透明色的颜色绘制文本,最后再把画好的图片刷上去就OK了。请教一下透明色怎么弄? 用RGB(255,255,255) ,这样随便弄一个颜色?
现在就是第二个问题,滚动的时候上次画的东西没刷掉.都重叠在一起了.
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.
memDC2.SelectObject(pOld2);
MemDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));现在就是第二个问题,滚动的时候上次画的东西没刷掉.都重叠在一起了
不擦背景就发生重叠了.
不擦前台的背景,后台的背景还是要擦的啊。InvalidateRect是通知Windows擦前台的背景。
后台背景擦掉再写新的,然后BitBlt完全用后台的东西替换到前台来,所以不会发生重叠。
memdc = create mem dc;
bmp = create bmp;
memdc.selectobect(bmp);
memdc.erasebackground;
memdc.drawtext;
paintdc.bitblt(memdc);
...OnTimer:
get new number;
InvalidateRect(&rect, FALSE);