здрасте... пишу прогу, которая отображает и редактирует структуру некоего механизма (очень условно — кружочки и полосочки)... но ентот механизм должен в последствии зашевелиться согласно некоторым условиям... весь механизм, по сути, задан координатами вершин, объединённых линиями... при новом кадре каждая вершина просчитывается согласно некоторым физическим формулам... как бы мне обновить картинку с наименьшими временными затратами?.. картинка выводится средствами gdi в ответ на wm_paint, при каком либо изменении я вызываю InvalidateRect(hGraphWnd,0,0,TRUE)... всё намана, но мерцает неприкольно, особенно при сложной модели механизма... заранее пасиба за помощь...
Здравствуйте, napa3um, Вы писали:
N>здрасте... пишу прогу, которая отображает и редактирует структуру некоего механизма (очень условно — кружочки и полосочки)... но ентот механизм должен в последствии зашевелиться согласно некоторым условиям... весь механизм, по сути, задан координатами вершин, объединённых линиями... при новом кадре каждая вершина просчитывается согласно некоторым физическим формулам... как бы мне обновить картинку с наименьшими временными затратами?.. картинка выводится средствами gdi в ответ на wm_paint, при каком либо изменении я вызываю InvalidateRect(hGraphWnd,0,0,TRUE)... всё намана, но мерцает неприкольно, особенно при сложной модели механизма... заранее пасиба за помощь...
1. Рисовать сначала в off-screen bitmap (memory DC), а потом делать BitBlt в окно.
2. Обработать WM_ERASEBKGND и просто вернуть TRUE, чтобы система автоматически не заливала окно цветом фона.
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);
...................................
т.е., по идее, фоном для всей геометрии должны служить бело-серые клеточки, а они чёрно-белые... заранее пасиба...
ой, простите, нашёл ошибочку...
нужно
hBitmap=CreateCompatibleBitmap(hDC,sRect.right-sRect.left,sRect.bottom-sRect.top);
вместо
hBitmap=CreateCompatibleBitmap(sPaint.hdc,sRect.right-sRect.left,sRect.bottom-sRect.top);
Здравствуйте, Alex Fedotov, Вы писали:
AF>1. Рисовать сначала в off-screen bitmap (memory DC), а потом делать BitBlt в окно.
Причем рисовать в off-screen bitmap при изменении модели, а BitBlt | StretchBlt -- при WM_PAINT.
Это уменьшит тормоза при перерисовке, вызванной внешними обстоятельствами (если окно инвалидировано системой: поверх него что-то протащили, к примеру).
Здравствуйте, Кодт, Вы писали:
AF>>1. Рисовать сначала в off-screen bitmap (memory DC), а потом делать BitBlt в окно.
К>Причем рисовать в off-screen bitmap при изменении модели, а BitBlt | StretchBlt -- при WM_PAINT. К>Это уменьшит тормоза при перерисовке, вызванной внешними обстоятельствами (если окно инвалидировано системой: поверх него что-то протащили, к примеру).
А вот CDoubleBufferWindow — это плод моего больного воображения, или я его действительно где-то видел?
Здравствуйте, 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асколько проще была бы жизнь, если бы она была в исходниках.