d3d带边框的窗口中检测鼠标位置误差的问题

在创建窗口的时候一直以来用的是WS_POPUP | WS_VISIBLE的dwStyle,突然想起来把它改成了带边框的窗口之后,就发现程序中的通过鼠标检测来做的按钮的实际检测的鼠标位置都错位了...

// 我是这样检测的鼠标位置

POINT cursorPosition;

GetCursorPos(
& cursorPosition);

ScreenToClient(_hwnd,
& cursorPosition);

 开始是以为是ScreenToClient函数没有返回想要的结果,但是经过一番鼠标位置的输出操作以后,我发现并不是这里的问题....完全不解它有边框到底为什么会造成这种问题,怀疑起是d3d和窗口的协作有问题,我谷歌了一下.

然后我在GD.NET中看到了这个. 看来有网友比我早好几年就遇到类似的问题了.

原因解释如下

HWND WINAPI CreateWindowEx(
__in DWORD dwExStyle,
__in_opt LPCTSTR lpClassName,
__in_opt LPCTSTR lpWindowName,
__in DWORD dwStyle,
__in
int x,
__in
int y,
__in
int nWidth,
__in
int nHeight,
__in_opt HWND hWndParent,
__in_opt HMENU hMenu,
__in_opt HINSTANCE hInstance,
__in_opt LPVOID lpParam
);

windows中的CreateWindowEx 函数,其第八个和第九个参数指的是整个窗口的长和宽,而不是窗口客户区的长和宽,如果这里传入的参数和创建的D3D9的backbuffer的长和宽是相同的话,为了适应窗口客户区,backbuffer势必会有一些缩小.

而我绘制二维图形的时候,使用的坐标系为BackBuffer的坐标,在检测鼠标的时候,用的是窗口客户区的坐标.所以,鼠标对应的位置在D3D中比实际中小也在所难免...

解决方法:在创建窗口时用AdjustWindowRectEx  函数.

#define WIDTH 640
#define HEIGHT 480
#define DWSTYLE (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)
RECT _windowRect
= { 0 , 0 , WIDTH, HEIGHT };
AdjustWindowRectEx(
& _windowRect, DWSTYLE, NULL, CW_USEDEFAULT);
hWnd
= CreateWindowEx(WS_EX_CONTROLPARENT,
szWindowClass,
szTitle,
DWSTYLE,
CW_USEDEFAULT,
0 ,
(_windowRect.right
- _windowRect.left),
(_windowRect.bottom
- _windowRect.top),
NULL,
NULL,
hInstance,
NULL);

就这么个问题,坑了我一晚上.........

转载于:https://www.cnblogs.com/snafloda/archive/2011/04/26/2028861.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值