Рисую так:
Пишу ну C++ Builder 5.
Сделал (делаю) компоненту на основе TCustomPanel — с OpenGL.
Вот кусок кода (2 функции) — где я рисую на панели:
//---------------------------------------------------------------------------
void __fastcall TMyPanel::PanelIdle(TObject*, bool& done)
{
done = false;
Paint();
}
//---------------------------------------------------------------------------
void __fastcall TMyPanel::Paint(void)
{
//TCustomPanel::Paint();
if (FOnPaint)
{
HPALETTE OldPalette=NULL;
if (Palette)
{
OldPalette=SelectPalette(DisplayDeviceContext,Palette,FALSE);
if (RealizePalette(DisplayDeviceContext)==GDI_ERROR)
{
ShowMessage("RealizePalette:"+IntToStr(GetLastError()));
return;
}
}
if (wglMakeCurrent(DisplayDeviceContext,GLRenderingContext)==false)
{
ShowMessage("wglMakeCurrent:" + IntToStr(GetLastError()));
return;
}
FOnPaint(this);
if ((FSwapBuffers==Auto) && (DoubleBuffer))
::SwapBuffers(DisplayDeviceContext);
if (OldPalette)
wglMakeCurrent(NULL, NULL) ;
}
return;
}
//---------------------------------------------------------------------------
Функция PanelIdle — вызывается когда Application->OnIdle — простой. Делаю это для того, чтобы, например, при OnMouseWellDown (Up) — увеличивать масштаб и ets ...
В самой проге — использую компонент и гружу файл (текстовый с координатами~ 100 000 координат)
в событии OnPanelPaint вызываю glCallList в котором уже сформирована матрица с точками. Т.е.:
//---------------------------------------------------------------------------
void __fastcall TMain::PanelPaint(TObject *Sender)
{
Panel->Clear();
glCallList(List_Name);//ListName - список изображения
}
//---------------------------------------------------------------------------
А сам список формирую так:
List_Name = glGenLists(1);
glNewList(List_Name,GL_COMPILE);
Panel->SetPenColor(clRed);//Цвет пена
Panel->SetScreenColor(clWhite);//цвет фона
Panel->Mesh(Mesh);//финкция отрисовки сети см. ниже
glEndList();
//---------------------------------------------------------------------------
void __fastcall TMyPanel::Mesh (SURF matr)
{
for (int i = 0; i<int(matr.size()); i++)
{
for (int j = 1; j<int(matr[i].size()); j++)
{
glBegin(GL_LINES);
glVertex3d(matr[i][j-1].x,matr[i][j-1].y,matr[i][j-1].z);
glVertex3d(matr[i][j].x,matr[i][j].y,matr[i][j].z);
glEnd();
}
}
}
//---------------------------------------------------------------------------
Вот в принципе и все.
Но 99 % проца — не есть весело