Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2009, 16:06   #1
boostman
Пользователь
 
Регистрация: 22.05.2008
Сообщений: 55
По умолчанию Панорама в Delphi

Подскажите каким способом можно реализовать просмотр панорамы на Delphi c использованием Image?

Панорама это широкое изображение, и только часть панорамы находится на экране, как собственно "подвинуть" изображение чтобы был виден другой участок?

Пример панорамы: http://www.panoramas.dk/2009/obama-nobel-prize.html
boostman вне форума Ответить с цитированием
Старый 15.12.2009, 16:24   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот примерная наработка:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var   im:TBitmap;  ax,ay,lx,ly:integer;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 im:=TBitmap.Create;
 im.Width:=1024;im.Height:=768;
 im.LoadFromFile('D:\stasya_ru_2_big.bmp');

end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 BitBlt(Canvas.Handle,ax,ay,im.Width,im.Height,im.Canvas.Handle,0,0,SRCCOPY);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Tag:=1;   lx:=x;ly:=y;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Tag:=0; lx:=ax;ly:=ay;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if tag=1 then begin
  ax:=x-lx;
  ay:=y-ly;
  Repaint;
 end;
end;

end.
Смысл в том чтоб запомнить при нажатии мышки координаты где нажато и перерисовывать изображение при "перетаскивании" в новых координатах относительно тех что запомнены
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.12.2009, 16:33   #3
boostman
Пользователь
 
Регистрация: 22.05.2008
Сообщений: 55
По умолчанию

Stilet, спасибо! Но все равно изображение стоит мертвым грузом
boostman вне форума Ответить с цитированием
Старый 15.12.2009, 16:54   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты эти процедуры подключи в инспекторе обьектов к соответствующим событиям
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.12.2009, 16:55   #5
boostman
Пользователь
 
Регистрация: 22.05.2008
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А ты эти процедуры подключи в инспекторе обьектов к соответствующим событиям
Да собсно все практически из вашего кода взял, и все как полагается привязал

Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg;

type
  TForm2 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);

    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormPaint(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
   im:TBitmap;
   ax,ay,lx,ly:integer;


implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
 im:=TBitmap.Create;
           im.Width:=600;im.Height:=400;

 im.LoadFromFile('1.bmp');

end;

procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    Tag:=1;   lx:=x;ly:=y;

end;

procedure TForm2.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     Tag:=0; lx:=ax;ly:=ay;

end;

procedure TForm2.FormPaint(Sender: TObject);
begin
 BitBlt(Canvas.Handle,ax,ay,im.Width,im.Height,im.Canvas.Handle,0,0,SRCCOPY);

end;

procedure TForm2.Image1Click(Sender: TObject);
begin

end;

procedure TForm2.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if tag=1 then begin
  ax:=x-lx;
  ay:=y-ly;
  Repaint;
 end;

end;

end.
16:58

Писал на Delphi 10

17:24

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

У нас принято пользоваться кнопочкой "Правка", дабы не плодить посты подряд, друг за другом.
Модератор

Последний раз редактировалось mihali4; 15.12.2009 в 22:03.
boostman вне форума Ответить с цитированием
Старый 15.12.2009, 17:53   #6
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Проверил код-работает.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 15.12.2009, 19:04   #7
boostman
Пользователь
 
Регистрация: 22.05.2008
Сообщений: 55
По умолчанию

Хм действительно создал новое приложение и заработало Спасибо!

Как же реализовать чтобы движение шло только в рамках изображения? Т.е в данном примере мы перемещаем Image по форме, а не Picture по Image
boostman вне форума Ответить с цитированием
Старый 15.12.2009, 19:17   #8
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Так загружайте сначала всю панораму в буфер, а потом выводите буфер в Image со смещением координат вывода.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 15.12.2009, 19:20   #9
boostman
Пользователь
 
Регистрация: 22.05.2008
Сообщений: 55
По умолчанию

Цитата:
Сообщение от DeKot Посмотреть сообщение
Так загружайте сначала всю панораму в буфер, а потом выводите буфер в Image со смещением координат вывода.
Так вопрос собственно в том, как сместить координаты?
boostman вне форума Ответить с цитированием
Старый 15.12.2009, 19:23   #10
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

BitBlt - самый, по моему мнению, удобный вариант
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На Delphi 7 сделать игру кто хочет стать миллионером в delphi 7 666dart666 Помощь студентам 11 04.11.2010 17:57
Программа-тест в Delphi) скиньте))а то програмку здавать преподу надо,и самой хочется понять Delphi Верчик Помощь студентам 9 02.03.2009 17:46
Delphi. Как нарисовать в Delphi два движущиеся шара с определенной скоростью? redred Общие вопросы Delphi 10 11.12.2007 10:43
Как открыть БД, написанную в Delphi если нf другой машине Delphi нет? dagarik БД в Delphi 7 22.10.2007 17:54
не StringGrid1.Cells[1,1]:='Delphi'; а вот так SG1.C[1,1]:='Delphi' Nemesisking Компоненты Delphi 7 08.09.2007 03:27