Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
8-59812
Sabor
2003-02-04 12:36
2003.05.19
ICON


14-59875
UzesCCron
2003-04-28 22:51
2003.05.19
Редактор с Хайлайтином


1-59755
k-sergey
2003-05-05 21:35
2003.05.19
Как передать данные( массив buf: array


3-59580
msoftware
2003-04-26 04:58
2003.05.19
Проблемы с Autoincrement полями в INTERBASE


14-59944
Top Gun
2003-04-30 16:26
2003.05.19
Книга Рихтера, четвертое издание - урезанное ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский