работа с графикой
можно ли сделать во втором фон прозрачным? чтобы в последствии второй контекст наложить на первый? должен получится движущийся график на недвижимом фоне! как это сделать покороче? при сообшении WM_PAINT готовый график с фоном выводится!
можно ли примерчик?
как вообще смещать картинку влево и заполнять пустое пространство справа фоном?
есть примеры но ещё не смотрел! если несложно опишите чтобы мне долго не разбиратся а то примеры на MFC! пишу в API.
Сначала, чтобы ничего не моргало заводим еще один контекст(назовём hdcBackBuffer) в котором будем склеивать фон с графиком.
Фон будет в контексте(hdcImage).
Например, если график рисуем по точкам, чем-то типа LineTo, или гистограмму FillRect'ом, тогда на WM_PAINT BitBlt'им фон из hdcImage в hdcBackBuffer и в hdcBackBuffer'е рисуем график, т.к. мы его рисуем LineTo'ом или FillRect'ом, то проблема с прозрачностью отпадает. И наконец BitBlt'им hdcBackBuffer в контекст окна. Движение графика осуществляется простым перемещением элементов в массиве точек.
Если у Вас другой случай, киньте мне на мыло, я чего-нибудь придумаю
[ Это Сообщение было отредактировано Arestov в 2002-02-19 1351 ]
-перед тем как что-нибудь нарисовать нужно
сохранить то на чем ты будешь это рисовать.
Например рисуешь точку с координатами (10,10)
сохрани то, что было в это точке.
-потом перед выводом очередного кадра, восстанавливаешь то, что сохранил и все.
On 2002-02-19 1434, Anonymous wrote
просто нужно нарисовать график - аналог из GetRight.
я не пользуюсь GetRight'ом , я всё больше FlashGet'ом
И GetRight не помню но вообще то, что я Вам предложил выше, будет работать правильно.
только один вопрос:
я сделал с диалоговом окне элемент Picture (Frame серого цвета) и в нём рисую!
это корректно? т.к. в примере из MFC там создаётся поверх этого элемента новый элемент и в нём уже рисуется график.
в связи с тем что я не создаю новый элемент иногда мой график затирается фоном цвета Frame как этого избежать что бы виндовс не рисовал Frame?
WM_PAINT обрабатываю!
(Frame серого цвета) и в нём рисую!
это корректно?
Да это обычная практика, когда требуется незначительно изменить поведение стандартного элемента, называется Subclassing.
Frame как этого избежать что бы виндовс не рисовал Frame?
WM_PAINT обрабатываю!
Еще лови WM_ERASEBKGND просто возвращай из него NULL.
---
СПАСИБО!
пробовал и return 0L и 1L!
и даже SetWindowLong(hwnd, DWL_MSGRESULT, 1L) т.к. окно диалоговое!
On 2002-02-21 1944, Anonymous wrote
не срабатывает перехват WM_ERASEBKGND!
пробовал и return 0L и 1L!
и даже SetWindowLong(hwnd, DWL_MSGRESULT, 1L) т.к. окно диалоговое!
Конечно надо ловить мессаги только Вашего элемента, а не всего диалогового окна. А из WM_ERASEBKGND надо return 0.
Arestov
[/q]
Всё отлично работает! спасибо за помощь!!!
P.S. Вообще, на мой взгляд лучше вообще было DirectDraw использовать... Работало бы быстрее в несколько раз.
On 2002-02-26 2211, Doc__ wrote
Странно, какого велосипеда вы не изобретали, а AlphaBlend почему-то никто не предложил... А ведь это _обыкновенный_ GDI...
AlphaBlend не предложили по двум причинам
1. Она поддерживается с Win98 и Win2000
2. На некоторых видеодрайверах она работает не правильно (особенно на карточках для мобильных систем)
3. Blend фишка тоже не быстрая, а в GDI можно рисовать с прозрачностью (полной) используя маску и битовые операции.
P.S. Вообще, на мой взгляд, лучше вообще было DirectDraw использовать... Работало бы быстрее в несколько раз.
Не знаю, для вывода простого графика как в GetRight создавать DirectDrawSurface и Blt'ить там это, по-моему изврат