gpt4 book ai didi

c++ - 如何使鼠标移动没有延迟?

转载 作者:太空狗 更新时间:2023-10-29 21:27:27 25 4
gpt4 key购买 nike

我正在制作一个程序,让我可以点击两个同心圆的中心,然后通过鼠标移动改变它的位置,我可以对它的半径做同样的事情。问题是鼠标移动之后是圆绘制的延迟响应,使半径跟随鼠标而不是在移动过程中完全位于同一位置。

你们知道如何让它像那样工作吗?绘图后的针点。

一些处理鼠标点击和移动的代码:

void DemoApp::OnLButtonDown(FLOAT pixelX, FLOAT pixelY)
{
SetCapture(m_hwnd);

mouseRegion = DPIScale::PixelsToDips(pixelX, pixelY);
FLOAT xDifference = centerCircles.x - mouseRegion.x;
FLOAT yDifference = centerCircles.y - mouseRegion.y;
FLOAT distanceToCenter = sqrtf(xDifference*xDifference + yDifference*yDifference);

if(distanceToCenter < 10.0f)
{
centerMove = true;
minimumRadiusCircleMove = false;
maximumRadiusCircleMove = false;
}
else if((distanceToCenter > (minimumRadius - 1.0f)) && (distanceToCenter < (minimumRadius + 1.0f)))
{
minimumRadiusCircleMove = true;
centerMove = false;
maximumRadiusCircleMove = false;
}
else if((distanceToCenter > (maximumRadius - 1.0f)) && (distanceToCenter < (maximumRadius + 1.0f)))
{
maximumRadiusCircleMove = true;
centerMove = false;
minimumRadiusCircleMove = false;
}
else
{
centerMove = false;
minimumRadiusCircleMove = false;
maximumRadiusCircleMove = false;
}


InvalidateRect(m_hwnd, NULL, FALSE);
}

void DemoApp::OnMouseMove(int pixelX, int pixelY, DWORD flags)
{
if (flags & MK_LBUTTON)
{
if(centerMove)
{
centerCircles = DPIScale::PixelsToDips(pixelX, pixelY);

FLOAT distanceLeftToCenterCircles = abs(centerCircles.x - bitmapTopLeft);
FLOAT distanceTopToCenterCircles = abs(centerCircles.y - bitmapTopRight);

percentageFromLeft = distanceLeftToCenterCircles / displaySizeWidth;
percentageFromTop = distanceTopToCenterCircles / displaySizeHeight;

}
else if(minimumRadiusCircleMove)
{
radiusSelection = DPIScale::PixelsToDips(pixelX, pixelY);
FLOAT xDifference = centerCircles.x - radiusSelection.x;
FLOAT yDifference = centerCircles.y - radiusSelection.y;
minimumRadius = sqrtf(xDifference*xDifference + yDifference*yDifference);

minimumRadiusPercentage = minimumRadius/(displaySizeWidth/2);
}
else if(maximumRadiusCircleMove)
{
radiusSelection = DPIScale::PixelsToDips(pixelX, pixelY);
FLOAT xDifference = centerCircles.x - radiusSelection.x;
FLOAT yDifference = centerCircles.y - radiusSelection.y;
maximumRadius = sqrtf(xDifference*xDifference + yDifference*yDifference);

maximumRadiusPercentage = maximumRadius/(displaySizeWidth/2);
}

InvalidateRect(m_hwnd, NULL, FALSE);
}
}

void DemoApp::OnLButtonUp()
{
ReleaseCapture();
}

最佳答案

根据 MSDN ( http://msdn.microsoft.com/en-us/library/dd145002%28v=vs.85%29.aspx ) InvalidateRect 不会导致窗口被重新绘制直到下一个 WM_PAINT 和“只要更新区域不为空并且没有其他消息,系统就会向窗口发送 WM_PAINT 消息该窗口的应用程序队列。”所以不是立竿见影的。

我在 MSDN 上找到了一个可能的解决方案 Drawing Without the WM_PAINT Message

关于c++ - 如何使鼠标移动没有延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9065782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com