按下鼠标时移动SDL2窗口的功能会使窗口闪烁,并且移动速度不够快

时间:2019-10-02 21:29:50

标签: c++ sdl mouse

我做了一个移动无边界SDL窗口的功能。我使用strrchr()“激活”窗口移动,并使用char *sepptr = strrchr(buffer, '\\'); if (sepptr == NULL) { sepptr = buffer; // no directory delimiter, replace it completely } else { sepptr++; // point to just past the delimiter } strcpy(sepptr, "license.lic"); // Overwrite executable name with license name “禁用”窗口移动。由于某种原因,它不仅会像应该的那样移动,而且会移动得比我的鼠标慢,并且如果我将其移动一段距离,它也会闪烁。

我使用SDL2,并且我在Windows 10上。

我的循环总是更新我的鼠标位置,该功能将鼠标位置减小到最后一个鼠标位置,然后将窗口移动该距离。

SDL_MOUSEBUTTONDOWN

我只希望窗口在按下鼠标按钮时“用”鼠标移动,就像您通常可以移动窗口一样。

1 个答案:

答案 0 :(得分:1)

建议不要使用SDL_SetWindowHitTest,而不是手动移动窗口:

int SDL_SetWindowHitTest(SDL_Window* window, SDL_HitTest callback, void* callback_data);

此功能可让您指定拖动窗口的特定像素所进行的操作(可能的动作是移动窗口,调整窗口大小或不执行任何操作)。

在创建窗口之后,您可能应该调用一次此函数。

参数为:

  • SDL_Window* window不言自明。

  • SDL_HitTest callback接收到一个函数,当给定像素坐标时,该函数确定拖动该像素的行为。

  • void* callback_data如下所述。

您需要编写一个传递给callback的函数。它必须具有以下返回类型和参数类型:

SDL_HitTestResult MyCallback(SDL_Window* win, const SDL_Point* area, void* data)
{
    ...
}

area->xarea->y是要检查的像素的坐标。 win是窗口。

data将收到调用callback_data时传递给SDL_SetWindowHitTest的指针。您可以使用此指针将任意数据传递给回调。或者,如果不需要,只需将其设置为0

您的回调应返回以下值之一:

  • SDL_HITTEST_NORMAL-不执行任何操作。
  • SDL_HITTEST_DRAGGABLE-拖动此像素可移动窗口。
  • SDL_HITTEST_RESIZE_*-拖动此像素可调整窗口的特定边缘(或多个边缘)的大小。 (这里*是以下之一:TOPLEFTTOPTOPRIGHTRIGHTBOTTOMRIGHTBOTTOM,{{1 }},BOTTOMLEFT)。