CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Zoom na TImage

Zoom na TImage

dział ogólny

Zoom na TImage

Nowy postprzez Pitek » czwartek, 16 maja 2013, 00:30

Witam,
chciałbym zastosować algorytm zoom'u dla obiektu TImage z porady Cyfrowego Barona. Tak aby działał on, odpowiednio, przy scroll'u myszki w górę przybliżał a w dół oddalał obraz, właściwie możliwie podobnie tak jak to jest w przeglądarce obrazów Win7. Funkcja musiałaby dostawać położenie kursora i wtedy co jakiś skok, centrując na wskazywanym punkcie przez kursor myszki, przybliżać lub oddalać obraz. Nie bardzo wiem jak to zrobić gdyż nie ma takiego zdarzenia w obiekcie TImage. Kombinowałem coś z tym viewtopic.php?f=2&t=999&p=6575&hilit=rolk%C4%99#p6575 ale nie bardzo mi to wychodzi, nie wiem co gdzie i kiedy przekazywać.
Proszę o jakieś wskazówki.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Zoom na TImage

Nowy postprzez Cyfrowy Baron » czwartek, 16 maja 2013, 09:20

Prosty sposób tak na szybko bo nie mam dziś czasu. Umieść na formularzu Image1 i ustaw mu właściwości: AutoSize = false; Proportional = false; Stretch = false.

Właściwość KeyPreview formularza ustaw na true;

A teraz kod:

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
private:        // User declarations

        void __fastcall TForm1::ZoomIn(TObject *Sender);
        void __fastcall TForm1::ZoomOut(TObject *Sender);

        Graphics::TBitmap *bmp;
Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 bmp = new Graphics::TBitmap;
}
//---------------------------------------------------------------------------

static int x = 0;
static int y = 0;
bool bZoom = false;

//---------------------------------------------------------------------------
void __fastcall TForm1::ZoomIn(TObject *Sender)
{
 int test;
 if(bmp->Width >= bmp->Height)
  test = bmp->Width/2 - (Image1->Width) / 100;
 else
  test = bmp->Height/2 - (Image1->Height) / 100;
 if(x < test)
 {
  x += (Image1->Width) / 100;
  y += (Image1->Height) / 100;

  Graphics::TBitmap *tmp = new Graphics::TBitmap;
  tmp->Width = bmp->Width;
  tmp->Height = bmp->Height;
  tmp->Canvas->CopyRect(Rect(0, 0, tmp->Width, tmp->Height), bmp->Canvas, Rect(x, y, bmp->Width - x, bmp->Height - y));
  Image1->Canvas->Draw(0, 0, tmp);
  delete tmp;
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ZoomOut(TObject *Sender)
{
 if(x > 0)
 {
  x -= (Image1->Width) / 100;
  y -= (Image1->Height) / 100;

  Graphics::TBitmap *tmp = new Graphics::TBitmap;
  tmp->Width = bmp->Width;
  tmp->Height = bmp->Height;
  tmp->Canvas->CopyRect(Rect(0, 0, tmp->Width, tmp->Height), bmp->Canvas, Rect(x, y, bmp->Width - x, bmp->Height - y));
  Image1->Canvas->Draw(0, 0, tmp);
  delete tmp;
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseWheelUp(TObject *Sender, TShiftState Shift, TPoint &MousePos,
                  bool &Handled) /* zdarzenie OnMouseWheelUp dla Form1 */
{
  if(bZoom) ZoomIn(Sender);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormMouseWheelDown(TObject *Sender, TShiftState Shift,
                  TPoint &MousePos, bool &Handled)  /* zdarzenie OnMouseWheelDown dla Form1 */
{
  if(bZoom) ZoomOut(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)  /* zdarzenie OnMouseMove dla Image1 */
{
 if( !bZoom )
 {
  bmp->Assign(Image1->Picture->Graphic);
  Image1->Picture->Graphic = NULL;

  Image1->Canvas->Draw(0, 0, bmp);

  bZoom = true;
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseLeave(TObject *Sender)
{  /* zdarzenie OnMouseLeave dla Image1 */
 bZoom = false;
}


Masz już początek, resztę sam musisz przemyśleć. Podany wyżej kod można zoptymalizować i poprawić.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 32 gości

cron