Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

работа с графикой

Аноним
я создал два контекста устройства CreateCompatibleDC(). первый заполнилфоном который не меняется. во втором я буду рисовать график и смещать влево по таймеру.
можно ли сделать во втором фон прозрачным? чтобы в последствии второй контекст наложить на первый? должен получится движущийся график на недвижимом фоне! как это сделать покороче? при сообшении WM_PAINT готовый график с фоном выводится!
можно ли примерчик?
409
16 февраля 2002 года
Ramzes
163 / / 20.09.2000
насколько я знаю в GDI прозрачность не поддерживается. А почему бы тебе не рисовать график на первом фоне - это будет быстрее.
Аноним
а как тогда смещать график не смещая фон?

как вообще смещать картинку влево и заполнять пустое пространство справа фоном?
есть примеры но ещё не смотрел! если несложно опишите чтобы мне долго не разбиратся а то примеры на MFC! пишу в API.
380
19 февраля 2002 года
Arestov
285 / / 20.09.2000
Есть несколько способов получить, то что Вам требуется. Какой выбрать зависит от того как и какой график рисуется.
Сначала, чтобы ничего не моргало заводим еще один контекст(назовём hdcBackBuffer) в котором будем склеивать фон с графиком.
Фон будет в контексте(hdcImage).

Например, если график рисуем по точкам, чем-то типа LineTo, или гистограмму FillRect'ом, тогда на WM_PAINT BitBlt'им фон из hdcImage в hdcBackBuffer и в hdcBackBuffer'е рисуем график, т.к. мы его рисуем LineTo'ом или FillRect'ом, то проблема с прозрачностью отпадает. И наконец BitBlt'им hdcBackBuffer в контекст окна. Движение графика осуществляется простым перемещением элементов в массиве точек.

Если у Вас другой случай, киньте мне на мыло, я чего-нибудь придумаю




[ Это Сообщение было отредактировано Arestov в 2002-02-19 1351 ]
409
19 февраля 2002 года
Ramzes
163 / / 20.09.2000
Основной принцип сохранения фона:
-перед тем как что-нибудь нарисовать нужно
сохранить то на чем ты будешь это рисовать.
Например рисуешь точку с координатами (10,10)
сохрани то, что было в это точке.
-потом перед выводом очередного кадра, восстанавливаешь то, что сохранил и все.
Аноним
просто нужно нарисовать график - аналог из GetRight.
380
20 февраля 2002 года
Arestov
285 / / 20.09.2000
Цитата:

On 2002-02-19 1434, Anonymous wrote
просто нужно нарисовать график - аналог из GetRight.



я не пользуюсь GetRight'ом , я всё больше FlashGet'ом
И GetRight не помню но вообще то, что я Вам предложил выше, будет работать правильно.

Аноним
я нашёл силы и всё сделал!
только один вопрос:
я сделал с диалоговом окне элемент Picture (Frame серого цвета) и в нём рисую!
это корректно? т.к. в примере из MFC там создаётся поверх этого элемента новый элемент и в нём уже рисуется график.
в связи с тем что я не создаю новый элемент иногда мой график затирается фоном цвета Frame как этого избежать что бы виндовс не рисовал Frame?
WM_PAINT обрабатываю!
380
21 февраля 2002 года
Arestov
285 / / 20.09.2000
Цитата:

(Frame серого цвета) и в нём рисую!
это корректно?


Да это обычная практика, когда требуется незначительно изменить поведение стандартного элемента, называется Subclassing.

Цитата:

Frame как этого избежать что бы виндовс не рисовал Frame?
WM_PAINT обрабатываю!


Еще лови WM_ERASEBKGND просто возвращай из него NULL.

Аноним
может мне стоит преопределить WndProc для элемета Picture с помощью SetWindowLong() и уже отлавливать там WM_PAINT и WM_ERASEBKG чтобы не ловить перерисовку всего окна???
---
СПАСИБО!
Аноним
не срабатывает перехват WM_ERASEBKGND!
пробовал и return 0L и 1L!
и даже SetWindowLong(hwnd, DWL_MSGRESULT, 1L) т.к. окно диалоговое!
380
22 февраля 2002 года
Arestov
285 / / 20.09.2000
Цитата:

On 2002-02-21 1944, Anonymous wrote
не срабатывает перехват WM_ERASEBKGND!
пробовал и return 0L и 1L!
и даже SetWindowLong(hwnd, DWL_MSGRESULT, 1L) т.к. окно диалоговое!



Конечно надо ловить мессаги только Вашего элемента, а не всего диалогового окна. А из WM_ERASEBKGND надо return 0.

Аноним
[q]
Arestov
[/q]

Всё отлично работает! спасибо за помощь!!!
441
27 февраля 2002 года
Doc__
82 / / 20.06.2000
Странно, какого велосипеда вы не изобретали, а AlphaBlend почему-то никто не предложил... А ведь это _обыкновенный_ GDI...
P.S. Вообще, на мой взгляд лучше вообще было DirectDraw использовать... Работало бы быстрее в несколько раз.
380
27 февраля 2002 года
Arestov
285 / / 20.09.2000
Цитата:

On 2002-02-26 2211, Doc__ wrote
Странно, какого велосипеда вы не изобретали, а AlphaBlend почему-то никто не предложил... А ведь это _обыкновенный_ GDI...



AlphaBlend не предложили по двум причинам
1. Она поддерживается с Win98 и Win2000
2. На некоторых видеодрайверах она работает не правильно (особенно на карточках для мобильных систем)
3. Blend фишка тоже не быстрая, а в GDI можно рисовать с прозрачностью (полной) используя маску и битовые операции.

Цитата:

P.S. Вообще, на мой взгляд, лучше вообще было DirectDraw использовать... Работало бы быстрее в несколько раз.



Не знаю, для вывода простого графика как в GetRight создавать DirectDrawSurface и Blt'ить там это, по-моему изврат

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог