VC+双缓冲+滚动字幕实现代码

VC+双缓冲+滚动字幕实现代码

ID:37900246

大小:57.50 KB

页数:3页

时间:2019-06-02

VC+双缓冲+滚动字幕实现代码_第1页
VC+双缓冲+滚动字幕实现代码_第2页
VC+双缓冲+滚动字幕实现代码_第3页
资源描述:

《VC+双缓冲+滚动字幕实现代码》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、1.      闪烁产生原因首先,介绍一下为什么会产生闪烁。我们在绘图时收到WM_PAINT消息后,系统会调用默认的画刷来填充被Invalidate的区域,这样由于时间差的原因,会产生闪烁的现象。2.      双缓冲原理双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。 3. 相关的函数介绍1)  为屏幕DC创建兼容的内存DC:CreateCompatibleDC

2、()if(!m_dcMemory.CreateCompatibleDC(NULL))//CDCm_dcMemory;{::PostQuitMessage(0);}2)  创建位图:CreateCompatibleBitmap()m_Bmp.CreateCompatibleBitmap(&m_dcMemory,rt.Width(),rt.Height());//CBitmapm_Bmp;3)  把位图选入设备环境:SelectObject(),可以理解为选择画布::SelectObject(m_dcMemory.GetSafeHdc(),m_Bmp);4)  把绘制好的图形“

3、拷贝“到屏幕上:BitBlt()pdcView->BitBlt(0,0,rt.Width(),rt.Height(),&m_dcMemory,0,0,SRCCOPY);详细的函数可以查看MSDN。4. 本例中的实现1) 在OnTime的时候调用DrawHorizontalText方法voidCScrollMessageDlg::OnTimer(UINTnIDEvent){//TODO:Addyourmessagehandlercodehereand/orcalldefaultDrawHorizontalText();CDialog::OnTimer(nIDEvent);}2

4、) 双缓冲绘图voidCScrollMessageDlg::DrawHorizontalText(){//若当前要显示的消息为空//清除显示区域if(!m_lsShowMessage.size()){Invalidate();//调用默认画刷m_Brush把整个区域涂黑return;}//计算当前滚动文字的文字if(m_StringCurrentPos<-(m_lsShowMessage[m_iShowCount].GetLength()*m_logFont.lfWidth+m_logFont.lfWidth)){m_iShowCount=(++m_iShowCount)

5、%m_lsShowMessage.size();m_StringCurrentPos=m_SystemMetricsCX;//回到起始位置}//判断是否暂停,若非,右距离减一if(!m_isPause)m_StringCurrentPos=m_StringCurrentPos-1;//每步向左移动距离//双缓冲绘图CRectrect;CDC*pDc;//屏幕绘图设备CDCmemDC;//内存绘图设备GetClientRect(&rect);pDc=this->GetDC();//指针CBitmapmemBitmap;//创建内存绘图设备memDC.CreateCompati

6、bleDC(NULL);memBitmap.CreateCompatibleBitmap(pDc,rect.right,rect.bottom);memDC.SelectObject(&memBitmap);//自定义绘图函数memDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(155,0,0));memDC.SelectObject(&m_font);memDC.SetTextColor(RGB(255,180,0));memDC.SetBkMode(TRANSPARENT);memDC.Rectangle(&rec

7、t);memDC.FillRect(&rect,&m_brush);memDC.TextOut(m_StringCurrentPos,m_iYLocation,m_lsShowMessage[m_iShowCount]);//把内存绘图拷贝到屏幕pDc->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);//清理释放this->ReleaseDC(pDc);memDC.DeleteDC();memBitmap.DeleteObj

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。