Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: изображения в ComboBox  (Прочитано 17172 раз)
0 Пользователей и 1 Гость смотрят эту тему.
гайка
Гость
« : 31-05-2012 15:50 » 

мне нужно создать комбобокс, содержащий в себе список из изображений и надписей. это выглядит примерно так:
Код: (C#)
    class AnimatedComboBox: ComboBox
    {
        private ImageList _imageList;
        public ImageList ImageList
        {
            get { return _imageList; }
            set { _imageList = value; }
        }

        public AnimatedComboBox()
        {
            DrawMode = DrawMode.OwnerDrawFixed;
        }

        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            AnimatedComboBoxItem item_;
            Size imageSize_ = _imageList.ImageSize;
            Rectangle bounds_ = e.Bounds;
            SolidBrush brush_= new SolidBrush(e.ForeColor);

            e.DrawBackground();
            e.DrawFocusRectangle();

            try
            {
                item_ = (AnimatedComboBoxItem)Items[e.Index];
                if (item_.ImageIndex == -1)
                    e.Graphics.DrawString(item_.Text, e.Font, brush_, bounds_.Left, bounds_.Top);
                else
                {
                    _imageList.Draw(e.Graphics, bounds_.Left, bounds_.Top, item_.ImageIndex);
                    e.Graphics.DrawString(item_.Text, e.Font, brush_, bounds_.Left + imageSize_.Width, bounds_.Top);
                }
            }
            catch
            {
                if (e.Index == -1)
                    e.Graphics.DrawString(Text, e.Font, brush_, bounds_.Left, bounds_.Top);
                else
                    e.Graphics.DrawString(Items[e.Index].ToString(), e.Font, brush_, bounds_.Left, bounds_.Top);

            }
            base.OnDrawItem(e);
        }
Код: (C#)
class AnimatedComboBoxItem
    {
        private string _text;
        public string Text
        {
            get { return _text; }
            set { _text = value; }
        }

        private int _imageIndex;
        public int ImageIndex
        {
            get { return _imageIndex; }
            set { _imageIndex = value; }
        }

        public AnimatedComboBoxItem() : this("") { }
        public AnimatedComboBoxItem(string text) : this(text, -1) { }
        public AnimatedComboBoxItem(string text, int imageIndex)
        {
            _text = text;
            _imageIndex = imageIndex;
        }

        public override string ToString()
        {
            return _text;
        }
    }

Впоследствии предполагается анимировать изображения, отсюда названия классов.
Так вот, в итоге получается то, что заказывали: обычный комбобокс, имеющий в выпадающем списке изображения и подпись. теперь хочется, чтоб выбранный элемент тоже отображался с картинкой.
вопрос: кого мне переопределить, чтоб контролировать отрисовку выбранного элемента?

Добавлено через 29 минут и 27 секунд:
Ну в общем-то я уже поняла...
ахах всем спасибо Улыбаюсь

хотя нет, я все-таки хочу послушать ваше мнение.

Добавлено через 16 часов, 26 минут и 52 секунды:
о, оказывается нужно просто не вызывать базовую отрисовку элемента   base.OnDrawItem(e);  Улыбаюсь  Класс!
« Последнее редактирование: 01-06-2012 08:46 от гайка » Записан
гайка
Гость
« Ответ #1 : 07-06-2012 12:20 » 

товарищи, мне нужен доброволец, который поможет мне с многопоточной анимацией!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 07-06-2012 13:33 » 

Что такое "многопоточная анимация"?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
гайка
Гость
« Ответ #3 : 07-06-2012 13:37 » 

много анимированных изображений, обрабатывающихся одновременно, в моем случае еще и с разной скоростью.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 07-06-2012 14:58 » 

Гайка, видишь ли... всякий специалист сам себя ценит за то, что умеет справляться с некими проблемами или, на худой конец, умеет показать класс всяким зелёным юнцам.

У тебя же выходит на редкость скучная формулировка проблем. "Анимация в комбо-бокс"... Ну вот скажи, кому это интересно? Чей извращённый разум задумал засунуть анимацию в комбо-бокс?

Чувствуешь, что проблемы тут нет? Захватывающей. Перспективной. Чтобы ноу-хау в области GUI. Чтобы была польза народному хозяйству. Чтобы решение этой задачи сделало этот мир чуточку лучше и краше.

P.S. Правда, работа с мотивацией - это другая профессия, это уже уровень менеджера или на крайний случай ведущего программиста со стадом бандерлогов в подчинении.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
гайка
Гость
« Ответ #5 : 07-06-2012 15:08 » 

"Анимация в комбо-бокс"... Ну вот скажи, кому это интересно? Чей извращённый разум задумал засунуть анимацию в комбо-бокс?

извращенный разум моего начальства.

ладно, справлюсь сама. отныне и во-веки веков буду вас грузить только супер интересными проблемами, связанными со спасением человечества, ведь именно для этого создан этот форум, не так ли?
Думаю, эту тему можно со спокойной душой удалять.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 07-06-2012 15:55 » 

Гайка, ты поняла превратно и напрасно обиделась.

Факт тот, что я "анимацию в комбо-боксе" себе даже не представляю. Как это должно выглядеть, как этим пользоваться, где это применяется.

А ты упорно пишешь тут куски кода, видимо, не работающие должным образом, из которых прилежные следопыты этого форума должны как-то понять, чего же тебе нужно сделать. Судя по молчанию, никто из присутствующих анимацию в комбо-боксе не делал. Следовательно, готового решения ты не дождёшься. Если же хочешь, чтобы тебе помогли, то создай условия: твой код даже никуда не вставить, чтобы попробовать поиграться с ним - непонятный, выдранный из контекста задачи кусок с owner draw стандартного контрола.

Ты где-нибудь такие ТЗ видела? Помнится, про такое лишь x77 рассказывал, когда в былинные времена малиновых пиджаков ТЗ выглядело как: "Слыш, ты, мне тут бабло посчитать надо." В другие исторические эпохи люди стараются объяснять.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
гайка
Гость
« Ответ #7 : 07-06-2012 16:30 » 

Dimka, мне не нужно готовое решение, ты же сам прекрасно это знаешь. у меня просто небольшая проблема с многопоточностью, которую скорее всего можно решить даже и без кода. а куски кода эти вполне можно вставить в проект и "поиграться" с ними (правда эти куски уже устаревшие, а новые я не вывешиваю потому что пока не вижу смысла в этом - никто не высказывает интереса). самый первый пост уже мало общего имеет с моей нынешней проблемой, по той проблеме я поговорила сама с собой и нашла решение.

я никого не заставляю мне помогать, в том числе и тебя. если нет интереса - можно просто закрыть тему и забыть. Если каждый раз на неинтересную тебе тему писать, что она тебе не интересна, то 50% постов будет именно такими.

если нужна вся задача в целом, то могу ее объяснить, правда толку от этого не очень много: в комбобоксе должен быть список разных режимов индикации светодиоида (красная или зеленая лампочка, моргающая с разной скоростью), то есть обычный комбобокс, только помимо текста каждый элемент списка имеет мигающую картинку.

если бы я могла решить эту проблему без посторонней помощи, я бы так и сделала, но я, к сожалению, еще не специалист, а скорее любитель, поэтому если у меня что-то не получается, я прошу помощи у тех, кого считаю умнее и опытнее, чем я. К слову сказать, просить о помощи - не такая уж приятная вещь, как кажется: при этом приходится наступить на свою гордость и поставить под сомнение свой якобы профессионализм. если мне просто не ответят, я не обижусь - никто никого не принуждает.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 07-06-2012 16:59 » 

Потоки тут будто бы ни при чём. Не знаю, что дают те классы анимации из WPF 4.0. Обычно анимация представляет собой коллекцию картинок, сменяющих друг друга через некоторые интервалы времени. И обеспечить такое поведение можно обычным таймером.

Главная интрига в логике мигания светодиодов. И по этому поводу на форуме было ломание копий. Были голоса за многозадачность; я пропагандирую вот такой автомат: https://forum.shelek.ru/index.php/topic,27995.msg272752.html#msg272752
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 07-06-2012 17:04 » 

А зачем тут многопоточность? Разве нельзя используя стандартные контролы проиграть в заданном прямоугольнике анимацию какого-либо стандартного формата? Что там нынче за место ani используется? avi? Тогда тебе надо будет поймать только моменты, когда надо переместить прямоугольник, показать или скрыть.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #10 : 07-06-2012 19:21 » 

Тут даже таймеров не надо. Эту задачу можно реализовать через анимированные изображения.
Используя GDI+ создаем файл анимации и добавляем туда фреймы, устанавливаем для него таймауты, проигрываем его.
Смотрим в сторону класса Image, методы SaveAdd, SelectActiveFrame.
Наверно есть аналогичные нетовские классы-оболочки.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 07-06-2012 20:17 » 

zubr, у неё, кажется, везде WPF. А WPF не использует GDI+, он использует DirectX. Однако любой аниматор всё равно работает схожим образом. Либо внутри анимационного объекта спрятан медиа-поток, либо слайды с таймером.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
гайка
Гость
« Ответ #12 : 08-06-2012 09:00 » 

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

Еще нужно учесть, что может добавиться какой-нибудь новый режим индикации, например такой: три раза моргнуть, потом 1 секунда задержки, снова 3 раза моргнуть. или что-нибудь другое. да хоть бы даже моргание мелодии "happy birthsday to you", мало ли что начальству в голову взбредет. что будет тут эффективнее, готовая анимация или просто несколько картинок?

я пыталась сделать так: вместо стандартной прорисовки элемента комбобокс я в методе OnDrawItem создавала новый поток, выполняющий ф-цию Animate, которя принемает объект Graphics, location (где нужно рисовать) и сам объект рисования. но т.к. первый, основной поток заканчивает выполнение OnDrawItem буквально через несколько шагов, а второй поток работает еще долго, то переданный объект Graphics умирает и вылетает ошибка в ф-ции Animate, которая всё еще пытается использовать этот мертвый объект.

я хочу доработать этот вариант, но если по каким-то причинам будет лучше использовать готовую анимацию, то я, конечно, готова передумать. только я пока таких причин не вижу.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 08-06-2012 10:32 » new

Гайка, отрисовкой экрана занимается само приложение, ловящее разными своими контролами событие WM_PAINT. Исключение составляют только два упомянутых случая: либо по таймеру делать Update окна/контрола (принудительно засылая WM_PAINT), либо там воспроизводится видео-поток.

Отрисовка в отдельном потоке - это, скажем так, нечто странное. Обычно в отдельном потоке делают тяжёлую логику, либо рисуют в буфер, который затем выводится на экран обычным образом: по WM_PAINT.

И создавать поток для каждой строчки в комбо-боксе - это, скажем, слишком жирно будет. Хотя бы использовать очередь заданий для системного пула потоков.

По поводу новых режимов мигания: каждая мигалка оформляется собственным автоматом, интервал таймера - НОД для всех интервалов всех мигалок. Внутри автоматов счётчики тактов таймера.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines