Wm_nchittest возвращает неточные тесты на хитC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Wm_nchittest возвращает неточные тесты на хит

Сообщение Anonymous »

Значение теста HIT, полученное WM_NCHITTEST , по -видимому, немного неверно неверно, несмотря на передачу, казалось бы, правильные значения. Нужно ли отрегулировать LPARAM перед отправкой на процедуру по умолчанию?int main(int, char**)
{
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpszClassName = TEXT("MRE");
wc.lpfnWndProc = [](HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -> LRESULT {
static LRESULT ht = HTNOWHERE;
switch (msg) {
case WM_DESTROY: PostQuitMessage(0); return (LRESULT)0;
case WM_NCLBUTTONDOWN:
if ((wParam == HTCLOSE) || (wParam == HTMINBUTTON)) {
std::printf("\nstart ht: %d\n", wParam);
SetCapture(hwnd);
ht = wParam;
return (LRESULT)0;
}
break;
case WM_NCLBUTTONUP: case WM_LBUTTONUP:
if (ht == HTNOWHERE)
break;
ReleaseCapture();
ht = HTNOWHERE;

RECT rect = { };
GetWindowRect(hwnd, &rect);
std::printf("window (%d x %d) at (%d, %d)\n",
rect.right - rect.left, rect.bottom - rect.top,
rect.left, rect.top
);

POINT p = { };
bool bSuccess = GetCursorPos(&p);
std::printf("%d at (%d, %d)\n", bSuccess, p.x, p.y);
std::printf("end ht: %d\n", SendMessage(hwnd, WM_NCHITTEST, 0, MAKELPARAM(p.x, p.y)));
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
};
if (!RegisterClassEx(&wc)) return 1;

const LONG styles = (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX);
RECT rectDimensions = { 0u, 0u, 640u, 480u };
AdjustWindowRect(&rectDimensions, styles, false);
HWND hwnd = CreateWindow(
TEXT("MRE"), TEXT("mre"), styles, 0, 0,
(rectDimensions.right - rectDimensions.left),
(rectDimensions.bottom - rectDimensions.top),
nullptr, nullptr, GetModuleHandle(NULL), nullptr
);

MSG msg = { 0 };
ShowWindow(hwnd, SW_NORMAL);
while (GetMessage(&msg, nullptr, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

...which дал эти результаты, где значение, помеченное намекаемой start ht , является правильной целью хит, полученной с помощью процедуры по умолчанию, а end ht -это целевой лист HIT, полученный с помощью Wm_nchittest :
・ Left at htminbutton :
・ Left at at htminbutton :
экрана < /p>
start ht: 8
window (656 x 519) at (1042, 297)
1 at (0, 0)
end ht: 0

・ Left Mouse up ожидает, что htminbutton (8)
start ht: 8
window (656 x 519) at (1042, 297)
1 at (1556, 315)
end ht: 2

start ht: 8
window (656 x 519) at (1042, 297)
1 at (1570, 308)
end ht: 2

start ht: 8
window (656 x 519) at (1042, 297)
1 at (1594, 312)
end ht: 8

※ (2) - это htcaption .
・ Left Mouse в ожидании htclose (20)
start ht: 20
window (656 x 519) at (1042, 297)
1 at (1646, 307)
end ht: 9

start ht: 20
window (656 x 519) at (1042, 297)
1 at (1664, 311)
end ht: 20

start ht: 20
window (656 x 519) at (1042, 297)
1 at (1683, 311)
end ht: 20

※ (9) - это htmaxbutton .
GetCursorPos() успешно и дает правильный результат. Htminbutton в этом случае должен находиться от 530px до 576px от позиции происхождения Windows. Каждый тест, ожидающий htminbutton в этом диапазоне, но получающаяся полученная целевая цель от wm_nchittest является неточным.
Я использую getcursporspos () , как описано, чтобы получить экран координат курсора, что, по крайней мере, это, по крайней мере, это, по крайней мере, это, по крайней мере, это, по крайней мере, это, по крайней мере, это, по крайней мере, это, по крайней мере, это, по крайней мере, это, по крайней мере, это, по крайней мере, это, по крайней мере. Ожидает). < /p>
Некоторые предложения из комментариев (показанные ниже) не влияют на вывод программы: < /p>
・ Создание программы DPI осведомлена (по приложению не является вариантом) с < /p>
< /p>


Подробнее здесь: https://stackoverflow.com/questions/797 ... -hit-tests
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»