Значение теста 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
Wm_nchittest возвращает неточные тесты на хит ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1755665131
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>
Подробнее здесь: [url]https://stackoverflow.com/questions/79736140/wm-nchittest-returns-inaccurate-hit-tests[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия