Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.01;
Скачать: CL | DM;

Вниз

Опять картинки...   Найти похожие ветки 

 
eXPell ©   (2007-03-11 05:45) [0]

Кинул на форму scrollbox, а в него image. никак не получается организовать, чтобы если виден верхний левый угол картинки, то ее нельзя было бы перемещать вниз и вправо. Код такой:

procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer;
 State: TDragState; var Accept: Boolean);
var t:Tpoint;
begin
t:=Form1.ScrollBox1.ScreenToClient(Mouse.CursorPos);
if (image1.BoundsRect.TopLeft.X>form1.ScrollBox1.BoundsRect.TopLeft.X) or(image1.BoundsRect.TopLeft.Y>form1.ScrollBox1.BoundsRect.TopLeft.Y) then
begin
form1.Image1.SetBounds(0,0,image1.Width,image1.Height);
end
else
begin
Image1.Left:=t.X-tp.x;
Image1.Top:=t.Y-tp.Y;
end;
end;


Он в принципе срабатывает, но не всегда. Может кто подскажет, что не так))


 
eXPell ©   (2007-03-13 14:39) [1]

up.
ЗЫ. первый и последний раз


 
Desdechado ©   (2007-03-13 15:11) [2]

> ее нельзя было бы перемещать вниз и вправо
А как ты ее перемещаешь?


 
Elen ©   (2007-03-13 15:26) [3]


> eXPell ©   (11.03.07 05:45)

разберись с этим :

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Image1: TImage;
   Panel1: TPanel;
   procedure Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
   procedure Image1DragOver(Sender, Source: TObject; X, Y: Integer;
     State: TDragState; var Accept: Boolean);
   procedure Image1EndDrag(Sender, Target: TObject; X, Y: Integer);
   procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormCreate(Sender: TObject);
   procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
 private
   { Private declarations }
 public   tp:tpoint;
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses Types;

{$R *.dfm}

procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
caption:="ss";  
end;

procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer;
 State: TDragState; var Accept: Boolean);
var t:Tpoint;
begin
t:=Form1.ScreenToClient(Mouse.CursorPos);
caption:=inttostr(Image1.Left-(t.X-tp.x))+" "+inttostr(Image1.Left);

if Image1.Left<0 then
TControl(sender).Left:=t.X-tp.x;
if  ((Image1.Left-(t.X-tp.x))>0)  then
TControl(sender).Left:=t.X-tp.x;

if Image1.Top<0 then
TControl(sender).Top:=t.Y-tp.Y;
if ((Image1.Top-(t.y-tp.y))>0)  then
TControl(sender).Top:=t.Y-tp.Y;


end;

procedure TForm1.Image1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
tag:=0;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
  tp.X:=x;tp.Y:=y;
  TControl(sender).BeginDrag(true);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Image1.OnMouseDown:=Image1MouseDown;
Image1.DragMode:=dmManual;
Image1.OnDragDrop:=Image1DragDrop;
Image1.OnDragOver:=Image1DragOver;
Image1.OnEndDrag:=Image1EndDrag;

end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
panel1.OnMouseDown:=Image1MouseDown;
panel1.DragMode:=dmManual;
panel1.OnDragDrop:=Image1DragDrop;
panel1.OnDragOver:=Image1DragOver;
panel1.OnEndDrag:=Image1EndDrag;
end;

end.


 
eXPell ©   (2007-03-13 15:30) [4]

Ситуация такая: есть image (в скролбоксе) размеры которого 800*600, и в него загружаю картинку с размерами 1200*800. Получается часть картинки не видна. Возникает момент когда например надо посмотреть нижний правый угол. Следовательно я ее перемещаю в верх и в лево. Но выходит так что переместив картинку достаточно высоко (низко), виден скролбокс. как этого избежать, т.е. чтобы если нижний правый угол картинки совпадает с нижним правым углом скролбокса, то перемещение дальнейшее в том же направление не должно происходить.

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


 
Elen ©   (2007-03-13 15:38) [5]


> eXPell ©   (13.03.07 15:30) [4]

Я не понимаю, зачем ты пользуешся компонентом-скролбоксом, если тебе скролбокс не нужен? Растягивай картинку на форме или в панели.


 
eXPell ©   (2007-03-13 15:48) [6]


> Elen ©   (13.03.07 15:38) [5]

В приведенном Вами коде, картинка при перемещении видна только часть равная размеру панели, хотя картинка в несколько раз превышает их(размеры панели).

ЗЫ. и на границах так же есть не четкости, т.е. если идет совпадение границы картинки и границы панели - то не всегда "перемещение" останавливается))), хотя и на это спасибо за код:)


 
Elen ©   (2007-03-13 15:52) [7]


> eXPell ©   (13.03.07 15:48) [6]

А это не важно. Растяни картинку на 1245:6678 и увидиш что она правильно таскается, а по поводу несоответствия границ при перетаскивании, ну чтож, бывает...


 
eXPell ©   (2007-03-13 16:01) [8]


> Elen ©   (13.03.07 15:52) [7]

не много сорри))): autosize картинке не сделал, поэтому при перетаскивании была не полностью видна)).


> ну чтож, бывает...

серьезно, нет решения, или я просто (грубо говоря) не допонимаю?


 
Elen ©   (2007-03-13 16:04) [9]


> серьезно, нет решения, или я просто (грубо говоря) не допонимаю?

Решения есть, но не для этого компонента, и не таким путем. Этот компонент слишком примитивный для Pan-прокрутки.


 
eXPell ©   (2007-03-13 16:10) [10]


> Elen ©   (13.03.07 16:04) [9]

э-э-э... а для какого тогда компонентика будет в самый раз?


 
Elen ©   (2007-03-13 16:18) [11]


> э-э-э... а для какого тогда компонентика будет в самый раз?

Y-y-y Да их множество пригодных. Погугли на вьюверы графики.


 
eXPell ©   (2007-03-13 16:24) [12]


> Elen ©   (13.03.07 16:18) [11]

спасибо и на этом))). хотя странно что делфа не может это реализовать без дополнительных компонентов... честно говоря, думал задача на 5 минут, ан нет, даже на форум пришлось с глупостями лезть


 
Elen ©   (2007-03-13 16:26) [13]


> хотя странно что делфа не может это реализовать без дополнительных
> компонентов

Может вполне. Функциями API :)


 
eXPell ©   (2007-03-13 16:38) [14]

начинаем все сначала:). Странно задача - элементарная.
Есть панель (пусть будет уже панель).
На ней есть имэже.
Размеры загружаеммой картинки в имэж превышают область видимости(т.е. видна только часть загруженной картинки). Дальше.
Пользователь перемещает картинку по панели.
Вопрос: как сделать чтобы была видна при совпадении координат картинки и панели (границ), перемещение прекращалось.

Все..... Мрак... С таким моим продвижением в программировании, проще от рядового до генерала...


 
TRUNK ©   (2007-03-13 19:13) [15]

> Вопрос: как сделать чтобы была видна при совпадении координат
> картинки и панели (границ), перемещение прекращалось

Загружаем исходный рисунок в Bitmap.
Пусть PictureX и PictureY - координаты того пиксела рисунка,
который находится в левом верхнем углу видимой части изображения;
PictureWidth и PictureHeight - размеры исходного рисунка;
VisibleWidth и VisibleHeight - размеры области отображения (напр. PaintBox);
В OnMouseMove меняем эти координаты и проверяем (именно в таком порядке):
if (PictureX > (PictureWidth-VisibleWidth)) then PictureX := PictureWidth - VisibleWidth;
if (PictureY > (PictureHeight-VisibleHeight)) then PictureY := PictureHeight - VisibleHeight;
if (PictureX < 0) then PictureX := 0;
if (PictureY < 0) then PictureY := 0;
После этой проверки копируем часть рисунка с координатами верхнего
левого угла (PictureX,PictureY) и размерами Width = Min(PictureWidth,VisibleWidth)
и Height = Min(PictureHeight,VisibleHeight) из исходного рисунка в PaintBox.


 
eXPell ©   (2007-03-13 19:31) [16]


> TRUNK ©   (13.03.07 19:13) [15]

непременно сегодня попробую. Спасибо.)))


 
RASkov   (2007-03-13 20:00) [17]

> [16] eXPell ©   (13.03.07 19:31)

Просто скопируй в "чистую форму"... И замени выделенное на имя файла *.BMP.
type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormPaint(Sender: TObject);
   procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 B: TBitMap;
 XIm, YIm, XStep, YStep, XOld, YOld: Integer;

const
  IMWIDTH = 200;
  IMGEIGHT = 200;
  IMTOP = 100;
  IMLEFT = 100;
implementation

{$R *.dfm}

procedure DrawBmp;
begin
 if not Assigned(B) then Exit;
 BitBlt(Form1.Canvas.Handle, IMLEFT, IMTOP, IMWIDTH, IMGEIGHT, B.Canvas.Handle, XIm, YIm, SRCCOPY);
 Form1.Caption:=Format("X:=%d Y:=%d", [XIm, YIm]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 B:=TBitmap.Create;
 B.LoadFromFile("<имя файла с картинкой>");
 XIm:=0; YIm:=0;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 DrawBmp;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 XOld:=X; YOld:=Y;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var XNew, YNew: Integer;
begin
 if not (ssLeft in Shift) then Exit;
 XStep:=XOld-X;
 YStep:=YOld-Y;
 XNew:=XIm+XStep;
 YNew:=YIm+YStep;
 if (XNew>0) and (XNew<B.Width-IMWIDTH) then XIm:=XNew;
 if (YNew>0) and (YNew<B.Height-IMGEIGHT) then YIm:=YNew;
 XOld:=X; YOld:=Y;
 DrawBmp;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 DrawBmp;
end;

end.


 
eXPell ©   (2007-03-14 08:09) [18]


> RASkov   (13.03.07 20:00) [17]

жесть:). то что надо)) спасибо.
всем спасибо)


 
TRUNK ©   (2007-03-14 09:53) [19]

> [17] RASkov   (13.03.07 20:00)
> if (XNew>0) and (XNew<B.Width-IMWIDTH) then XIm:=XNew;
> if (YNew>0) and (YNew<B.Height-IMGEIGHT) then YIm:=YNew;


При такой проверке не всегда будет удаваться посмотреть самые края картинки.
Координаты нужно обновлять в любом случае, а если они вылезают за пределы,
то просто подогнать их к соответствующему предельному значению (см. [15]).
А картинку перерисовывать, только если изменились координаты.


 
RASkov   (2007-03-14 14:23) [20]

> [19] TRUNK ©   (14.03.07 09:53)
> > [17] RASkov   (13.03.07 20:00)
> > if (XNew>0) and (XNew<B.Width-IMWIDTH) then XIm:=XNew;
> > if (YNew>0) and (YNew<B.Height-IMGEIGHT) then YIm:=YNew;
> При такой проверке не всегда будет удаваться посмотреть самые края картинки.

Точно, поспешил... надо было так:
 if (XNew>=0) and (XNew<=BMP.Width-IMWIDTH) then XIm:=XNew;
 if (YNew>=0) and (YNew<=BMP.Height-IMHEIGHT) then YIm:=YNew;

И не надо ничего подгонять... имхо. Все края должны быть видны и выходить за границы не должно...


 
TRUNK ©   (2007-03-14 14:59) [21]

> [20] RASkov (14.03.07 14:23)

Насчёт замены ">" на ">=" и "<" на "<=" это правильно, но я не это имел ввиду. Представим, что XIm = 2.
Пусть мышь сдвинулась по X вправо на 4 пиксела. Тогда XNew получится равным -2. Условие не выполняется,
и XIm по-прежнему остаётся равным 2. И сколько не продолжается движение мыши в том же направлении,
всё равно не удасться увидеть левый край картинки шириной 2 пиксела. Я же предлагаю в таком случае
подогнать XIm к предельному значению, т.е. присвоить ей 0.


 
RASkov   (2007-03-14 15:09) [22]

> [21] TRUNK ©   (14.03.07 14:59)

А... вон оно что..... верно.
Ну или у краев резко мышой не дергать :) (не выход)



Страницы: 1 вся ветка

Текущий архив: 2007.04.01;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.049 c
2-1173260999
Officeman
2007-03-07 12:49
2007.04.01
сортировка в TListView


15-1173290878
lak/proxy/
2007-03-07 21:07
2007.04.01
знатокам CSS


2-1173691444
kyn66
2007-03-12 12:24
2007.04.01
Выбор "горичих" клавиш


2-1173788444
masha179
2007-03-13 15:20
2007.04.01
очистка


2-1173163205
Антоныч_ск
2007-03-06 09:40
2007.04.01
пути поиска bpl-файлов