
07.08.2014, 06:20
|
Новичок
|
|
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
|
|
для выполнения пн 2. я в место панели поставил скроллбокс. но нарисованный на нем и увеличенный графический объект так, что границы его выходят за область видимости не приводят к появлению скроллов, хотя свойство автоскролл установлено в true. подскажите. как это исправить.
Код:
procedure SetDCPixelFormat ( hdc : HDC );
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
dc:=GetDC(scrlbx1.Handle);
SetDCPixelFormat(dc); //Применяем формат пиксела заданный ранее
hrc := wglCreateContext(dc); //Выделяем контекст устройства
wglMakeCurrent(dc, hrc);
glEnable(GL_DEPTH_TEST); // включаем проверку разрешения фигур (впереди стоящая закрывает фигуру за ней)
glDepthFunc(GL_LEQUAL);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
glViewport(0, 0, pnl1.Width, pnl1.Height); //выделяем область куда будет выводиться наш буфер
end;
procedure TForm1.tmr1Timer(Sender: TObject);
var
i,j:Integer;
X,Y:array of double;
massXS,massXXS:array of double;
massYS,massYYS:array of double;
begin
FormResize(Sender); //процедура обновления
glClearColor (0.97, 0.97, 0.97, 1.0); //Цвет фона
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Очистка буфера цвета и глубины
glPointSize(7); //размер точки
glEnable(GL_POINT_SMOOTH);
glBegin(GL_POINTS);
glColor3f(0,0,1);
SetLength(massXS,SPSS.SizeOfmas);
SetLength(massYS,SPSS.SizeOfmas);
SetLength(massXXS,SPSS.SizeOfmas);
SetLength(massYYS,SPSS.SizeOfmas);
for i:=0 to SPSS.SizeOfmas-1 do begin
massXS[i]:=SPSS.SpsStroki[i].X;
massYS[i]:=SPSS.SpsStroki[i].Y;
end;
for j:=0 to SPSS.SizeOfmas-1 do begin
massXXS[j]:=0.9*(2*massXS[j]-(MaxValue(massXS)+minvalue(massXS)))/(MaxValue(massXS)-minvalue(massXS));
massYYS[j]:=0.9*(2*massYS[j]-(MaxValue(massYS)+minvalue(massYS)))/(MaxValue(massYS)-minvalue(massYS));
end;
for i:=0 to SPSS.SizeOfmas-1 do begin
glVertex2d(massXXS[i],massYYS[i]);
end;
glEnd;
SwapBuffers(dc);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
spsS.free;
end;
procedure TForm1.scrlbx1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
shiftcoorX,shiftcoorY:Integer;
begin
shiftcoorX:=Xdown-X;
shiftcoorY:=Ydown-Y;
if (Button=mbLeft) And ((shiftcoorX<>0)or(shiftcoorY<>0)) then
glTranslatef(0.3, 0.3, 0.0) else
if Button=mbRight then glScalef (0.5, 0.5, 0.5)else
glScalef (2.0, 2.0, 1.0);
end;
procedure TForm1.scrlbx1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Xdown:=X;
Ydown:=Y;
end;
и еще может в моем коде есть какие-то оплошности - был бы рад узнать о них. так как opengl только только начал изучать.
|