You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:51:02