DirectX 9应用内获取相对光标位置的技术咨询
获取DirectX 9应用内的相对光标位置
其实DirectX 9里确实没有像myDevice->GetCursorPosition()这么直接的函数,但咱们可以通过Windows API结合DirectX的视口信息,几步组合来实现你要的相对位置效果,逻辑并不复杂:
第一步:拿到相对于应用窗口客户区的光标位置
先通过GetCursorPos获取全局屏幕坐标,再用ScreenToClient把它转换成相对于你应用窗口客户区的坐标——这一步能把全局坐标转成以窗口左上角为原点的局部坐标。
示例代码:
POINT globalPos; GetCursorPos(&globalPos); // 这里的hWnd是你的DirectX应用窗口句柄,确保是渲染画面的那个窗口 ScreenToClient(hWnd, &globalPos); // 此时globalPos.x和globalPos.y就是相对于窗口客户区的坐标了
第二步:适配DirectX视口(如果有自定义视口需求)
如果你的应用设置了自定义视口(比如渲染区域不是整个客户区,或者有缩放、偏移),还需要把客户区坐标转换成视口内的相对位置。先获取当前视口参数再计算:
D3DVIEWPORT9 viewport; myDevice->GetViewport(&viewport); // 映射到视口范围的相对坐标 float viewportRelX = (globalPos.x - viewport.X) * (float)viewport.Width / viewport.Width; float viewportRelY = (globalPos.y - viewport.Y) * (float)viewport.Height / viewport.Height; // 如果是适配固定渲染分辨率的场景,比如渲染目标是1920x1080,视口是窗口缩放后的区域,可以这么算: // float targetX = (globalPos.x - viewport.X) * 1920.f / viewport.Width; // float targetY = (globalPos.y - viewport.Y) * 1080.f / viewport.Height;
针对你的矩形检测场景
比如你在客户区的(100,100)-(200,200)绘制了矩形,拿到第一步的globalPos后,直接判断globalPos.x处于100-200之间、globalPos.y处于100-200之间就行——这时候的坐标完全是相对于你应用窗口的,和全局光标位置无关。
额外注意点
- 如果是全屏模式,
ScreenToClient的结果和GetCursorPos几乎一致,但还是建议用这个方法保持逻辑统一,避免窗口/全屏切换时出问题。 - 一定要确保传入
ScreenToClient的窗口句柄是正确的,也就是DirectX渲染画面的那个窗口,不然坐标会完全错位。
内容的提问来源于stack exchange,提问作者myStackOverflows
相关产品推荐
相关产品推荐

