Координаты, которые вы получаете от WM_LBUTTONDOWN
, являются клиентскими координатами и являются правильными.Настоящая проблема здесь связана с разницей между областью и клиентской областью .
Область окна содержит все окно, включая строку заголовка и границы.RECT
, которое вы получите от GetWindowRect
, достаточно велико, чтобы охватить каждый пиксель вашего окна, так что наложение черного поля такого размера на экран приведет к тому, что все ваше окно, строка заголовка и включенные границы исчезнут.
Однако клиентская область - это область внутри , которую Windows создает для вас.RECT
, который вы получите от GetClientRect
, достаточно велик, чтобы снова наложить черный прямоугольник такого размера на экран, чтобы он охватил всю 3D-сцену, но оставил бы заголовок и границы видимыми.
Теория и определения здесь все хорошо и хорошо, но теперь нам нужно решить проблему.Оказывается, код, который вы используете в своей оконной процедуре, за исключением проблем с соблюдением API, отмеченных Реми Лебо (используйте GET_X_LPARAM()
/ GET_Y_LPARAM()
вместо сдвига), прекрасно работает и не требует изменений.Фактическая точка, в которой вы вводите ошибку, - это код создания окна.
Параметры nWidth
и nHeight
для CreateWindow
указывают ширину и высоту окна , а неклиентская зона.Таким образом, ваша клиентская зона будет меньше.Однако вы хотите, чтобы область клиента имела такую ширину.
Оказывается, это настолько распространенный случай, что Windows 2000 добавила функцию для генерации правильной ширины и высоты окна для данной области клиента: AdjustWindowRect
,Чтобы использовать его, измените ваш CreateWindow
вызов на следующее:
RECT windowRect;
windowRect.top = 0;
windowRect.left = 0;
windowRect.right = DisplayManager::GetInstance()->GetDisplayWidth();
windowRect.bottom = DisplayManager::GetInstance()->GetDisplayHeight();
AdjustWindowRect(&windowRect, WS_OVERLAPPEDWINDOW, FALSE);
mWindow = CreateWindow(L"wndClass",
L"DirectX 11 Engine",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
windowRect.right,
windowRect.bottom,
0,
0,
hInstance,
0);
Это сместит ваши координаты, чтобы гарантировать, что клиентская область точно соответствует размеру, который, как думает DisplayManager, должен быть.
РЕДАКТИРОВАНИЕ
Если у вас расширенный стиль окна, AdjustWindowRectEx
позволяет вам указать эти расширенные стили окна в качестве дополнительного четвертого аргумента функции.