вот какая ситуация: я писал прогу в котором был модуль для отрисовки некоторых объектов на форме с помощью ОпенГЛ. Потом мне притащили програмулину, которая в своем окошке с помощью ОпенГЛ тож отрисовывает некоторые объекты. Програмулину та состояла вего из одного модуля, подключил ее все ок, вызываеца теперь по нажатию кнопки на форме где я рисую. Но вот какая проблем возникла, после первого нажатия на кнопку открывается и все отрисовывается нормально, потом закрываю окошко и када опять нажимаю чтобы окошко окрылось, то оно открывается но рисунок не прорисовывает. Хотя все строки кода проходит и вроде как должно рисовать но панелька остается черной. Подскажите с чем может быть дело плз. ниже код опенгл который используется в этой формочке:
| Код | type TfrmEMain = class(TForm)
. . .
private procedure SetDCPixelFormat (dc : HDC); procedure pDrawDisks(Planes: Array of TDisks); procedure pDrawParticles(Particles: Array of TParticle); { Private declarations }
protected procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
public { Public declarations } dc : HDC; hrc : HGLRC; qObj : GLUquadricObj ; end;
. . .
procedure TfrmEMain.SetDCPixelFormat (dc : HDC); var nPixelFormat: Integer; pfd: TPixelFormatDescriptor; begin FillChar(pfd, SizeOf(pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat:= ChoosePixelFormat(DC, @pfd); SetPixelFormat(DC, nPixelFormat, @pfd); end;
//------------------------------------------------------------------------------------------------------------------------------------------------------------
procedure TfrmEMain.FormResize(Sender: TObject); begin glViewport(0, 0, pnlField.Width, pnlField.Height); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(45.0, pnlField.Width / pnlField.Height, 1.0, 10000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity; glTranslatef (0.0, 0.0, -8.0); InvalidateRect(pnlField.Handle, nil, False);
end;
//============================================================= procedure TfrmEMain.WMPaint(var Msg: TWMPaint); var ps : TPaintStruct; i, j, k : Cardinal; BufVector: TVector; BufQ : Extended; begin BeginPaint(Handle, ps); glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // î÷èñòêà áóôåðà öâåòà
glLoadIdentity;
glTranslatef (tX/50, -tY/50, tZ/100);
glRotatef (rX, 0.0, 1.0, 0.0); glRotatef (rY, 1.0, 0.0, 0.0);
. . . отрисовка объектов . . .
SwapBuffers(dc); EndPaint(Handle, ps); end;
//==================================================================
procedure TfrmEMain.FormClose(Sender: TObject; var Action: TCloseAction); begin gluDeleteQuadric (qObj); wglDeleteContext (hrc); ReleaseDC (pnlField.Handle, dc); DeleteDC (dc);
end;
//------------------------------------------------------------------------------
procedure TfrmEMain.FormShow(Sender: TObject); begin Randomize;
dc := GetDC(pnlField.Handle); SetDCPixelFormat(dc); hrc := wglCreateContext(dc); wglMakeCurrent(dc, hrc);
tX := 0; tY := 0; tZ := -2000;
glClearColor (0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL);
qObj := gluNewQuadric;
WMPaint(msg);
btnFillSpaceClick(sender);
end;
|
|