Текущий архив: 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