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

Function to move a SDL2 window while mouse down flickers the window and doesn't move 'fast' enough

本文关键字:移动 窗口 闪烁 速度 不够 功能 鼠标 SDL2      更新时间:2023-10-16

我做了一个函数来移动一个无边框的SDL窗口。 我使用SDL_MOUSEBUTTONDOWN来"激活"窗口移动,SDL_MOUSEBUTTONUP来"停用"它。 出于某种原因,它不仅像它应该的那样移动,而且移动速度比我的鼠标慢得多,如果我移动它很远的距离,它会闪烁。

我使用的是SDL2,而我使用的是Windows 10。

我的循环总是更新我的鼠标位置,并且该函数采用鼠标位置将其减少最后一个鼠标位置,然后将窗口移动该距离。

sPos moveClock(int event){
sPos temPos = setPos(0,0);
if(tempMoveVar==1){
temPos = setPos(gvMousePos.x-mPos.x,gvMousePos.y-mPos.y);
mPos = setPos(gvMousePos.x,gvMousePos.y);
}else if(event==-1){    //Mouse Down
mPos = setPos(gvMousePos.x,gvMousePos.y);
tempMoveVar=1;
}
if(event==-65){         //Mouse Up
tempMoveVar=0;
}
return temPos;
}

我只想在鼠标按钮按下时窗口"随着"鼠标移动,就像您通常可以移动窗口一样。

与其手动移动窗口,我建议使用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将收到您在调用SDL_SetWindowHitTest时传递给callback_data的相同指针。您可以使用此指针将任意数据传递给回调;或者,如果您不需要它,只需将其设置为0.

您的回调应返回以下内容之一:

  • SDL_HITTEST_NORMAL- 无操作。
  • SDL_HITTEST_DRAGGABLE- 拖动此像素可移动窗口。
  • SDL_HITTEST_RESIZE_*- 拖动此像素可调整窗口特定边缘的大小。(这里*是:TOPLEFTTOPTOPRIGHTRIGHTBOTTOMRIGHTBOTTOMBOTTOMLEFTLEFT(。