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

Ваш аккаунт

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

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

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

Рисование с помощью API: пиксели "смывает" после перекрывания окна другим окном

5.1K
13 августа 2007 года
12345678
93 / / 16.12.2006
Доброго времени суток. Если кто сталкивался с такой проблемой, когда выводиш в hDC пиксель, круг, линию или еще чето, то сразу оно на контексте отображаеться, но если перекрыть часть видимого контекста другим окном - пиксели как будто тряпкой стираются. Вот например в VB поставил себе AutoRedraw = True - и никаких проблем. А что если юзаеш, например, ассемблер? Там таких фич нет :( А позарез необходимо нарисовать сталую картинку в контексте...

Собсно, вопрос: как реализировать режим AutoRedraw для контекста самостоятельно, через API например?
13K
13 августа 2007 года
alexnd
6 / / 16.10.2005
 
Код:
WNDCLASSEX wc;
...
wc.style = CS_CLASSDC | CS_HREDRAW | CS_VREDRAW;
...
RegisterClassEx (&wc)
5.1K
13 августа 2007 года
12345678
93 / / 16.12.2006
спасибо большое, а как ето сделать если окно уже создано?
19K
13 августа 2007 года
Rost
45 / / 05.07.2007
Цитата: 12345678
спасибо большое, а как ето сделать если окно уже создано?


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

19K
13 августа 2007 года
Некромант
23 / / 05.12.2006
Просто при каждой перерисовке окна (при этом винда посылает сообщение WM_PAINT окну), перерисовывайте пиксели. Если перерисовывать с помощью BeginPaint, то перерисовывается только измененная область. Далее читайте по этим функциям в МСДН.
5.1K
14 августа 2007 года
12345678
93 / / 16.12.2006
Цитата: Некромант
Просто при каждой перерисовке окна ..., перерисовывайте пиксели.



К сожалению мне не катит такое решение. Я юзаю GDI+ и имею дело с полупрозрачностью в .png файлах, а если рисосовать каждый раз на одном и том же месте полупрозрачную картинку то она накладываеться на уже имеющуюся ее копию в контексте. Так что в результате нескольких перерисовок полупрозрачные пиксели на картинке становяться черными.

Я наконецто понял благодаря вашим ответам как иметь статическую картинку в контексте, но вот что делать когда прийнять во внимание выше сказанное?.. Может есть какая то API функция для сброса контекста до его визуализации?

13K
14 августа 2007 года
alexnd
6 / / 16.10.2005
есть сообщение WM_ERASEBKGND где моно выполнять заливку клиентской области
5.1K
14 августа 2007 года
12345678
93 / / 16.12.2006
Цитата: alexnd
есть сообщение WM_ERASEBKGND где моно выполнять заливку клиентской области



Нее, ето тоже самое что и WM_PAINT. Оно посылаеться окну когда над етим окном перемещаеться другое окно.

7
14 августа 2007 года
@pixo $oft
3.4K / / 20.09.2006
А ещё можно в памяти создать DC и просто копировать из него в DC окна при WM_Paint с помощью BitBlt,например.И пиксели выводить в "памятный" DC
5.1K
15 августа 2007 года
12345678
93 / / 16.12.2006
Цитата: @pixo $oft
А ещё можно в памяти создать DC и просто копировать из него в DC окна при WM_Paint с помощью BitBlt,например.И пиксели выводить в "памятный" DC



Круто! Ето кажись то что надо. Но почему то не работает... Я делаю так:

 
Код:
WM_CREATE:
CDC = CreateCompatibleDC(hDC)
...
;Вывожу пиксели в CDC
...
WM_PAINT:
Call BitBlt(hDC, 0, 0, Width, Height, CDC, 0, 0, SRCCOPY)
...


но форма остаеться пустой. Что я не так делаю?
263
15 августа 2007 года
koltaviy
816 / / 16.12.2004
Может я что-то не так понимаю, но тебе просто при получении сообщения окна WM_PAINT нужно рисовать то, что тебе нужно рисовать. Вот и все! И прозрачность твоя останется и вообще все будет ОК :)
Ты вообще пробовал то, что тебе посоветовал Некромант?
5.1K
15 августа 2007 года
12345678
93 / / 16.12.2006
Цитата: koltaviy
Ты вообще пробовал то, что тебе посоветовал Некромант?



Да, я так делал. Точнее почти так :) Я при каждом WM_PAINT рисовал саму png картинку. Теперь я понял что делал не так. В прочем, ето я уже говорил в предыдущем своем посте.

На текущий момент я уже вдуплил как делать DC в памяти и рисовать в нем пиксели и потом копировать етот DC на форму. Делаю так:...

Код:
Bih BITMAPINFOHEADER

...
;заполняем структуру Bih
...
CDC = CreateCompatibleDC(0)
Cbmp = CreateDIBSection(0, Bih, 0, Bmp, 0, 0)
Call SelectObject(CDC, Cbmp)

WM_CREATE:
;рисуем в CDC пиксели...
...

WM_PAINT:
Call BitBlt(hDC, 0, 0, Width, Height, CDC, 0, 0, SRCCOPY)
...


...и все работает!

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