Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мерцание BitMap BitBlt рисование, Мерцание BitMap BitBlt рисование 
V
    Опции темы
Oreshin
Дата 10.9.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 31.5.2007

Репутация: нет
Всего: нет



У меня проблема с мерцанием, вроде ба как понял надо битмап и битблт юзать.
Но что то у меня ни как не получается, у меня теперь рисуется все черно-белое и мерцание как было так и осталось.
Вот код:
Код

hdc = GetDC(hwnd);
cdc=CreateCompatibleDC(hdc);
b=CreateCompatibleBitmap(cdc,1000,560);
HPEN hWhitePen, hBlackPen, hOldPen;
HBRUSH hGreenBrush,hWhiteBrush, hOldBrush;
hWhitePen = CreatePen(PS_SOLID, 1, RGB(255,255,255));
hBlackPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
hWhiteBrush = CreateSolidBrush(RGB(255,255,255));
hGreenBrush = CreateSolidBrush(RGB(0, 255, 0));
SelectObject(hdc, b);
SelectObject(hdc, hBlackPen);
SetBkMode(cdc, TRANSPARENT);  // прозрачный фон
SetTextColor(hdc,RGB(100, 100, 100)); // цвет текста
Ukladka[0] == FALSE ? hOldBrush = (HBRUSH)SelectObject(hdc,WhiteBrush):hOldBrush = (HBRUSH)SelectObject(hdc, hGreenBrush);
Rectangle(hdc, 16, 460, 16+xUkl, 482);
TextOut(hdc, 31, 462, (LPSTR)"1", 1);
RECT rt;
GetClientRect(hwnd, &rt);
ico0= LoadIcon(hThisInst, (LPCSTR)IDI_ICON3);
ico1= LoadIcon(hThisInst, (LPCSTR)IDI_ICON1);
ico2= LoadIcon(hThisInst, (LPCSTR)IDI_ICON2);
DrawIconEx(hdc,xuklad,482,ico0,30,30,0,0,DI_IMAGE);
event1==FALSE ? DrawIconEx(hdc,16,65,ico1,11,11,0,0,DI_IMAGE) : DrawIconEx(hdc,16,65,ico2,11,11,0,0,DI_IMAGE);
event2==FALSE ? DrawIconEx(hdc,80 * cxChar,65,ico1,11,11,0,0,DI_IMAGE) : DrawIconEx(hdc,80 * cxChar,65,ico2,11,11,0,0,DI_IMAGE);
BitBlt(  
hdc,// handle to destination device context 
0,    // x-coordinate of destination rectangle's upper-left corner
0,    // y-coordinate of destination rectangle's upper-left corner
1000,    // width of destination rectangle 
560,    // height of destination rectangle 
cdc,    // handle to source device context 
0,    // x-coordinate of source rectangle's upper-left corner  
0,    // y-coordinate of source rectangle's upper-left corner
SRCCOPY    // raster operation code 
);
// вернуть старый объекты pen и brush в DC
SelectObject(hdc, b);
SelectObject(hdc, hOldPen);
SelectObject(hdc, hOldBrush);


PM MAIL   Вверх
Alexeis
Дата 10.9.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



  Разумеется, ведь рисовать нужно на битмапе, а потом битмап рисовать на окне.

Код

SelectObject(hdc, b); // cdc  а не hdc
SelectObject(hdc, hBlackPen);


и дальше по тексту везде нужно заменить.

т.е. все рисовать на невидимой поверхности, которую потом рисовать одной операцией.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
zkv
Дата 10.9.2007, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



добавлю
Цитата(Oreshin @  10.9.2007,  10:10 Найти цитируемый пост)
b=CreateCompatibleBitmap(cdc,1000,560);

насколько я помню правильно так:
CreateCompatibleBitmap(hdc //...
те создавать битмап совместимый с исходным контекстом, а то проблема с глубиной цвета может быть.
Цитата(Oreshin @  10.9.2007,  10:10 Найти цитируемый пост)
SelectObject(hdc, b);

явно лишнее
PM MAIL   Вверх
Oreshin
Дата 10.9.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 31.5.2007

Репутация: нет
Всего: нет



Сделал соответствующие поправки в коде. Теперь у меня на экране появляются  цветные элементы которые я рисую, но к сожалению вся область за исключением тех элементов каторые я рисую закрашивается черным цветом smile и не показываются мои button и progress bar, а если я двигаю экран то у меня появляются те элементы каторые я  в WM_CREATE создаю т.е. button и progress bar , а все элементы каторые я рисую на битмапе не рисуются и черная заливка проподает smile Kстати я перерисовываю InvalidateRact(hwnd,NULL,TRUE);
с частотой 100 Гц.
Вот код после исправлений:
Код

hdc = GetDC(hwnd);
cdc=CreateCompatibleDC(hdc);
b=CreateCompatibleBitmap(hdc,1000,560);
HPEN hWhitePen, hBlackPen, hOldPen;
HBRUSH hGreenBrush,hWhiteBrush, hOldBrush;
hWhitePen = CreatePen(PS_SOLID, 1, RGB(255,255,255));
hBlackPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
hWhiteBrush = CreateSolidBrush(RGB(255,255,255));
hGreenBrush = CreateSolidBrush(RGB(0, 255, 0));
SelectObject(cdc, b);
SelectObject(cdc, hBlackPen);
SetBkMode(cdc, TRANSPARENT);  // прозрачный фон
SetTextColor(cdc,RGB(100, 100, 100)); // цвет текста
Ukladka[0] == FALSE ? hOldBrush = (HBRUSH)SelectObject(cdc,WhiteBrush):hOldBrush = (HBRUSH)SelectObject(cdc, hGreenBrush);
Rectangle(cdc, 16, 460, 16+xUkl, 482);
TextOut(cdc, 31, 462, (LPSTR)"1", 1);
RECT rt;
GetClientRect(hwnd, &rt);
ico0= LoadIcon(hThisInst, (LPCSTR)IDI_ICON3);
ico1= LoadIcon(hThisInst, (LPCSTR)IDI_ICON1);
ico2= LoadIcon(hThisInst, (LPCSTR)IDI_ICON2);
DrawIconEx(hdc,xuklad,482,ico0,30,30,0,0,DI_IMAGE);
event1==FALSE ? DrawIconEx(cdc,16,65,ico1,11,11,0,0,DI_IMAGE) : DrawIconEx(hdc,16,65,ico2,11,11,0,0,DI_IMAGE);
event2==FALSE ? DrawIconEx(cdc,80 * cxChar,65,ico1,11,11,0,0,DI_IMAGE) : DrawIconEx(cdc,80 * cxChar,65,ico2,11,11,0,0,DI_IMAGE);
BitBlt(  
hdc,// handle to destination device context 
0,    // x-coordinate of destination rectangle's upper-left corner
0,    // y-coordinate of destination rectangle's upper-left corner
1000,    // width of destination rectangle 
560,    // height of destination rectangle 
cdc,    // handle to source device context 
0,    // x-coordinate of source rectangle's upper-left corner  
0,    // y-coordinate of source rectangle's upper-left corner
SRCCOPY    // raster operation code 
);
// вернуть старый объекты pen и brush в DC
SelectObject(cdc, b);
SelectObject(cdc, hOldPen);
SelectObject(cdc, hOldBrush);

PM MAIL   Вверх
Andrey44
Дата 10.9.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Так сделай FillSolidRect() - нужным цветом smile

Добавлено через 1 минуту и 34 секунды
И обработай WM_ERASEBKGND smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 10.9.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



  Это все делается в обработчике WM_PAINT?




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Andrey44
Дата 10.9.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



FillSolidRect() - в WM_PAINT
WM_ERASEBKGND  - return true; smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
zkv
Дата 10.9.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Andrey44, я думаю Alexeis в курсе, и не у тебе спрашивал  smile  
PM MAIL   Вверх
Andrey44
Дата 10.9.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



 smile  Таки точно не у меня! Как-то я сразу не сообразил smile 
Извиняюсь за пост не по теме smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Oreshin
Дата 10.9.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 31.5.2007

Репутация: нет
Всего: нет



Да это все в WM_PAINT делается, а то что мне посоветовали я завтра на работе с утра попробую и напишу результат.
PM MAIL   Вверх
Oreshin
Дата 11.9.2007, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 31.5.2007

Репутация: нет
Всего: нет



Стал рисовать и то что я в ПАИНТЕ рисую и те элементы которые в КРЕАТЕ после hdc = GetDC(hwnd) на hdc = BeginPaint(hwnd,&sp);
 И мерцания по меньше стало после добавления SetForegroundWindow(hwnd);
Сейчас сделаю фон как советовал Andrey44 через FillSolidRect(), а точнее через FillRect() т.к. если я не ошибаюсь то FillSolidRect() в WinAPI нет smile , но мерцание мне кажется маленькое останется :-(

Исправленный код:

Код

SetForegroundWindow(hwnd);
hdc = BeginPaint(hwnd,&sp);
cdc=CreateCompatibleDC(hdc);
b=CreateCompatibleBitmap(hdc,1000,560);
HPEN hWhitePen, hBlackPen, hOldPen;
HBRUSH hGreenBrush,hWhiteBrush, hOldBrush;
hWhitePen = CreatePen(PS_SOLID, 1, RGB(255,255,255));
hBlackPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
hWhiteBrush = CreateSolidBrush(RGB(255,255,255));
hGreenBrush = CreateSolidBrush(RGB(0, 255, 0));
SelectObject(cdc, b);
SelectObject(cdc, hBlackPen);
SetBkMode(cdc, TRANSPARENT);  // прозрачный фон
SetTextColor(cdc,RGB(100, 100, 100)); // цвет текста
Ukladka[0] == FALSE ? hOldBrush = (HBRUSH)SelectObject(cdc,WhiteBrush):hOldBrush = (HBRUSH)SelectObject(cdc, hGreenBrush);
Rectangle(cdc, 16, 460, 16+xUkl, 482);
TextOut(cdc, 31, 462, (LPSTR)"1", 1);
RECT rt;
GetClientRect(hwnd, &rt);
ico0= LoadIcon(hThisInst, (LPCSTR)IDI_ICON3);
ico1= LoadIcon(hThisInst, (LPCSTR)IDI_ICON1);
ico2= LoadIcon(hThisInst, (LPCSTR)IDI_ICON2);
DrawIconEx(hdc,xuklad,482,ico0,30,30,0,0,DI_IMAGE);
event1==FALSE ? DrawIconEx(cdc,16,65,ico1,11,11,0,0,DI_IMAGE) : DrawIconEx(hdc,16,65,ico2,11,11,0,0,DI_IMAGE);
event2==FALSE ? DrawIconEx(cdc,80 * cxChar,65,ico1,11,11,0,0,DI_IMAGE) : DrawIconEx(cdc,80 * cxChar,65,ico2,11,11,0,0,DI_IMAGE);
BitBlt(  
hdc,// handle to destination device context 
0,    // x-coordinate of destination rectangle's upper-left corner
0,    // y-coordinate of destination rectangle's upper-left corner
1000,    // width of destination rectangle 
560,    // height of destination rectangle 
cdc,    // handle to source device context 
0,    // x-coordinate of source rectangle's upper-left corner  
0,    // y-coordinate of source rectangle's upper-left corner
SRCCOPY    // raster operation code 
);
// вернуть старый объекты pen и brush в DC
SelectObject(cdc, hOldPen);
SelectObject(cdc, hOldBrush);

PM MAIL   Вверх
zkv
Дата 11.9.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Oreshin, WM_ERASEBACKGROUND (забыл как дословно, догадаешься) обработал?
нужно просто TRUE вернуть.

PS о чем говорил Andrey44.

Это сообщение отредактировал(а) zkv - 11.9.2007, 09:25
PM MAIL   Вверх
Alexeis
Дата 11.9.2007, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Код

DrawIconEx(hdc,xuklad,482,ico0,30,30,0,0,DI_IMAGE);

  Все еще рисуется на окне, а не на битмапке.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Oreshin
Дата 11.9.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 31.5.2007

Репутация: нет
Всего: нет



Теперь все на битмапе рисую, и кстати говоря решил пока что не использовать WM_ERASEBKGND, а то с ним глючит сильно. Я фон по методу  FillRect() сделал и вроде все нормально пока что smile .

НО появилась фигня какая-то smile или я что- то не так делаю.

Я обнавляю изображение через InvalidateRact() с частотой 100 Гц и спустя полторы секунды у меня перестае отображаться bitmap smile  может я где то забываю ресурсы освободить или еще что? Ни как причину понять не могу токого поведения smile 

А может у кого ни то есть примерчик с решением проблемы мерцания smile  smile 




PM MAIL   Вверх
Alexeis
Дата 11.9.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



  Все выделенные битмапы, кисти, иконки должны быть удалены, а контексты освобождены по выходу.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1431 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.