![]() |
|
![]() ![]() ![]() |
|
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. -------------------- Правильность работы программы зависит от двух велечин. В нужном месте должны стоять нолик и еденичка. |
||||
|
|||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |