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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于移动SDL2窗口的功能,而鼠标按下时会闪烁该窗口,并且移动速度不够快相关的知识,希望对你有一定的参考价值。

我做了一个移动无边界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

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->x是要检查的像素的坐标。 area->y是窗口。

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

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

  • [0-无操作。
  • [SDL_HITTEST_NORMAL-拖动此像素将移动窗口。
  • SDL_HITTEST_DRAGGABLE-拖动此像素可调整窗口的特定边缘(或多个边缘)的大小。 (这里SDL_HITTEST_RESIZE_*是以下之一:*TOPLEFTTOPTOPRIGHTRIGHTBOTTOMRIGHTBOTTOMBOTTOMLEFT。)>

以上是关于用于移动SDL2窗口的功能,而鼠标按下时会闪烁该窗口,并且移动速度不够快的主要内容,如果未能解决你的问题,请参考以下文章

使 Pyqt 按钮在鼠标按下而不是鼠标按下时运行功能

为啥鼠标右键单击在按下时会触发“pointerdown”事件,但在释放时不会触发“pointerup”事件?

UIButton 按下时移动

理解SetCapture()和ReleaseCapture()及GetCapture()作用

鼠标左键按下时如何更改鼠标光标?

SDL2 因 InputHandler 鼠标移动而崩溃