Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Вывод графики в Visual C++

Есть приложение типа SDI, в котором по ходу работы на экран выводится небольшой
Bitmap. Сам битмап определен в объекте класса CImageList. Вывод идет в функции
OnDraw класса Cview следующим образом:
Image.Draw(pDC,номер картинки,координаты (0,0),ILD_NORMAL);. Почему при выводе
изображение в окне мигает, т.е по окну проскакивают полосы. Пробовал рисовать
в памяти, а затем выводить на экран, через BitBlt, но не работает, т.е компилируется
нормально, а на экран ничего не выводится. Делал так:
CDC dcTemp;
dcTemp.CreateCompatibleDC(pDC);
image.Draw(&dcTemp,......)

как можно избавиться от этого мигания и почему не срабатывает BitBlt.
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Tue, 23 Dec 2003 23:59:48 +0300 (#41126)

 

Ответы:

Здравствуйте !

Вы не выбрали в совместимом контексте поверхность.
По умолчанию в совм. контексте создается монохромная поверхность размером
1x1
пиксел.

Надо сделать так :

CDC dcTemp;
dcTemp.CreateCompatibleDC(pDC);

CBitmap bmp, *pOldBitmap;
bmp.CreateCompatibleBitmap(pDC, 200, 200);

pOldBitmap = dcTemp.SelectObject(&bmp);

// рисование...

dcTemp.SelectObject(pOldBitmap);

кроме того оконный класс вью регистрируется с кистью фона системмного цвета
окна.
То есть при перерисовке окна оно сначала красится кистью фона, а затем вы
поверх что то
рисуете. Из - за этого - мигание. Надо закраску фона убрать.
Если, например, перехватить WM_ERASEBKGND (во вью добавить обработчик
OnEraseBkgnd),
а в нем просто делать return TRUE, то фон красится не будет.
Можно в PreCreateWindow регить свой класс окна (с кистью фона
GetStockObject(NULL_BRUSH)).

Т.к. фон рисоваться не будет - придется самому перерисовывать все окно. То
есть
CreateCompatibleBitmap надо делать с шириной и высотой клиентской области. И
потом блиттить
битмап на всю клиентскую область вью.

С уважением, Вахтуров Виктор.
Информационный сайт для программистов http://SoftMaker.com.ru
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 24 Dec 2003 03:32:27 +0300 (#41136)