Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > синхронизация контролов диалогов


Автор: zkv 26.9.2007, 16:54
Нередко приходится дублировать некоторые элементы управления в программе.
К примеру у меня есть некоторое свойство объекта, управляется оно слайдером.
сейчас мне потребовалось продублировать этот слайдер в другом месте программы, те создать еще один слайдер, который будет управлять этим же свойством объекта.
Необходимо теперь эти два слайдера синхронизировать - изменение одного из них должно отражаться на другом.
Те мне нужно создать что-то типа ссылки в с++, но только гуишной  smile 

Стало интересно, может существуют стандартные методы (типа: m_ctrlSome.SynchronizeWith( m_ctrlAnother ) ) или приемы, для организации сей фишки?

Автор: Andrey44 27.9.2007, 08:42
При движении одного слайдера делаешь другому  two.SetPos(one.GetPos());  smile 
И всех делов.

Автор: zkv 27.9.2007, 09:57
Цитата(Andrey44 @  27.9.2007,  08:42 Найти цитируемый пост)
При движении одного слайдера делаешь другому  two.SetPos(one.GetPos()); 

это понятно, но это велосипед, хотел узнать, существует ли унифицированный подход...

Автор: Andrey44 27.9.2007, 12:05
А интересно, можно-ли одну переменную связать с двумя контролами? smile
Сейчас не могу попробовать. Но интересно! 

Автор: Coocky 28.9.2007, 13:36
Цитата(zkv @  27.9.2007,  09:57 Найти цитируемый пост)
это понятно, но это велосипед, хотел узнать, существует ли унифицированный подход...

Не понял,что ты хочешь толком,но кроме срздание промежуточного класса,в котором хранятся данные об изменении свойств обьекта,которых управляется слайдером,не вижу.
Пересечений не будет,если организуешь все через сообщения.

Автор: zkv 29.9.2007, 15:49
Цитата(Coocky @  28.9.2007,  13:36 Найти цитируемый пост)
Не понял,что ты хочешь толком

знаешь ссылку в с++?
тоже самое хочу, изменяю один объект - абсолютно также одновременно изменяется другой.
Вот но только для контролов. smile

Цитата(Coocky @  28.9.2007,  13:36 Найти цитируемый пост)
кроме срздание промежуточного класса,в котором хранятся данные об изменении свойств обьекта,которых управляется слайдером,не вижу.
Пересечений не будет,если организуешь все через сообщения.

 smile а тут уже я не понял

Вообщем то задачу конечно решил, но мне не нравится решение  smile 
Если придумаю что-нить красивое, отпишусь.

Автор: Любитель 29.9.2007, 23:55
Цитата(zkv @  29.9.2007,  15:49 Найти цитируемый пост)
знаешь ссылку в с++?тоже самое хочу, изменяю один объект - абсолютно также одновременно изменяется другой

Насколько также? Положение всё-таки, думаю, будет разным smile Если речь про значения (того же слайдера), то в WinAPI/MFC стандартных средств нету. Просто изменять значение другого слайдера при изменении первого и наоборот. И, конечно, не забыть проверку, что зачение второго слайдера уже возможно совпадает с первым. Чтоб не было вечной рекурсии smile

[offtop]
А вообще, концепция сигнал/слотов (при встраивании соответствующей поддержке со стороны ГУИ-либы или написании своих обёрток) в данном случае очен красива и удачна.
[/offtop]

Автор: Earnest 30.9.2007, 11:26
Если слайдеры находяться не в модальных диалогах, а на панелях, то сделай им одинаковые ид-ры и напиши метод OnUpdateCmdUI где-нибудь в таком классе, который точно получит управление - документе, виде, фрейме, ... где логичнее в общем.
Далее, эти слайдеры должны управлять каким-то глобально (или через документ) доступным свойством. И неважно, кто его установит - один из слайдеров или кто-то третий. 
Можно даже написать для этого конкретного слайдера свой класс и повесить OnUpdateCmdUI ему на REFLECT. И тогда хоть 10 слайдеров заведи - все будут работать как один.

Это примерно тот же механизм, который применяется для обновления кнопок, пунктов меню и прочего...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)