【问题标题】:Function to move a SDL2 window while mouse down flickers the window and doesn't move 'fast' enough在鼠标按下时移动 SDL2 窗口的功能会闪烁窗口并且移动不够“快”
【发布时间】:2019-10-03 06:18:35
【问题描述】:

我制作了一个移动无边框 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 而不是手动移动窗口。此外,我会使用命名常量而不是事件 ID 的硬编码值。
  • 我找不到很多关于 SDL_SetWindowHitTest 的信息,但这听起来正是我正在寻找的东西,但我不知道如何使用它。 SDL_HitTest callback 应该放什么,void* callback_data 应该放什么 - 你能帮我理解吗?或者你能提供一些教程吗? :)
  • 好的,我会写一个完整的答案。

标签: c++ sdl mouse


【解决方案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 将收到您在调用 SDL_SetWindowHitTest 时传递给 callback_data 的相同指针。您可以使用此指针将任意数据传递给您的回调;或者,如果您不需要它,只需将其设置为 0

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

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

【讨论】:

  • 非常感谢,这真的很有帮助。我会稍微修改一下,到目前为止它移动得很顺畅,但确实回到了原来的位置。但我想我知道如何完成任务。再次非常感谢。
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2014-12-29
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
相关资源
最近更新 更多