Форум: "Основная";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];
ВнизТаскать картинку как в ACDSee или ScrollBox Найти похожие ветки
← →
Navi (2003-05-04 08:55) [0]Здравствуйте!
В ACDSee, если картинка не влезает ее можно таскать, чтобы просмотреть. Как такое грамотно реализовать в собственном окне просмотра печати, если как тень страницы используется Panel, на которой лежит PaintBox, на котором собственно и отображается растянутый Metafile?
Сейчас я сделал просмотр, подложив под все это ScrollBox, но он не "понимает" колеса мыши, а это удобно было бы. Поэтому и возникла мысль сделать как в ACDSee.
Спасибо.
← →
Tano (2003-05-04 09:31) [1]Кидаю на мыло готовую форму.
Там реализовано именно то, что тебе надо: панель в окне. Я ее использовал как потомок для диалоговых окон ввода данных, внешне и по поведению похожа на Desktop с тасканием форм за тело, только добавлена реакция на колесо мыши (вверх/вниз), если панель не помещается в окно формы. Скроллов нет (кстати, как и в ACDSee), а на ScrollBox я забил, когда это делал...
Единственно, она в D6. В общем, на D5 тоже без изменения должно пахать.
Вопрос кстати, как реагировать на горизонтальный скрол? Например двухроликовая мышь A4 Tech? Sorry за офф-топик.
← →
Yanis (2003-05-04 13:41) [2]Может и мне тоже вышлешь, было бы неплохо.
← →
mashinist (2003-05-04 17:11) [3]Тогда может и мне тоже ?
mashinist@inbox.ru
Спасибо.
← →
Proton (2003-05-04 21:45) [4]Этож элементарно, шума то развели
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, jpeg;
type
TForm1 = class(TForm)
ScrollBox1: TScrollBox;
Image1: TImage;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
qx,qy:integer;
implementation
{$R *.DFM}
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
qx := x;
qy := y;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not (ssLeft in shift) then exit;
Image1.OnMouseMove := nil;
// ScrollBox1.ScrollBy(x-qx,y-qy);
ScrollBox1.HorzScrollBar.Position := ScrollBox1.HorzScrollBar.Position - (x-qx);
ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position - (y-qy);
Image1.OnMouseMove := Image1MouseMove;
end;
end.
← →
Tano (2003-05-05 22:07) [5]Вот ОНО:
(Извините, что раньше не выложил - пришлось лишнее вырезать...)
unit F_RecEdit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;
type
TFormRecEdit = class(TForm)
PanelDesktop: TPanel;
PanelSheet: TPanel;
PanelRecAction: TPanel;
procedure FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
procedure PanelSheetMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure PanelSheetMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure PanelSheetMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
//таскание
StartDragY, StartDragX :Integer;
Dragging, Scrolling :Boolean;
public
{ Public declarations }
CurRecordN :Integer;
end;
var
FormRecEdit: TFormRecEdit;
implementation
{$R *.dfm}
procedure TFormRecEdit.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
OldTop, NewTop, TryTop, i :Integer;
begin
if not (Dragging or Scrolling) then
begin
Scrolling:=True;
OldTop:=PanelSheet.Top; NewTop:=OldTop;
if (WheelDelta>0) then //вверх
begin
if PanelSheet.Top<5 then
begin
TryTop:=PanelSheet.Top+(WheelDelta div 20);
if TryTop>5 then TryTop:=5;
NewTop:=TryTop;
end
end
else //вниз
begin
if PanelSheet.Height+PanelSheet.Top>PanelDesktop.ClientHeight-5 then
begin
TryTop:=PanelSheet.Top+(WheelDelta div 20);
if PanelSheet.Height+TryTop<PanelDesktop.ClientHeight-5 then TryTop:=PanelDesktop.ClientHeight-PanelSheet.Height-5;
NewTop:=TryTop;
end;
end;
//плавный скролл
if NewTop<>OldTop then
begin
i:=OldTop;
if NewTop>OldTop then
begin
while i<NewTop do
begin
PanelSheet.Top:=i;
Application.ProcessMessages;
Inc(i,2);
end;
end
else
begin
while i>NewTop do
begin
PanelSheet.Top:=i;
Application.ProcessMessages;
Dec(i,2);
end;
end;
PanelSheet.Top:=NewTop;
end;
Scrolling:=False;
end;
end;
← →
Tano (2003-05-05 22:07) [6]
procedure TFormRecEdit.PanelSheetMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if not Scrolling then
begin
StartDragY:=Y;
StartDragX:=X;
Dragging:=True;
end;
end;
procedure TFormRecEdit.PanelSheetMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Dragging:=False;
end;
procedure TFormRecEdit.PanelSheetMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
TryTop, TryLeft :Integer;
begin
if Dragging then
begin
//TOP
TryTop:=PanelSheet.Top+Y-StartDragY;
if PanelSheet.Height+TryTop<PanelDesktop.ClientHeight-5 then TryTop:=PanelDesktop.ClientHeight-PanelSheet.Height-5;
if TryTop>5 then TryTop:=5;
//LEFT
TryLeft:=PanelSheet.Left+X-StartDragX;
if PanelSheet.Width+TryLeft<PanelDesktop.ClientWidth-5 then TryLeft:=PanelDesktop.ClientWidth-PanelSheet.Width-5;
if TryLeft>5 then TryLeft:=5;
//применить
if PanelSheet.Top<>TryTop then PanelSheet.Top:=TryTop;
if PanelSheet.Left<>TryLeft then PanelSheet.Left:=TryLeft;
end;
end;
procedure TFormRecEdit.FormCreate(Sender: TObject);
begin
Dragging:=False;
PanelSheet.Top:=5;
PanelSheet.Left:=5;
Constraints.MaxHeight:=PanelSheet.Height+44+PanelRecAction.Height;
Constraints.MaxWidth:=PanelSheet.Width+10+15;
end;
procedure TFormRecEdit.FormResize(Sender: TObject);
var
TryTop, TryLeft :Integer;
begin
//TOP
TryTop:=PanelSheet.Top;
if PanelSheet.Height+TryTop<PanelDesktop.ClientHeight-5 then TryTop:=PanelDesktop.ClientHeight-PanelSheet.Height-5;
if TryTop>5 then TryTop:=5;
//LEFT
TryLeft:=PanelSheet.Left;
if PanelSheet.Width+TryLeft<PanelDesktop.ClientWidth-5 then TryLeft:=PanelDesktop.ClientWidth-PanelSheet.Width-5;
if TryLeft>5 then TryLeft:=5;
//применить
if PanelSheet.Top<>TryTop then PanelSheet.Top:=TryTop;
if PanelSheet.Left<>TryLeft then PanelSheet.Left:=TryLeft;
end;
end.
На форме:
PanelDesktop на FormRecEdit, Align=alClient;
PanelRecAction на FormRecEdit, Align=alBottom;
PanelSheet на PanelDesktop, Align=alNone, Cursor=crHandPoint, Top=Left=5
Может буковок и многовато, зато полагаюсь только на типовые средства и гладко прокручивается, а ScrollBy чего-то у меня по человечески не работает (руки короткокривоваты, чтобы разобраться, почему).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c