Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.08.2014, 14:19
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию OpenGL - перемещение графического объекта мышкой

Здравствуйте, подскажите, пожалуйста!
я вывожу на панель (TPanel) графический объект: совокупность точек. теперь необходимо узнать и понять:
1. как всю эту совокупность, весь этот графический объект перетаскивать мышкой.
2. увеличить выделенную мышкой область. и чтобы при этом появились скролы на панели.
3. иметь возможность вернуться в исходное состояние.

есть ли на русском языке хороший учебник по opengl и delphi кроме михаила краснова.
Ответить с цитированием
  #2  
Старый 07.08.2014, 06:20
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 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 только только начал изучать.
Ответить с цитированием
  #3  
Старый 20.08.2014, 14:06
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

в общем для того чтобы при увеличении рисунка появлялись бы скроллы я сделал следующее. поместил на форму компанент скроллбокс. в скроллбокс поместил панель. теперь если я принудительно увеличиваю размеры панели через присвоение параметрам высота и ширина соответствующего множителя. и при этом у меня align - alnone, а anchors только сверху и слева, то скроллбокс смиренно показывает скроллы. а если я anchors добавляю низ и право - то скроллы перестают показываться. если ставлю autosize = true то рисовать вообще перестает. если align - что -то другое кроме alnone, то скроллы не показывает. объясните, пожалуйста, почему эта так происходит и как это исправить. и еще как задавать размеры панели, чтобы они были бы равны размеру изображения? чтобы не принудительные неадекватные множители вводить, а чтобы он сам определял размеры рисунка, который создается на нем.?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter