быстрая прорисовка окна
От: napa3um  
Дата: 26.07.03 19:41
Оценка:
здрасте... пишу прогу, которая отображает и редактирует структуру некоего механизма (очень условно — кружочки и полосочки)... но ентот механизм должен в последствии зашевелиться согласно некоторым условиям... весь механизм, по сути, задан координатами вершин, объединённых линиями... при новом кадре каждая вершина просчитывается согласно некоторым физическим формулам... как бы мне обновить картинку с наименьшими временными затратами?.. картинка выводится средствами gdi в ответ на wm_paint, при каком либо изменении я вызываю InvalidateRect(hGraphWnd,0,0,TRUE)... всё намана, но мерцает неприкольно, особенно при сложной модели механизма... заранее пасиба за помощь...
Re: быстрая прорисовка окна
От: Alex Fedotov США  
Дата: 26.07.03 19:49
Оценка: 1 (1)
Здравствуйте, napa3um, Вы писали:

N>здрасте... пишу прогу, которая отображает и редактирует структуру некоего механизма (очень условно — кружочки и полосочки)... но ентот механизм должен в последствии зашевелиться согласно некоторым условиям... весь механизм, по сути, задан координатами вершин, объединённых линиями... при новом кадре каждая вершина просчитывается согласно некоторым физическим формулам... как бы мне обновить картинку с наименьшими временными затратами?.. картинка выводится средствами gdi в ответ на wm_paint, при каком либо изменении я вызываю InvalidateRect(hGraphWnd,0,0,TRUE)... всё намана, но мерцает неприкольно, особенно при сложной модели механизма... заранее пасиба за помощь...


1. Рисовать сначала в off-screen bitmap (memory DC), а потом делать BitBlt в окно.
2. Обработать WM_ERASEBKGND и просто вернуть TRUE, чтобы система автоматически не заливала окно цветом фона.
-- Alex Fedotov
Re[2]: быстрая прорисовка окна
От: napa3um  
Дата: 26.07.03 23:58
Оценка:
2 Alex Fedotov:
пасиба, помогло — не мерцает... но возникла другая проблема — вся графика терь монохромная... в чём может быть дело?.. вот кусочек моего кода:
...................................
case WM_PAINT:
{
PAINTSTRUCT sPaint;
node*spNode;
line*spLine;
HDC hDC;
HBITMAP hBitmap;
RECT sRect;
HBRUSH hBrush;

GetClipBox(BeginPaint(hGraphWnd,&sPaint),&sRect);
hDC=CreateCompatibleDC(sPaint.hdc);
hBitmap=CreateCompatibleBitmap(hDC,sRect.right-sRect.left,sRect.bottom-sRect.top);
SelectObject(hDC,hBitmap);
hBrush=CreateHatchBrush(HS_CROSS,RGB(240,240,240)); //свтло-серая клетчатая кисть
FillRect(hDC,&sRect,hBrush);
DeleteObject(hBrush);
...................................
MoveToEx(hDC,spSelNode->dX,spSelNode->dY,0);
LineTo(hDC,sEndPoint.x,sEndPoint.y);
...................................
BitBlt(sPaint.hdc,0,0,sRect.right-sRect.left,sRect.bottom-sRect.top,hDC,0,0,SRCCOPY);
DeleteObject(hBitmap);
DeleteDC(hDC);
EndPaint(hGraphWnd,&sPaint);
...................................
т.е., по идее, фоном для всей геометрии должны служить бело-серые клеточки, а они чёрно-белые... заранее пасиба...
Re[3]: быстрая прорисовка окна
От: napa3um  
Дата: 27.07.03 00:11
Оценка:
ой, простите, нашёл ошибочку...
нужно
hBitmap=CreateCompatibleBitmap(hDC,sRect.right-sRect.left,sRect.bottom-sRect.top);
вместо
hBitmap=CreateCompatibleBitmap(sPaint.hdc,sRect.right-sRect.left,sRect.bottom-sRect.top);
Re[2]: быстрая прорисовка окна
От: Кодт Россия  
Дата: 28.07.03 08:32
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

AF>1. Рисовать сначала в off-screen bitmap (memory DC), а потом делать BitBlt в окно.


Причем рисовать в off-screen bitmap при изменении модели, а BitBlt | StretchBlt -- при WM_PAINT.
Это уменьшит тормоза при перерисовке, вызванной внешними обстоятельствами (если окно инвалидировано системой: поверх него что-то протащили, к примеру).
Перекуём баги на фичи!
Re[3]: быстрая прорисовка окна
От: Alex Fedotov США  
Дата: 28.07.03 08:56
Оценка:
Здравствуйте, Кодт, Вы писали:

AF>>1. Рисовать сначала в off-screen bitmap (memory DC), а потом делать BitBlt в окно.


К>Причем рисовать в off-screen bitmap при изменении модели, а BitBlt | StretchBlt -- при WM_PAINT.

К>Это уменьшит тормоза при перерисовке, вызванной внешними обстоятельствами (если окно инвалидировано системой: поверх него что-то протащили, к примеру).

А вот CDoubleBufferWindow — это плод моего больного воображения, или я его действительно где-то видел?
-- Alex Fedotov
Re[4]: быстрая прорисовка окна
От: Sergeem Израиль  
Дата: 28.07.03 09:12
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

AF>Здравствуйте, Кодт, Вы писали:


AF>>>1. Рисовать сначала в off-screen bitmap (memory DC), а потом делать BitBlt в окно.


К>>Причем рисовать в off-screen bitmap при изменении модели, а BitBlt | StretchBlt -- при WM_PAINT.

К>>Это уменьшит тормоза при перерисовке, вызванной внешними обстоятельствами (если окно инвалидировано системой: поверх него что-то протащили, к примеру).

AF>А вот CDoubleBufferWindow — это плод моего больного воображения, или я его действительно где-то видел?


в fltk, кажись

Я бы не мучался, а взял бы и сделал всё под direct draw.
Serge.

Hасколько проще была бы жизнь, если бы она была в исходниках.
Re: быстрая прорисовка окна
От: serg_p Украина  
Дата: 28.07.03 13:22
Оценка:
В добавок к сказанному — посмотрите еще стиль WS_EX_COMPOSITED
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.