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 = { };
std::printf("%d at (%d, %d)\n", GetCursorPos(&p), 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;
}
..., который дал результаты:
・ Left Mouse вниз по при htminbutton , левая мышь в верхней левой части экрана

Код: Выделить всё

start ht: 8
window (656 x 519) at (1042, 297)
1 at (0, 0)
end ht:   0
・ Left Mouse up of htminbutton

Код: Выделить всё

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
・ Left Mouse up ожидает htclose

Код: Выделить всё

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
< /code>
GetCursorPos()
успешно и дает правильный результат. Htminbutton в этом случае должен находиться от 530px до 576px от позиции происхождения Windows. Каждый тест, ожидающий htminbutton в этом диапазоне, но получающаяся полученная целевая цель от wm_nchittest является неточным.
Я использую getcursporspos () , как описано, чтобы получить экраны координат курсора, что и ожидает, что это будет и не то, что и есть.>

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

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

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

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

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

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