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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Графика, CDC - как смешать "слои"?  (Прочитано 11743 раз)
0 Пользователей и 1 Гость смотрят эту тему.
T_Volkova_81
Гость
« : 07-02-2008 03:35 » 

Я делаю класс для графиков, хотелось бы осуществить рисование в несколько слоев, приерно как в photoshop. Например, нижний слой - подложка, на одном слое рисую кривые, относящиеся к левой оси, на другом - к правой.  На всех слоях, кроме нижнего, все точки, которые я добавляю - непрозрачные, остальное - прозрачное. Если меняется минимум/максимум по одной из осей, перересовывается только соответствующий слой. В OnPaint слои смешиваются. Как это реализовать? Есть мысль сначала заливать слой черным, при смешивании - BitBlt c SRCPAINT, но тогда при пересечении кривых будет непонятный цвет.
Дело в том, в на кривой может быть 10-15 тыс. точек, на графике 3-4 кривые, таким способом хотелось бы получить выигрыш в быстродействии. Стоит ли затевать?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 07-02-2008 04:54 » 

T_Volkova_81, ИМХО: непосредственно к CDC задача отношения не имеет - информация о содержимом слоёв должна храниться в разных экземплярах какого то твоего класса, специально для этого предназначенного. А вот во время отрисовки надо смотреть текущие настройки и свойства слоёв и в нужной очерёдности, при помощи методов CDC и собственных алгоритмов выводить слои на контекст. То есть "смешивиние" лучше произвести в озу, а потом всё разом вывалить на контекст
Записан

zubr
Гость
« Ответ #2 : 07-02-2008 08:24 » 

А зачем вообще заморачиваться с перемешиванием слоев, прозрачностью. Имхо, проще для каждого слоя создать битмап (CreateBitmap, CreateCompatibleBitmap) - каждый следующий слой является копией (BitBlt) предыдущего + что то добавленное. При отключении-включении слоя, соответственно в контекст окна копируется соответствующий слой или предыдущий.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 07-02-2008 09:18 » 

zubr, а влияние слоёв друг на друга (при отображении на экран) тогда как учесть ?
Записан

zubr
Гость
« Ответ #4 : 07-02-2008 10:44 » 

Что такое слой - это какая то картинка. Сменил слой - сменил картинку. Заморочки с прозрачностью и смешиванием имеют смысл для мультимедиа, когда необходима быстрая смена изображения (чтобы все не перерисовывать). Для задачи топикстартера вопрос быстрой перерисовки не актуален.
Записан
Джон
просто
Администратор

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

« Ответ #5 : 07-02-2008 11:07 » 

Я такое реализовывал в одном проекте. Лёшка правильно говорит. Необходима структура данных поддерживающих слои. Ведь с объектами на слоях надо работать. z-order определяет очерёдность показа.
Отрисовываются все в один DC с двойной буферизацией. И всё.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
T_Volkova_81
Гость
« Ответ #6 : 07-02-2008 11:13 » 

Допустим, для каждого слоя - свой класс, в нем - CBitmap. В основном классе окна - массив из них, индекс в массиве определяет номер слоя снизу. Но как их тогда перемешать, как учесть прозрачные точки? Джон, можете пояснить более подробно?
« Последнее редактирование: 07-02-2008 11:18 от T_Volkova_81 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 07-02-2008 11:21 » 

а зачем именно CBitmap , массив примитивов нужен, в общем случае. С прозрачностью - это как раз при выводе на CDC при наложении очередного слоя учитывать, будет ли объект прозрачен, и если да - то "смешать" его пикселы с уже имеющимися на контексте. Кстати, надо бы какой то цвет принять за глобально-прозрачный - для обозначения общего фона , который не участвует в смешивании
Записан

Джон
просто
Администратор

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

« Ответ #8 : 07-02-2008 13:12 » 

T_Volkova_81, сейчас поясню.

1. По определению - всё прозрачно, те чтобы было непрозрачно - надо туда это нарисовать.

2. Я накидаю быстро идею пвседокодом ок? если будет непонятно в деталях - разберёмся.

итак - я даю это без двойной буферизации (она нужна "чтоб не моргало") работать будет и так, а добавить её можно будет и потом

1 Объект типа СписокСлоёв - с набором необходимых ф-ций (как у всех списков - эт понятно)  плюс ещё одна ф-я

СписокСлоёв::Draw(CDC *pDC)
{
цикл для каждого элемента
       Слой *pLayer = GetNext();
конец цикла
}

2. Объект типа Слой (ну этот может содержать ещё и список объектов, но это не важно, будем считать что он рисует, в противном случае он так же в цикле вызывает ф-ю Draw(CDC *pDC) для объектов из своего списка)

Слой::Draw(CDC *pDC)
{
    // Непосредственная отрисовка данных этого слоя
    pDC->FillSolidRect ....

}


3. Теперь использование - например в диалоге

class CMyDlg : public CDialog
{
   СписокСлоёв m_LLst;
   


};



void CMyDlg::OnPaint()
{

       .....

   
   CPaintDC dc(this);

   CDC *pDC = &dc;

        pDC->FillSolidRect() - рисуем фон

        всё остальное рисуем поверх фона
        m_LLst.Draw(pDC);

        порядок объектов в списке соответствует обратному порядку слоёв - первый объект в списке=нижний слой и тд


И никаких бит-мапов и -блитов Ага
« Последнее редактирование: 07-02-2008 13:14 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines