有下面的实现图形移动的程序://绘制图形
CRect DrawHospital(CDC *pDC, POINT pos, float fScaleSize, int nDrawMode) 

CRect rect; 
rect.left = pos.x; 
rect.right = (long)(pos.x + 48 * fScaleSize); 
rect.top = pos.y; 
rect.bottom = (long)(pos.y + 48 * fScaleSize); 
int nOldR2Mode; 
if (!nDrawMode) 

nOldR2Mode = pDC->SetROP2(R2_NOT); 
} int nOldMode = pDC->SetBkMode(TRANSPARENT); 
CGdiObject *pOld = pDC->SelectStockObject(NULL_BRUSH); 
CBrush brush; 
if (nDrawMode == 1) 

brush.CreateSolidBrush(COLOR_HOSPITAL); 

else 

brush.CreateSolidBrush(COLOR_SELECTED); 

CRect rectFill; 
rectFill.left = (long)(pos.x + 16 * fScaleSize); 
rectFill.top = pos.y; 
rectFill.right = (long)(pos.x + 32 * fScaleSize); 
rectFill.bottom = (long)(pos.y + 48 * fScaleSize); 
pDC->FillRect(rectFill, &brush); 
rectFill.left = pos.x; 
rectFill.top = (long)(pos.y + 16 * fScaleSize); 
rectFill.right = (long)(pos.x + 48 * fScaleSize); 
rectFill.bottom = (long)(pos.y + 32 * fScaleSize); 
pDC->FillRect(rectFill, &brush); 
pDC->SelectObject(pOld); 
pDC->SetBkMode(nOldMode); if (!nDrawMode) 

pDC->SetROP2(nOldR2Mode); 
} return rect; 
} //移动图形
void MoveHospital(CView *pView, HOSPITAL *pHos, POINT posJumpOff, POINT posDestination) 

pHos->pos = posDestination; 
CRect oldRect = DrawHospital(pView->GetDC(), posJumpOff, pHos->fSize, 0); 
CRect newRect = DrawHospital(pView->GetDC(), posDestination, pHos->fSize, 2); 
//pView->InvalidateRect(oldRect); 
//pView->InvalidateRect(newRect); 
} 如果按照鼠标左键按下开始移动,鼠标移动时清除上次所绘制的图形,鼠标弹起时在该处绘制,会出现的问题是:鼠标移动的过程中看不到所绘制的图形,直到鼠标左键弹起时才能看到完整的图形,请问如何解决这个问题,谢谢!

解决方案 »

  1.   

    在onmousemove 计算出窗体坐标,在每次结束后强制 RedrawWindow();
    响应 onpain 绘制图像使用双缓冲技术
      

  2.   

    添加鼠标移动事件,在此事件中根据鼠标坐标值绘制新的图形,并用SetROP2(R2_NOT)擦去上一次的图形
      

  3.   

    方案一
    onmousemove 事件函数中
     计算移动后的图形位置,
     在最后
     调用 RedrawWindow();onpain 事件函数
      
      先建立内存DC 
      在 内存DC 全部重画  最后将其贴入窗体DC
      

  4.   

    注 这个窗体DC 是用 GetDC 获取的,因这方案一是全部重绘
      

  5.   

    利用SetROP2(R2_NOT)根本擦不去上一次的图形
      

  6.   

    方案二
     onmousemove 事件函数中
     计算出移动之前的图像位置
     计算移动后的图形位置,
     计算出两个图像区域的并集别A
     在最后
     调用 RedrawWindow(A,....),这个并集代表要更新的区域;onpain 事件函数
      
      先建立内存DC 
      在 内存DC 全部重画
      用 CPaintDC 获取DC
      最后将其贴入窗体DC