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