UI控件都是圖片渲染而成的。。
我采用ID3DXSperite的Draw()方法來渲染2D圖片,在進行控件的鼠標(biāo)檢測時遇到問題。。。。有些區(qū)域檢測不到,后來查了一下覺著是創(chuàng)建窗口的問題。
比如:
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define DWSTYLE (WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)
若CreateWindowEx是之間把上邊的寬個高傳進去,那么創(chuàng)建的窗口的大小確實是800*600,但是這是整個窗口的尺寸,實際上我們程序中用到的是客戶區(qū),就是整個窗口刨去菜單等邊框的大小。所以客戶區(qū)的大小要小于800*600。
用下面的代碼實現(xiàn):
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 //
此時我認為應(yīng)該解決了這個問題,但是還是不行。。。
如:我渲染的圖片的大小為200*200,那么圖片的右下角還是檢測不到。。。只有左上部分可以檢測的到。后來點擊圖片的右下角得到鼠標(biāo)點的實際位置為(255, 255),此時才明白原來是圖片尺寸的原因。。。 D3DXSprite渲染的2D圖片要求是2的冪次方,像200這樣的,就自動轉(zhuǎn)換成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 }
。
另外:
鼠標(biāo)點擊時的屏幕坐標(biāo)與窗口坐標(biāo)之間的關(guān)系:
1. 將屏幕坐標(biāo)轉(zhuǎn)換到窗口坐標(biāo)
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中得到的就是窗口坐標(biāo)不是屏幕坐標(biāo)。