UI控件都是图片渲染而成的。。

我采用ID3DXSperite的Draw()方法来渲染2D图片,在进行控件的鼠标检测时遇到问题。。。。有些区域检测不到,后来查了一下觉着是创建窗口的问题。

比如: 

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600

#define DWSTYLE (WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)

若CreateWindowEx是之间把上边的宽个高传进去,那么创建的窗口的大小确实是800*600,但是这是整个窗口的尺寸,实际上我们程序中用到的是客户区,就是整个窗口刨去菜单等边框的大小。所以客户区的大小要小于800*600。

用下面的代码实现:

 1     //
2 RECT windowRect = { 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT };
3 AdjustWindowRectEx( &windowRect, DWSTYLE, NULL, CW_USEDEFAULT);
4
5 HWND hWnd = CreateWindowEx(WS_EX_CONTROLPARENT,
6 TEXT("D3D"), TEXT("D3D"),
7 DWSTYLE,
8 CW_USEDEFAULT,
9 0,
10 (windowRect.right - windowRect.left),
11 (windowRect.bottom - windowRect.top),
12 GetDesktopWindow(),
13 NULL,
14 wc.hInstance,
15 NULL);
16 //

此时我认为应该解决了这个问题,但是还是不行。。。

如:我渲染的图片的大小为200*200,那么图片的右下角还是检测不到。。。只有左上部分可以检测的到。后来点击图片的右下角得到鼠标点的实际位置为(255, 255),此时才明白原来是图片尺寸的原因。。。 D3DXSprite渲染的2D图片要求是2的幂次方,像200这样的,就自动转换成256*256的大小了。。。也就是给你放大了。。。所以检测不到。 ps:检测代码如下:

 1     D3DXVECTOR2 absolutePos;
2 absolutePos.x = 0;
3 absolutePos.y = 0;
4
5 GetAbsolutePosition(&absolutePos);
6
7 if ((x >= absolutePos.x) && (x <= absolutePos.x + GetWidth()) &&
8 (y >= absolutePos.y) && (y <= absolutePos.y + GetHeight()) )
9 {
10 return true;
11 }
12 else
13 {
14 return false;
15 }

另外:

鼠标点击时的屏幕坐标与窗口坐标之间的关系:

1. 将屏幕坐标转换到窗口坐标

            POINT pt1;
GetCursorPos(&pt1);
ScreenToClient(m_hWnd, &pt1);

2. 

bool PostMessage(UINT msg, WPARAM wParam, LPARAM lParam, void* pData)
{
switch (msg)
{
case WM_LBUTTONDOWN:
{

POINT pt;
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);

。。。

}

pt中得到的就是窗口坐标不是屏幕坐标。