|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
OpenGL - перемещение графического объекта мышкой
Здравствуйте, подскажите, пожалуйста!
я вывожу на панель (TPanel) графический объект: совокупность точек. теперь необходимо узнать и понять: 1. как всю эту совокупность, весь этот графический объект перетаскивать мышкой. 2. увеличить выделенную мышкой область. и чтобы при этом появились скролы на панели. 3. иметь возможность вернуться в исходное состояние. есть ли на русском языке хороший учебник по opengl и delphi кроме михаила краснова. |
#2
|
|||
|
|||
для выполнения пн 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 только только начал изучать. |
#3
|
|||
|
|||
в общем для того чтобы при увеличении рисунка появлялись бы скроллы я сделал следующее. поместил на форму компанент скроллбокс. в скроллбокс поместил панель. теперь если я принудительно увеличиваю размеры панели через присвоение параметрам высота и ширина соответствующего множителя. и при этом у меня align - alnone, а anchors только сверху и слева, то скроллбокс смиренно показывает скроллы. а если я anchors добавляю низ и право - то скроллы перестают показываться. если ставлю autosize = true то рисовать вообще перестает. если align - что -то другое кроме alnone, то скроллы не показывает. объясните, пожалуйста, почему эта так происходит и как это исправить. и еще как задавать размеры панели, чтобы они были бы равны размеру изображения? чтобы не принудительные неадекватные множители вводить, а чтобы он сам определял размеры рисунка, который создается на нем.?
|