如何用双缓冲实现发牌动画 我想做个扑克在移动中的动画,用的是双缓冲,但是牌一移动总是一抖一抖的,不平滑,哪位做过或是有源码,帮帮我,谢谢大家了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 貌似你的双缓冲没用好。GDI连动画都能实现。 void CTestDlg::Display(CRect* pRect, CDC* pDC , int nPos ){ CDC MemDC,SpiritDC; CBitmap MemBitmap; SpiritDC.CreateCompatibleDC(pDC); MemDC.CreateCompatibleDC(pDC); MemBitmap.CreateCompatibleBitmap(pDC,pRect->Width(),pRect->Height()); CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); SpiritDC.SelectObject(&m_SpiritBitmap); MemDC.BitBlt(0,0,m_nWidth,m_nHeight,&SpiritDC,0,0,SRCCOPY); pDC->BitBlt(nPos ,0,pRect->Width(),pRect->Height(),&MemDC,0,0,SRCCOPY); //绘图完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC();}void CTestDlg::OnTimer(UINT_PTR nIDEvent){ // TODO: 在此添加消息处理程序代码和/或调用默认值 //Invalidate(); static int nPos = 0 ; m_nNum++; CString str; str.Format(_T("第 %d 次刷新"),m_nNum); this->SetWindowText(str); CDC* pDC = GetDC() ; Display(&m_cRect, pDC ); CDialog::OnTimer(nIDEvent);}这是牌移动的代码 void CTestDlg::OnBtnTest(){ // TODO: 在此添加控件通知处理程序代码 SetTimer(1,50,NULL);}void CTestDlg::OnTimer(UINT_PTR nIDEvent){ // TODO: 在此添加消息处理程序代码和/或调用默认值 //Invalidate(); static int nPos = -100 ; if(nPos>700) { nPos = 0 ; } nPos += 100 ; m_nNum++; CString str; str.Format(_T("第 %d 次刷新"),m_nNum); this->SetWindowText(str); CDC* pDC = GetDC() ; Display(&m_cRect, pDC ,nPos); CDialog::OnTimer(nIDEvent);}void CTestDlg::Display(CRect* pRect, CDC* pDC , int nPos ){ CDC MemDC,SpiritDC; CBitmap MemBitmap; SpiritDC.CreateCompatibleDC(pDC); MemDC.CreateCompatibleDC(pDC); MemBitmap.CreateCompatibleBitmap(pDC,pRect->Width(),pRect->Height()); CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); SpiritDC.SelectObject(&m_SpiritBitmap); MemDC.BitBlt(nPos,0,m_nWidth,m_nHeight,&SpiritDC,0,0,SRCCOPY); pDC->BitBlt(0 ,0,pRect->Width(),pRect->Height(),&MemDC,0,0,SRCCOPY); //绘图完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC();}这个是最完整的,nPos是每次移动的步长 你是不是在什么地方调用Invalidate();或者其他函数刷新窗口了呀?如果是刷新了窗口那肯定闪,无论你是不是用双缓冲,因为你一旦刷新窗口时就会触发WM_ERASEBKGND消息,也就是调用OnEraseBkgnd()先去清除背景,所以就会学得闪,所以你得重载WM_ERASEBKGND消息,在里面直接添加一行代码,return true;这样就避免了清除背的操作,不会闪了。 没用Invalidate(),WM_ERASEBKGND消息添加了,里面直接return true 的 ,扑克移动时,一顿一顿的 SetTimer(1,50,NULL); // 1s/20祯是不是太慢了,实际上肯定没有20祯,因为还有操作时间。搞快点~~SetTimer(1,15,NULL); DX前缓冲区和后缓冲区就是双缓冲了.系统默认生成的.DDRAW才会分开有双缓冲. Display完成后调用ValidateRect()立即更新试试 你用Paint里面e.Graphics 试下 在Paint事件里面绘制应该就不会了 问个问题哈 高分求教一个软件工程方面的极度深奥和晦涩的问题!! 大家当年都是怎么学WinInet的? 无法找到应用程序组件 因此这个程序未能启动 调试信息与串口数据延时问题? 有没有一种事件, 会在零点触发, 我的服务器程序想在零点清零. 如何模仿鼠标点击在IE窗口中的按钮、选取组合框中某一项?谢谢 大哥哥,大姐姐,在Word中怎么调出带箭头的线条? CFtpConnection的构造函数的问题!!!! 屏蔽ie浏览器的提示的activex控件编写 CreateFile 读写逻辑盘出错,物理盘没有问题。。 VC中Send函数发送不成功的原因
void CTestDlg::Display(CRect* pRect, CDC* pDC , int nPos )
{
CDC MemDC,SpiritDC;
CBitmap MemBitmap; SpiritDC.CreateCompatibleDC(pDC);
MemDC.CreateCompatibleDC(pDC); MemBitmap.CreateCompatibleBitmap(pDC,pRect->Width(),pRect->Height());
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); SpiritDC.SelectObject(&m_SpiritBitmap);
MemDC.BitBlt(0,0,m_nWidth,m_nHeight,&SpiritDC,0,0,SRCCOPY); pDC->BitBlt(nPos ,0,pRect->Width(),pRect->Height(),&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}void CTestDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//Invalidate();
static int nPos = 0 ; m_nNum++;
CString str;
str.Format(_T("第 %d 次刷新"),m_nNum);
this->SetWindowText(str); CDC* pDC = GetDC() ;
Display(&m_cRect, pDC );
CDialog::OnTimer(nIDEvent);
}这是牌移动的代码
void CTestDlg::OnBtnTest()
{
// TODO: 在此添加控件通知处理程序代码
SetTimer(1,50,NULL);
}void CTestDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//Invalidate();
static int nPos = -100 ; if(nPos>700)
{
nPos = 0 ;
}
nPos += 100 ;
m_nNum++;
CString str;
str.Format(_T("第 %d 次刷新"),m_nNum);
this->SetWindowText(str); CDC* pDC = GetDC() ;
Display(&m_cRect, pDC ,nPos);
CDialog::OnTimer(nIDEvent);
}
void CTestDlg::Display(CRect* pRect, CDC* pDC , int nPos )
{
CDC MemDC,SpiritDC;
CBitmap MemBitmap; SpiritDC.CreateCompatibleDC(pDC);
MemDC.CreateCompatibleDC(pDC); MemBitmap.CreateCompatibleBitmap(pDC,pRect->Width(),pRect->Height());
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
SpiritDC.SelectObject(&m_SpiritBitmap);
MemDC.BitBlt(nPos,0,m_nWidth,m_nHeight,&SpiritDC,0,0,SRCCOPY); pDC->BitBlt(0 ,0,pRect->Width(),pRect->Height(),&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}这个是最完整的,nPos是每次移动的步长
搞快点~~
SetTimer(1,15,NULL);