您的位置:首页 > 其它

D3D游戏关于窗口中如何精确确定鼠标位置的相关讨论

2012-08-03 07:55 351 查看
在GameDev中的相关贴子:

(1)http://www.gamedev.net/topic/623813-getting-mouse-position/

里面有几句很重要的话:

<1>How do you create your application window?

A common mistake is to choose some backbuffer resolution (for example 1024x768), create a backbuffer with this resolution and also create a window with this size - while forgetting, that if window is 1024x768 then its client area is smaller (because of the
title bar and borders) and DirectX rendering will be stretched.

<2>//一般我们取得坐标后,就可以横坐标加8/2,纵坐标加28/2即可获取真实的坐标,不过不同创建窗口的风格会导致不同的差异,所以请依据真实情况调整即可

it's 8 pixels for borders and 28 pixels for the title bar (on my Vista, this depends on your OS and your settings, you can change the title bar size somewhere).

(2)关于DInput取不了屏幕坐标的思考,及Windows Proc取坐标有问题的解决方案

http://www.gamedev.net/topic/423799-direct-input-mouse-position-wrong--fixed-/

<1>有一句话契合上面

Looks to me like you haven't used AdjustWindowRect() to get a 1:1 mapping of client area to backbuffer space. Your backbuffer may be 640x400 or something, but your entire window is also 640x400, meaning that the client area is around 632x380 or something.
That means that a point on your client area won't map to the same place on the backbuffer.

AdjustWindowRect() will give you the dimensions to pass to CreateWindow[Ex]() if you give it the size of client area you want.

小计:

在我们获取鼠标的位置时,假如没有处理好创建窗口的步骤,很有可能取的是错误的坐标,像在龙书中就没有指出这种情况,以至于在Pick一节中鼠标及射线不是很准确,甚至可以说简直就是偏差的,那么如何来实现获取准确的鼠标坐标的位置呢,首先建立窗口之前就应该调用一个函数AdjustWindowRect,这个函数可以调整窗口的大小,为什么要调大小,在上面的两个帖子中讲的很明白,因为窗口含有标题栏及左右上下边框,使得我们的窗口小于我们创建的后台缓存,这就会出现很大的问题,主要是鼠标往右下角走时,鼠标的位置会越来越不精确,正是由于前台和后台的大小的区别(前台比后台小),造成这么大的麻烦。而AdjustWindowRect这个函数可以在创建窗口前调整窗口大小,使现在的客户区和后台缓存一样大,所以我们的整个窗口变大了点。这样处理之后就可以正确获取坐标了,样例代码如下:

RECT rc;

SetRect( &rc, 0, 0, WIDTH, HEIGHT );

AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, false );//注意这里好像只能用WS_OVERLAPPEDWINDOW,我测试了几个其它的好象不行,下面的创建风格也要是WS_OVERLAPPEDWINDOW

// char szBuf[128];

// sprintf(szBuf,"(%d,%d),(%d,%d)",rc.left,rc.right,rc.top,rc.bottom);//这里查看调整后的窗口大小

// MessageBox(NULL,szBuf,"",MB_OK);

hwnd=::CreateWindow(WNDCLASSNAME,WNDCAPTION,WS_OVERLAPPEDWINDOW,0,0,( rc.right - rc.left ),rc.bottom - rc.top,0,0,hInstance,0);

当然,一定还有其他方案解决此类问题,因为这里对窗口风格有点限定(也有可能我不会搭配风格使得有问题),不过在Dx SDK中是基于此来解决此问题的,这个方案可以使在窗口和全屏下都可以正确获取坐标位置。还有一个就是在《DirectX+游戏开发终极指南》中GUI开发部分中,它的Demo在窗口模式下可以正常使用,但在全屏时却不行,那里面很可能是在初始化d3dpp时有问题,所以那个也不是最终的解决方案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐