移动的圆点。 我在对话框上安了一个图像控件,然后再图像控件上装载了一张800X600的位图作背景,现在要实现红色圆点在图像控件背景图上移动,用一般的方法可以实现,但圆点有闪动,用双缓存,怎么也实现不了,大家帮帮忙。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用双缓冲,背景和前景都要绘制到内存位图上。如果不想这样,可以用InvalidateRect来缩小背景刷新的区域(旧的位置),在新的区域绘制圆点。 感谢Mackz(在相互)的答复,按照你的说话作如下修改:m_pBitmap->LoadBitmap(IDB_BITMAP1); //把IDB_BITMAP1是背景图CBitmap *pOldBitmap = m_pMemoryDC->SelectObject(m_pBitmap);// 把背景图装载到内存DCm_pMemoryDC->Ellipse (X,Y,X+20,Y+20);//画圆刷子加不进去,画出来的圆,边框是黑色,里面是白色,怎么办 什么叫“刷子加不进去”,没看到你使用画刷的代码啊?画刷要选入m_pMemoryDC中。 按照Mackz(在相互)的思路再次作如下修改,代码如下,能画出彩色圆,但还是闪动。不知到哪儿出了问题,Mackz帮忙看看。谢谢了。void CTUDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default switch(nIDEvent) { case 1: { CWnd* pWnd=GetDlgItem(IDC_PIC); CDC *pDC=pWnd->GetDC(); pWnd->Invalidate(); pWnd->UpdateWindow(); CRect rectCtrl; pWnd->GetClientRect(rectCtrl); CDC *m_pMemoryDC=new CDC(); CBitmap *m_pBitmap=new CBitmap(); m_pMemoryDC->CreateCompatibleDC(pDC); m_pBitmap->CreateCompatibleBitmap(pDC,rectCtrl.right,rectCtrl.bottom); CBitmap *pOldBitmap = m_pMemoryDC->SelectObject(m_pBitmap);// //pDC所指的PIC控件里面已经装载了背景图,拷贝背景图到内存DC m_pMemoryDC->BitBlt(rectCtrl.left,rectCtrl.top,rectCtrl.right, rectCtrl.bottom,pDC,0,0,SRCCOPY); DrawCircle(m_pMemoryDC); //我的画圆函数,可以画出彩色圆了 pDC->BitBlt(rectCtrl.left,rectCtrl.top,rectCtrl.right, rectCtrl.bottom,m_pMemoryDC,0,0,SRCCOPY);//画好了贴出来。 m_pMemoryDC->DeleteDC(); m_pBitmap->DeleteObject (); delete m_pMemoryDC; delete m_pBitmap; pWnd->ReleaseDC(pDC); break; } case 2: break; case 3: break; } CDialog::OnTimer(nIDEvent);}//我的画圆函数,其中CArray<CPoint,CPoint> m_ptArray 是全局变量,记录点坐标 void CTUDlg::DrawCircle(CDC* pDC){ CPen* pen = new CPen(PS_SOLID, 1, RGB(255, 0, 0)); CPen* oldpen=pDC->SelectObject (pen); CBrush* brush=new CBrush(RGB(255,0,0)); CBrush *pOldbrush = pDC->SelectObject(brush);// pDC->Ellipse (m_ptArray[0].x,m_ptArray[0].y,m_ptArray[0].x+5, m_ptArray[0].y+5); pDC->SelectObject (pOldbrush); pDC->SelectObject (oldpen); if (m_ptArray[0].x <200) { m_ptArray[0].x=m_ptArray[0].x +1; } else { m_ptArray[0].y =m_ptArray[0].y +1; if (m_ptArray[0].y >200) KillTimer(1); } delete brush; delete pen;} 删除掉 pWnd->Invalidate(); pWnd->UpdateWindow(); 问题已经解决,谢谢Mackz(在相互) 求助:关于对话框的滚动条的问题 刷卡是怎么回事? 【200分求个意见,up有分!】directshow捕获的视频流,对每一祯处理后进行播放,用directdraw合适吗? 有谁知道协议软件工程师是做什么的吗? 如何用mfc在视图窗口外面绘图? 高分请教一下高手:如何读取函数的调用堆栈?? 讨论:关于gethostname()的问题: 关于CreateFile函数文件命名的问题?? COM动态调用Dll问题 带检查框的树控件单击检查框时发送什么消息?紧急求助!!! 属性页对话框中的标签是什么控件,如何对它们做特殊的绘制? 怎样刷新PIC控件的内容
m_pBitmap->LoadBitmap(IDB_BITMAP1); //把IDB_BITMAP1是背景图
CBitmap *pOldBitmap = m_pMemoryDC->SelectObject(m_pBitmap);// 把背景图装载到内存DC
m_pMemoryDC->Ellipse (X,Y,X+20,Y+20);//画圆
刷子加不进去,画出来的圆,边框是黑色,里面是白色,怎么办
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case 1:
{ CWnd* pWnd=GetDlgItem(IDC_PIC); CDC *pDC=pWnd->GetDC(); pWnd->Invalidate(); pWnd->UpdateWindow(); CRect rectCtrl;
pWnd->GetClientRect(rectCtrl); CDC *m_pMemoryDC=new CDC(); CBitmap *m_pBitmap=new CBitmap(); m_pMemoryDC->CreateCompatibleDC(pDC); m_pBitmap->CreateCompatibleBitmap(pDC,rectCtrl.right,rectCtrl.bottom);
CBitmap *pOldBitmap = m_pMemoryDC->SelectObject(m_pBitmap);//
//pDC所指的PIC控件里面已经装载了背景图,拷贝背景图到内存DC
m_pMemoryDC->BitBlt(rectCtrl.left,rectCtrl.top,rectCtrl.right,
rectCtrl.bottom,pDC,0,0,SRCCOPY);
DrawCircle(m_pMemoryDC); //我的画圆函数,可以画出彩色圆了 pDC->BitBlt(rectCtrl.left,rectCtrl.top,rectCtrl.right,
rectCtrl.bottom,m_pMemoryDC,0,0,SRCCOPY);//画好了贴出来。 m_pMemoryDC->DeleteDC(); m_pBitmap->DeleteObject (); delete m_pMemoryDC; delete m_pBitmap; pWnd->ReleaseDC(pDC);
break;
}
case 2:
break;
case 3:
break;
}
CDialog::OnTimer(nIDEvent);
}
//我的画圆函数,其中CArray<CPoint,CPoint> m_ptArray 是全局变量,记录点坐标
void CTUDlg::DrawCircle(CDC* pDC)
{
CPen* pen = new CPen(PS_SOLID, 1, RGB(255, 0, 0));
CPen* oldpen=pDC->SelectObject (pen);
CBrush* brush=new CBrush(RGB(255,0,0));
CBrush *pOldbrush = pDC->SelectObject(brush);//
pDC->Ellipse (m_ptArray[0].x,m_ptArray[0].y,m_ptArray[0].x+5,
m_ptArray[0].y+5);
pDC->SelectObject (pOldbrush);
pDC->SelectObject (oldpen);
if (m_ptArray[0].x <200)
{
m_ptArray[0].x=m_ptArray[0].x +1;
}
else
{
m_ptArray[0].y =m_ptArray[0].y +1;
if (m_ptArray[0].y >200)
KillTimer(1);
}
delete brush;
delete pen;
}
pWnd->Invalidate(); pWnd->UpdateWindow();