C 调整窗口大小后无法正确检索鼠标坐标

C 调整窗口大小后无法正确检索鼠标坐标,c,sdl,C,Sdl,下面是一个简化的代码,显示了我面临的问题 代码的目的是创建一个512x512窗口,并在检测到左键单击时将其顶层曲面的Y维度更改为512x(512+25)。当检测到另一次左键单击时,我们将尺寸恢复为512x512 当检测到左键单击事件时,或者当检测到mouseMotionEvent时,我们显示(使用printf())鼠标坐标 观察到的奇怪行为: 当我运行代码时,我左键单击一次,窗口的Y维度会改变,但是当我在新创建的区域内移动鼠标时,显示的Y坐标会固定在511 有时我没有这种奇怪的行为,那么Y坐标可

下面是一个简化的代码,显示了我面临的问题

代码的目的是创建一个512x512窗口,并在检测到左键单击时将其顶层曲面的Y维度更改为512x(512+25)。当检测到另一次左键单击时,我们将尺寸恢复为512x512

当检测到左键单击事件时,或者当检测到
mouseMotionEvent
时,我们显示(使用
printf()
)鼠标坐标

观察到的奇怪行为:

当我运行代码时,我左键单击一次,窗口的Y维度会改变,但是当我在新创建的区域内移动鼠标时,显示的Y坐标会固定在511

有时我没有这种奇怪的行为,那么Y坐标可以大于511。要获得这种奇怪的行为,请左键单击几次,快速移动鼠标

要编译(linux):

资料来源:(test.c)

#包括
#包括
#包括
/*原型*/
作废事件处理程序(作废);
/*全局变量声明*/
SDL_表面*屏幕=空;
/*****主要功能*****/
int main(int argc,字符**argv)
{   
/*初始化SDL*/
if(SDL_Init(SDL_Init_视频)<0){
fprintf(标准,“SDL初始化错误:%s\n”,SDL_GetError());
退出(退出失败);
}
如果((屏幕=SDL_设置视频模式(512、512、32、SDL_表面))==NULL){
fprintf(stderr,“图形模式无法正确初始化:%s\n”,SDL_GetError());
退出(退出失败);
}
SDL_WM_SetCaption(“我的窗口”,NULL);
/*处理事件&等待直到引发退出事件*/
事件处理程序();
/*退出并返回*/
SDL_退出();
返回退出成功;
}
/***事件处理程序***/
void事件处理程序(void)
{
SDL_事件;
int-quit=0;
显示字符消息\u=0;
SDL_Rect mess_coord={0512512512+25};/{x_start,y_start,width,height}
而(!退出)
{
SDL_WaitEvent(&event);
开关(事件类型)
{
案例SDL_退出:
退出=1;
打破
外壳SDL_鼠标按钮向下:
if(event.button.button==SDL_按钮左)
{
如果显示(!消息)
{
screen=SDL_SetVideoMode(512512+25,32,SDL_SWSURFACE);//更改屏幕大小
SDL_FillRect(screen,&mess_coord,SDL_MapRGB(screen->format,255,255));//在底部区域填充白色
}
其他的
{
屏幕=SDL_设置视频模式(512、512、32、SDL_表面);
}
消息\u显示=!消息\u显示;
SDL_翻转(屏幕);
}
printf(“鼠标位置:(%d,%d)\n”、event.button.x、event.button.y);
打破
案例SDL_:
printf(“鼠标位置:(%d,%d)\n”、event.motion.x、event.motion.y);
打破
}
}
}

您可以尝试使用以下函数获取变量oldx和oldy中的x和y坐标

int oldx,oldy;    
oldx=wherex();
oldy=wherey();

在windows中工作。

如果您使用的是SDL1,我认为您应该在代码中添加以下内容:

int x, y;
SDL_GetMouseState(&x, &y);

现在,鼠标位置位于
x
y

只要按下鼠标按钮,它就会调整大小,然后打印按钮位置。可能是在裁剪窗口后裁剪鼠标位置


尝试仅在SDL_鼠标按钮上调整窗口大小。这样,当鼠标点击时,打印当前位置(SDLXMouthButnDon),然后在释放后调整大小。

使用VisualStudio 2010 C++编译时,没有描述的问题就可以正常工作,WindowsYou提到在快速移动鼠标时多次单击鼠标。我想知道您是否由于窗口大小的更改而丢失鼠标事件,并且鼠标单击瞬间超出了窗口区域,或者当其他鼠标事件放入时,某些鼠标事件正在从消息队列中删除。由于SDL和应用程序的不同层之间存在竞争条件,所以您描述的行为听起来非常具有情境性。另请参阅本文章。
int oldx,oldy;    
oldx=wherex();
oldy=wherey();
int x, y;
SDL_GetMouseState(&x, &y);