![]() |
|
|
![]()
|
|
| Dreamer_0x01 |
|
||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Столкнулся с такой проблемой.
Нужно обрабатывать изменение пользователем размеров диалога. Диалог содержит в себе контролы, которые тоже надо репозиционировать. Для этого я обрабатываю событие WM_SIZING. Примечание: пользователь хочет видеть хотя бы приблизительные размеры контролов уже на этапе ресайзинга, а не после его завершения, поэтому обработка события WM_SIZE меня не устраивает Проблем в том, что координаты прямоугольника, передающиеся обработчику этого сообщения, соответствуют координатам прямоугольника ВСЕГО окна. (как например, если бы мы пользовались функцией GetWindowRect()). Но часть площади окна занято на заголовок окна(системное меню), а также на рисование объемной рамочки вокруг окна. Оставшееся "рабочее" пространство окна можно узнать с помощью функции GetClientRec(). Но проблема в том, что если ее вызвать непосредственно в обработчике данного события, то она вернет координаты прямоугольника, соответствующего "старым" границам окна, существовавшего до момента начала изменения его размеров. Мне пришлось вычислять место, занимаемое системным меню и объемной рамочкой, и в обработчике события его учитывать. Все работает. Но у менятакое чувство, что можно было все сделать проще. МОЖНО ИЛИ НЕТ? вот код, аналогичный моему:
Это сообщение отредактировал(а) Dreamer_0x01 - 1.11.2005, 21:03 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||
|
|||||
| nikf |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 6.6.2005 Где: город-герой Жирно вск Репутация: 1 Всего: 1 |
WM_SIZING lParam - pointer to RECT
|
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
ну да, но поинтер он именно на ПОЛНЫЙ RECT, который занимает ВСЕ ОКНО.
А мне нужен КЛИЕНТСИЙ! -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Боюсь, нет. Вот наоборот - можно, т.е. по заданному клиенту вычислить размер всего окна (AdjustWindowRectEx), а вот по всему окну вычислить клиента - не знаю такой функции. Однако я бы тебе предложила другой подход: создай мэп(контрол->позиция относительно WindowRect), а потом при изменени размеров окна все рисуй согласно полученному ректу, и все. -------------------- ... |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Вставлю свою ламерскую морду. Может подойдет WM_WINDOWPOSCHANGING ? Это сообщение отредактировал(а) Coocky - 2.11.2005, 18:00 -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Нет, WM_WINDOWPOSCHANGING не подойдет. Во-первых, оно содержит тот же RECT всего окна, а во-вторых - приходит только один раз, непосредственно перед установкой размеров окна, а не как нужно Терминатору - во время ресайзинга.
Появилась дикая мысль - послать окну запрос WM_NCCALCSIZE с параметрами wParam=false, lParam=&(WindowRect). Судя по описанию, окно должно пересчитать этот рект в клиенский:
Но как это будет себя вести во время обработки WM_SIZING - не могу сказать. -------------------- ... |
|||
|
||||
| Coocky |
|
||||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Да я уже понял..(попробывал
Незнаю, в жизни не использовал никогда.. -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
||||
|
|||||
| Dreamer_0x01 |
|
||||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
В принципе, суть метода та же. мне при размещении контролов придется учитывать смещение ClientRect относительно WindowRect, чтобы контролы не вылезли за пределы клиентской области. И тоскать за собой уже не смещение, а этот мэп. Все равно что называется "в два действия", как и у меня.
Эт хто? Я Dreamer!
А вот фигово ведет. Структуру заполняет левыми значениями, правильные они получаются только тогда, когда окно перересуется. (то есть отработает WM_SIZE, когда пользователь отпустит мышку). Во время WM_SIZING оно по-видимому определять эти прямоугольники не умеет. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||||
|
|||||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Coocky
Earnest Где же вы??? -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Dreamer_0x01
Я здесь, но на данный момент помочь ничем не могу.. Смотри, я сам вопросы задаю, дел по горло, некогда даже потренироваться на твоем коде.. -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Ну, я и не обещала, что будет хорошо. Но я не сомневалась, что ты не применешь поэкспериментировать (и всем расскажешь). За что спасибо.
Да, количество действий не экономится, верно. НО! Подход более универсален, т.к. не зависит от внешнего окна. Т.е. можно написать базовый код, и использовать как фичу в разных окнах. Нужно только задать, какие контролы позиционируются вместе с окном. Можно пойти дальше и задать как именно позиционируется каждый контрол (какое смещение остается постоянным - от правой или левой рамки, сверху или снизу) ... И какая тебе разница, что там будет храниться в базовом классе? Хоть 10 мэпов. Главное, чтобы основную логику конкретного окна не застило. -------------------- ... |
||||
|
|||||
| Dreamer_0x01 |
|
||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Это вот тебе спасибо за участие и дельные мысли.
а как же увеличение размера кода? Ведь моя программа будет вывешена на сайте нашего предприятия, чтобы клиенты могли скачивать ее для настройки наших приборов. И хоть я понимаю, что использование MFC в обмен на простоту использования дает увеличение кода и снижение скорости работы исполняемого кода, но все-таки злоупотреблять такими фактами не стоит. Не каждому понравится выкачивать многометровые файлы с сайта. Опять же, к использованию ресурсов мне тоже следует относиться осторожно, так как у многих заказчиков все еще стоят Win95 на первых пентиумах.... -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||
|
|||||
| AlexPro |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 3 Всего: 4 |
Видимо, я чего-то не улавливаю, но мне непонятно, к чему такие сложности. Чем не угодил WM_SIZE? Вся обработка ведется в OnSize. Получаешь размеры клиентской области функцией GetClientRect() для диалогового окна и двигаешь или меняешь размеры своих контролов как тебе понравится. Все происходит в режиме реального времени. Или этот путь черезчур прост?
|
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
не-а. в том-то и дело, что WM_SIZE происходит только когда, когда изменение размеров окна уже закончилось, то есть пользователь уже отпустил кнопку мышки. Мне же нужно, чтобы во время таскания уголка окна перерисовывалось и его содержимое, а не только внешняя рамка. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| The Thing |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 286 Регистрация: 6.9.2004 Репутация: 1 Всего: 3 |
Dreamer_0x01
Юзай сообщения ON_WM_GETMINMAXINFO() Сюда приходит сообщение раньше всего...
Добавлено @ 00:35 забыл...
Добавлено @ 00:42 Да, забыл объяснить.. сюда как раз и приходят сообщения которые пытается поймать Dreamer_0x01... т.е. сообщения приходят при изменение размеры.. правдо может возникнуть некоторая проблема с отрисовкой контролов.. но ето все решаемо.. и вопрос №2. -------------------- Правильность работы программы зависит от двух велечин. В нужном месте должны стоять нолик и еденичка. |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |