Два графика в одном окне

Тема в разделе "WASM.OpenGL", создана пользователем KingT, 22 фев 2011.

  1. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Здраствуйте,
    Необходимо в одном окне постоянно рисовать два графика.Причем прорисовка должна быть не зависимой.Тоесть интерфейс такой:две фунции draw1(data),draw2(data). Как разделить эти функции я не знаю.Для двух отдельных окон сначала wglMakeCurrent ставим dc одного окна затем другого.А вот в одном окне не понятно как получить из одного dc два независимых.
    Есть вариант с GetDcEx но там регион задается в абсолютных координатах, как тогда при ресайзе из пересчитать?
    С ViewPort тоже не выйдет наверно.Чтоб перерисовать один график надо перерисовывать все окно.
     
  2. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Не правильно (не полно) сформулирован вопрос. Естественно, надо перерисовывать все окно. И кто мешает в перерисовке вывести оба графика? Если они пересчитаны на один масштаб, выводите 1, потом второй - вначале все наобходимые операции с матрицами, потом чисто вывод точек.

    да, проблемы могут быть, если у графиков разные масштабы, а исходный код функций draw1-draw2 недоступен. Но об этом вы ничего не сказали :)

    Навскидку: выводите 1 график так, как надо. Копируете окно в битмап. Меняете масштабы, поворачиваете если надо (может там 3Д-графики?), естественно очищая viewport. Берете сохраненный битмап подложкой, и поверх него выводите 2-й график. И так при каждой перерисовке окна.
     
  3. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    >>Не правильно (не полно) сформулирован вопрос.
    Да я совсеми не так изложил проблему
    >>Естественно, надо перерисовывать все окно. И кто мешает в перерисовке вывести оба графика?

    Я разрабатываю dll которая собственно должна заниматся рисованием графиков.Эту dll грузит пользовательское приложение и dll предоставляет интерфейс с помощью которого пользователь может создать окно разделить его на несколько частей в каждом из котом
    потом рисовать графики функцией draw(id,data).Собственно id это идентификатор графика.А график может быть в отдельном окне или занимать часть окна если в том окне рисуем несколько графиков.
    У меня проблема с архитектурой программы.
    Есть обьект render у которого есть хранилище где лежат данные.По методу draw render нарисует в заданный DC данные(wglMakeCurrent).Тоесть у меня render привязан к DC.Еще render требует размеры клиентской области окна по которой выставляем порт просмотра.Я подумал а можно ли как-то привязаться только к DC?И получить размеры клиентской области только зная DC.Тоесть если я использую часть окна скажем я знаю ее процентное соотношение то получив ее DC, обьект render может рисовать в нее и получать размеры только из DC.Чтоб не заморачиваться с GetClientRect.Тоесть render абстрагирован от окон.
    Вобщем бред я тут понаписал.Я слабо представляю себе что такое dc на уровне операционной системы.
    ЗЫЖ А с перерисовкой я так придумал:функция draw только перезаписывает data для какогото обьекта render и выставляет event. dll создает внутренний поток который обрабатывает сообщания и события. По WM_PAINT событию вызывает метод draw обьекта renderer. Тоже самое по событию event.
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Не проще вызвать InvalidateRect и не устанавливать никаких ивентов?