在创建窗口的时候一直以来用的是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);

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

posted on 2011-04-26 08:22  Snafloda  阅读(655)  评论(1编辑  收藏  举报