有下面的实现图形移动的程序://绘制图形
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);
} 如果按照鼠标左键按下开始移动,鼠标移动时清除上次所绘制的图形,鼠标弹起时在该处绘制,会出现的问题是:鼠标移动的过程中看不到所绘制的图形,直到鼠标左键弹起时才能看到完整的图形,请问如何解决这个问题,谢谢!
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);
} 如果按照鼠标左键按下开始移动,鼠标移动时清除上次所绘制的图形,鼠标弹起时在该处绘制,会出现的问题是:鼠标移动的过程中看不到所绘制的图形,直到鼠标左键弹起时才能看到完整的图形,请问如何解决这个问题,谢谢!
响应 onpain 绘制图像使用双缓冲技术
onmousemove 事件函数中
计算移动后的图形位置,
在最后
调用 RedrawWindow();onpain 事件函数
先建立内存DC
在 内存DC 全部重画 最后将其贴入窗体DC
onmousemove 事件函数中
计算出移动之前的图像位置
计算移动后的图形位置,
计算出两个图像区域的并集别A
在最后
调用 RedrawWindow(A,....),这个并集代表要更新的区域;onpain 事件函数
先建立内存DC
在 内存DC 全部重画
用 CPaintDC 获取DC
最后将其贴入窗体DC