调整窗口大小后无法正确检索鼠标坐标
Posted
技术标签:
【中文标题】调整窗口大小后无法正确检索鼠标坐标【英文标题】:cannot retrieve correctly the mouse coordinates after resizing a window 【发布时间】:2012-05-22 00:07:31 【问题描述】:下面是显示我面临的问题的简化代码。
代码的目的是创建一个 512x512 的窗口,并在检测到左键单击时将其顶层表面的 Y 尺寸更改为 512x(512+25)。当检测到再次左键单击时,我们将尺寸恢复为 512x512。
当检测到左键单击事件或检测到mouseMotionEvent
时,我们会显示(使用printf()
)鼠标坐标。
观察到奇怪的行为:
运行代码时,左键单击一次,窗口的Y尺寸发生变化,但是当我在新创建的区域内移动鼠标时,显示的Y坐标卡在511。
有时我没有得到这种奇怪的行为,那么 Y 坐标可能大于 511。要获得这种奇怪的行为,左键单击几次,快速移动鼠标。
编译(linux):
$ gcc -o test test.c `sdl-config --cflags --libs`
来源:(test.c)
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
/* Prototypes */
void event_handler(void);
/* global variables declaration */
SDL_Surface *screen=NULL;
/***** MAIN FUNCTION *****/
int main(int argc, char** argv)
/* init SDL */
if (SDL_Init(SDL_INIT_VIDEO) < 0)
fprintf(stderr, "Erreur à l'initialisation de la SDL : %s\n", SDL_GetError());
exit(EXIT_FAILURE);
if ((screen = SDL_SetVideoMode(512, 512, 32, SDL_SWSURFACE )) == NULL)
fprintf(stderr, "Graphic mode could not be correctly initialized : %s\n", SDL_GetError());
exit(EXIT_FAILURE);
SDL_WM_SetCaption("my window", NULL);
/* handle event & wait until quit_event is raised */
event_handler();
/* quit & return */
SDL_Quit();
return EXIT_SUCCESS;
/*** Event handler ***/
void event_handler(void)
SDL_Event event;
int quit=0;
char message_is_displayed=0;
SDL_Rect mess_coord = 0,512,512,512+25; //x_start,y_start,width,height
while(!quit)
SDL_WaitEvent(&event);
switch(event.type)
case SDL_QUIT:
quit = 1;
break;
case SDL_MOUSEBUTTONDOWN:
if (event.button.button == SDL_BUTTON_LEFT)
if(!message_is_displayed)
screen = SDL_SetVideoMode(512,512+25, 32, SDL_SWSURFACE); //change the screen size
SDL_FillRect(screen, &mess_coord, SDL_MapRGB(screen->format, 255, 255, 255)); // fill in white the bottom area
else
screen = SDL_SetVideoMode(512, 512, 32, SDL_SWSURFACE);
message_is_displayed = !message_is_displayed;
SDL_Flip(screen);
printf("mouse position: (%d,%d)\n",event.button.x, event.button.y);
break;
case SDL_MOUSEMOTION:
printf("mouse position: (%d,%d)\n",event.motion.x, event.motion.y);
break;
【问题讨论】:
在 Windows 上使用 Visual Studio 2010 C++ 编译时运行良好,没有描述的问题 您提到您在快速移动鼠标的同时多次单击鼠标。我想知道您是否由于窗口大小更改而丢失鼠标事件,并且鼠标单击暂时超出窗口区域,或者某些鼠标事件正在从消息队列中删除,而其他事件则被放入。您描述的行为听起来由于 SDL 的不同层和您的应用程序之间存在竞争条件,因此非常具有情境性。 另请参阅此 *** 帖子。 ***.com/questions/4272506/… 【参考方案1】:只要您按下鼠标按钮,它就会调整大小,然后打印按钮位置。它可能是在裁剪窗口后裁剪鼠标位置。
尝试仅在 SDL_MOUSEBUTTONUP 上调整窗口大小。这样你在鼠标真正点击时打印当前位置(SDL_MOUSEBUTTONDOWN),然后在释放后调整大小。
【讨论】:
【参考方案2】:如果您使用的是 SDL1,我认为您应该将其添加到您的代码中:
int x, y;
SDL_GetMouseState(&x, &y);
现在鼠标位置在x
和y
。
【讨论】:
【参考方案3】:您可以尝试以下函数来获取变量 oldx 和 oldy 中的 x 和 y 坐标
int oldx,oldy;
oldx=wherex();
oldy=wherey();
在 Windows 中工作。
【讨论】:
以上是关于调整窗口大小后无法正确检索鼠标坐标的主要内容,如果未能解决你的问题,请参考以下文章