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

Вниз

Прокрутка изображения   Найти похожие ветки 

 
seregka   (2005-03-30 15:07) [0]

У меня допустим есть изображение 2032х1524
НА форме у Image я ставлю 300х300. Как мне можно мышом прокрутить изображение исходного размера в пределах этих границ.


 
@!!ex   (2005-03-30 17:36) [1]

Значица так. Объясняю. Может чего не правильно будет, не обусудь, с компонентами уже давно не работал.
И так:
Делаешь TBitMap размером 2032х1524.
Грузишь в него свою картинку.
Создаешь переменные:
BitMap:TBitMap;
XShift:integer = 0;
YShift:integer = 0;
MouseX,MouseY:integer;
На OnPaint Imag"a следующий код:
BitBlt(Image.Canvas.Handle,0,0,300,300,BitMap,XShift,YShift,SRC_COPY);
На MouseDown:
MouseX:=X;
MouseY:=Y;
На MouseUp:
MouseX:=0;
MouseY:=0;
На MouseMove:
XShift:=XShift+MouseX-X;
YShift:=YShift+MouseY-Y;
if XShift<0 then XShift:=0;
if XShift>2032-300 then XShift:=1732;
if YShift<0 then YShift:=0;
if YShift>1524-300 then YShift:=1224;
Image.Refresh;
За рабочесть кода не отвечаю, писал его без компилятора поблизости, но суть такая.


 
@!!ex   (2005-03-30 17:39) [2]

P.S. Все сообщения, естественно, относительно Image.
Если ты хочешь, чтобы мышой по картинке двигали.


 
seregka   (2005-03-30 18:08) [3]

Спасибо за ответ, но, увы, у меня не работает.
В BitBlt ругается на SRC_COPY и нужно не bitmap, a bitmap.canvas.handle.
Если оставить с этой функцией, то image весь заполняется черным цветом. Если убрать bitblt, то все нормально, но  изображение не двигается.


 
@!!ex   (2005-03-30 18:29) [4]

Ок. bitmap.canvas.handle. Это естественно. :)
SRCCOPY.
Если не будет работать, скажу еще один способ.


 
Магнитон Борыч   (2005-03-30 18:43) [5]

Есть такая штука - ScrollBox


 
@!!ex   (2005-03-30 18:56) [6]

1) Тебе же сказали - МЫШКОЙ.
2) В данном случае проблема - в отрисовке, а не в принципе перемещения.
3) У меня предвзятое отношение к MFC и плохое к VCL, большой опыт работы с ним. Понял, что это - дерьмо.
4) Проблема все из-за того, что я по памяти пишу. Отсюда ошибки типа SRC_COPY вместо SRCCOPY. :) А если там не правильно задать тип перерисовки, то черный экран в результате.


 
@!!ex   (2005-03-30 19:04) [7]

Ах да! Кстати, совсем забыл! В OnMouseMove в конце добавь:
MouseX:=X;
MouseY:=Y;


 
seregka   (2005-03-30 19:45) [8]

не-а, чего-то не хочет.
Плюс забыл впервый раз написать, что у Image нет onpaint


 
Магнитон Борыч   (2005-03-30 19:54) [9]

@!!ex  (30.03.05 18:56) [6]


 
Магнитон Борыч   (2005-03-30 19:55) [10]

> @!!ex  (30.03.05 18:56) [6]

Скажи, а ты тоже используешь TImage?


 
@!!ex   (2005-03-30 21:51) [11]

Положим, я использую MS VC++, OpenGL, WinAPI.
Ща. Так уж и быть. Поставлю Delphi и сделаю тебе рабочий пример.


 
@!!ex   (2005-03-30 22:11) [12]

Вот, короче. Рабочий код:
var
 BitMap:TBitMap;
 XShift:integer = 0;
 YShift:integer = 0;
 MouseX,MouseY:integer;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
if (MouseX<>0) and (MouseY<>0) then
 begin
  Form1.Caption:=IntToStr(-MouseX+X);
  XShift:=XShift-MouseX+X;
  YShift:=YShift-MouseY+Y;
  if XShift<0 then XShift:=0;
  if XShift>2032-300 then XShift:=1732;
  if YShift<0 then YShift:=0;
  if YShift>1524-300 then YShift:=1224;
  BitBlt(Image1.Canvas.Handle,0,0,300,300,BitMap.Canvas.Handle,XShift,YShift,SRCCOPY);
  Image1.Refresh;
  MouseX:=X;
  MouseY:=Y;
 end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
MouseX:=0;
MouseY:=0;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
MouseX:=X;
MouseY:=Y;
end;


 
@!!ex   (2005-03-30 22:13) [13]

Тьфу. еп. Убери Form1.Caption:=IntToStr(-MouseX+X);
Я его для дебага юзал.


 
Магнитон Борыч   (2005-03-31 09:26) [14]

Всё понятно, спасибо.


 
seregka   (2005-03-31 10:22) [15]

Я вставил этот код. Когда я вожу  мышом вверх\вниз\по сторонам, то ничего не происходит. Если я кликаю Image, то вылетает ошибка


 
seregka   (2005-03-31 12:10) [16]

Извиняюсь. Накосячил с image.bitmap.

Работает, но как-то странно:

двигает не в пределах 300х300, а в левом верхнем углу сверху существующей картинки накладывает картинку где-то 100-100 и показывает движение по нормальной картинке


 
@!!ex   (2005-03-31 12:39) [17]

Извени, это уже где то у тебя баги, может изменил не правильно? Сделай, код один в один как меня, посмотри работает-ли, если все будет ОК, то ищи косяк у себя. У меня все ОК.


 
seregka   (2005-03-31 13:51) [18]

bitmap:=image1.picture.bitmap???


 
@!!ex   (2005-03-31 14:05) [19]

Что такое bitmap:=image1.picture.bitmap
?
Зачем ты это делаешь?


 
seregka   (2005-03-31 16:56) [20]

Что такое bitmap:=image1.picture.bitmap
?
Зачем ты это делаешь?

---
Просто без этого не работает. На пустой bitmap он ругается.НАконец-то заработало.

и еше
XShift:=XShift-MouseX+X;
YShift:=YShift-MouseY+Y;

лучше все же x и y отнимать. А то как-то непривычно - указатель ведешь вправо, а рисуннок едет влево.

Огромное спасибо за код


 
@!!ex   (2005-03-31 21:41) [21]

1) Вообщето на OnCreate надоть в BitMap сувать рисунок.....
2) Кому как привычнее.... :)
3) Что не работало? Я накосячил или ты?


 
seregka   (2005-03-31 22:38) [22]

конечно я накосячил. Руки, знаете ли, не оттуда растут. Особенно, когда такая страшная запарка



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

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

Наверх




Память: 0.51 MB
Время: 0.025 c
4-1118239228
PIF
2005-06-08 18:00
2005.08.07
Права администратора


3-1119934973
evg00
2005-06-28 09:02
2005.08.07
Проблема с общим доступом к базе


3-1120212326
Apachi
2005-07-01 14:05
2005.08.07
EXEC в хранимых процедурах, как им пользоватся


8-1107000935
Atomic
2005-01-29 15:15
2005.08.07
JPG TO BMP


3-1119801157
serguncho
2005-06-26 19:52
2005.08.07
Транзакции в Firebird