Проблемы с BitBlt ???
Такая проблема: необходимо создать и отобразить в окне определенный рисунок, причем создается он, во избежание мерцаний, в памяти, а потом вываливается на экран. Делаю следующим образом:
CPaintDC dc(this); // device context for painting
CDC BackBuffer;
CRect EQRect(0, 0, EQ_WIDTH, EQ_HEIGHT);
BackBuffer.CreateCompatibleDC((CDC*)&dc);
CBrush Brush(PaperColor);
BackBuffer.FillRect(LPRECT(EQRect), &Brush);
dc.BitBlt(0, 0, EQ_WIDTH, EQ_HEIGHT, &BackBuffer, 0, 0, SRCCOPY);
(для начала просто залить цветом).
Результат нулевой. Окно цвета не меняет. Если делаю непосредственно:
dc.FillRect(LPRECT(EQRect), &Brush);
то все ок.
Подскажите, в чем проблема?
Всем привет.
Такая проблема: необходимо создать и отобразить в окне определенный рисунок, причем создается он, во избежание мерцаний, в памяти, а потом вываливается на экран. Делаю следующим образом:
CPaintDC dc(this); // device context for painting
CDC BackBuffer;
CRect EQRect(0, 0, EQ_WIDTH, EQ_HEIGHT);
BackBuffer.CreateCompatibleDC((CDC*)&dc);
CBrush Brush(PaperColor);
BackBuffer.FillRect(LPRECT(EQRect), &Brush);
dc.BitBlt(0, 0, EQ_WIDTH, EQ_HEIGHT, &BackBuffer, 0, 0, SRCCOPY);
(для начала просто залить цветом).
Результат нулевой. Окно цвета не меняет. Если делаю непосредственно:
dc.FillRect(LPRECT(EQRect), &Brush);
то все ок.
Подскажите, в чем проблема?
Внимательно прочитай в platform sdk про функцию CreateCompatibleDC. С самого начала там выбрана monochrome bitmap 1x1.
Тебе надо создать битмап (только в др.месте, чтобы ее каждый раз не создавать) например по размеру экрана и совместимую с desktop dc. Затем выбирать ее в buffer dc, рисовать там что угодно ну и использовать bitblt, не забывай выбирать старые объекты обратно в dc.
Внимательно прочитай в platform sdk про функцию CreateCompatibleDC. С самого начала там выбрана monochrome bitmap 1x1.
Тебе надо создать битмап (только в др.месте, чтобы ее каждый раз не создавать) например по размеру экрана и совместимую с desktop dc. Затем выбирать ее в buffer dc, рисовать там что угодно ну и использовать bitblt, не забывай выбирать старые объекты обратно в dc.
Ок, уже разобрался. Все оказалось проще, нужно было создать CompatibleBitmap и передать его в CompatibleDC. Изображение рисуется в буфере COLORREF и передается в Bitmap.
Вот рабочий вариант, кому интересно:
CPaintDC dc(this); // device context for painting
CDC BackBuffer;
BackBuffer.CreateCompatibleDC((CDC*)&dc);
CBitmap *OldBitmap, NewBitmap;
NewBitmap.CreateCompatibleBitmap((CDC*)&dc, EQ_WIDTH, EQ_HEIGHT);
OldBitmap = BackBuffer.SelectObject(&NewBitmap);
//Здесь создается и заполняется массив COLORREF Buffer
NewBitmap.SetBitmapBits(EQ_WIDTH * EQ_HEIGHT * sizeof(COLORREF), (void*)Buffer);
dc.BitBlt(0, 0, EQ_WIDTH, EQ_HEIGHT, &BackBuffer, 0, 0, SRCCOPY);
BackBuffer.SelectObject(OldBitmap);
Ок, уже разобрался. Все оказалось проще, нужно было создать CompatibleBitmap и передать его в CompatibleDC. Изображение рисуется в буфере COLORREF и передается в Bitmap.
Вот рабочий вариант, кому интересно:
CPaintDC dc(this); // device context for painting
CDC BackBuffer;
BackBuffer.CreateCompatibleDC((CDC*)&dc);
CBitmap *OldBitmap, NewBitmap;
NewBitmap.CreateCompatibleBitmap((CDC*)&dc, EQ_WIDTH, EQ_HEIGHT);
OldBitmap = BackBuffer.SelectObject(&NewBitmap);
//Здесь создается и заполняется массив COLORREF Buffer
NewBitmap.SetBitmapBits(EQ_WIDTH * EQ_HEIGHT * sizeof(COLORREF), (void*)Buffer);
dc.BitBlt(0, 0, EQ_WIDTH, EQ_HEIGHT, &BackBuffer, 0, 0, SRCCOPY);
BackBuffer.SelectObject(OldBitmap);
Я тебе просто сказал, что каждый раз создавать в обработчике dc и bitmap как минимум плохой стиль.
Я тебе просто сказал, что каждый раз создавать в обработчике dc и bitmap как минимум плохой стиль.
12 раз в секунду - это не критично. Впрочем, согласен, есть простор для оптимизации.
12 раз в секунду - это не критично. Впрочем, согласен, есть простор для оптимизации.
Ребята... А вы вообще про __asm { ... } что-нибудь слышали... Вот и оптимизируйте ... У меня на проце 1,9 Гц 89 кадров/сек как делать нечего :)
С уважением, -: ShadowZ :-
Ребята... А вы вообще про __asm { ... } что-нибудь слышали... Вот и оптимизируйте ... У меня на проце 1,9 Гц 89 кадров/сек как делать нечего :)
С уважением, -: ShadowZ :-
asm не избавляет от возни с ДевайсКонтекстом, это тебе не старый добрый DOS. При создании же битмэпа выигрыш по времени при так смехотворен, что даже возиться не хочу.
1,9 Гц??? Это круто, чувак! :D Он у тебя на электромагнитных реле, видать :)
asm не избавляет от возни с ДевайсКонтекстом, это тебе не старый добрый DOS. При создании же битмэпа выигрыш по времени при так смехотворен, что даже возиться не хочу.
1,9 Гц??? Это круто, чувак! :D Он у тебя на электромагнитных реле, видать :)
Имеется ввиду 1,9 ГИГАгерц...:P А про встроенный в C++ ассемблер ты зря так... Вещь отличная... Стандартные Сишные (то бишь директовские) функции и процедуры тьфу... Не зря же все движки пишутся на 60-70% на asm... :!!!: :}