Jak w Delphi pobrać współrzedne myszki nad TImage, np. przez uchwyt?

0

Witam.

  1. Mam klasa
TZrodlo i ImageZrodlo

oraz klasa
TCel i ImageCel
Image pokazane są np na osobnych formach.

  1. W chwili wywołania **TCel **przekazuję do zmiennej
TCel:= TCel.Create( ImageZrodlo )
// gdzie
fImageZrodloTemp:= ImageZrodlo;

czyli mam coś co pokazuje na ImageZrodlo,
w timerze odświeżam :

   ImageCel.Canvas.CopyRect( Rect(0,0, 50,50),
                           fImageZrodloTemp.Canvas,
                           Rect(0 -(MyszX div 2),0  -(MyszY div 2), 50 +(MyszX div 2), 50 +(MyszY div 2))
                          );

i pytanie, jak pobrać współrzędne myszki a jak się uda to i stany przycisków z **ImageZrodlo **nie przez zmienne globalne tylko jakoś tak w obrębie klasy TCel, korzystajac z np fImageZrodloTemp, może handle lub czegoś w tym stylu.
Chodzi mi o to, że chce tylko wywołać Create dla TCel i nie przejmować się komunikacją między klasami dla wykrycia co się dzieje z myszką.

0

Od czego pochodzą te klasy?

0

@Integers - TImage tak jak i inne komponenty graficzne, nie posiadają uchwytu; Aby on był, klasa czy komponenty musi dziedziczyć po TWinControl;

A co do tematu - współrzędne kursora nad komponentem możesz pobrać w dowolnym momencie, wykorzystując funkcję GetCursorPos i odpowiednio ją przeliczyć na współrzędne w komponencie; Możesz także (i to oczywiście lepsze rozwiązanie) w darzeniu OnMouseMove na bieżąco pobierać gotowe współrzędne, od razu przeliczone;

Musisz podać więcej informacji i więcej kodu, bo nie bardzo rozumiem co chcesz osiągnąć.

0

Całość nazwijmy lupą, podglądem ale ..

To może handle Picture, **Canvasu **.. albo zamiast Image TPanel?
Właśnie chciałem się obyć bez OnMouseMove - o ile to możliwe. Osiągnąć chce minimum podpinania takiej klasy w przypadku użycia jej w innym programie. Żeby całe podpięcie ograniczało się do Create TCel.
Jeśli się nie da inaczej to wrzucę w OnMouseMove przekazywanie współrzędnych.

Ale jest jeszcze jedna sprawa która teraz wyszła .. ImageZrodlo jest w ScrollBox, bo się nie mieści. Więc to znów komplikuje koncepcję i nie wiem czy nie zrezygnować z pomysłu i kontaktować jednak klasy w **OnMouseMove **uwzględniając pozycje Scrollbar-u.

1

OnMouseMove było by dobre, bo zwalnia z obliczeń pozycji kursora, licząc [0,0] dla lewego górnego rogu komponentu; Obstawiam (ale nie testowałem), że w przypadku ScrollBoxa nie trzeba będzie przeliczać pozycji względem jego pozycji - trzeba by sprawdzić, bo nie mam pewności;

Nadal nie rozumiem tego co chcesz osiągnąć, więc opisz może nieco dokładniej i pokaż deklaracje używanych klas, które nie pochodzą z biblioteki standardowej.

2
var P:TPoint;
P:=fImageZrodloTemp.ScreenToclient(Mouse.CursorPos);

Klawisze: GetAsyncKeyState

0

O to chodziło. Sprawę trochę trudno było wytłumaczyć bo niewiele więcej kodu miałem ale się udało.

Zeszło mi trochę bo gdy myszka z zbliżała się do krawędzi obraz pozostawiał na TImageCel ślad przesunięcia ale to już kwestia odpowiednich if-ów.

W tej chwili myszka widzi cale Image nawet tę część schowaną za suwakiem ScrollBar-u ale to tak jak przekazałem wskaźnik na ImageZrodlo tak samo przekaże ScrollBarZrodlo i ograniczę wyświetlanie do widocznego fragmentu.

Tak czy owak ImageZrodlo i ImageCel nie muszą się bezpośrednio ani pośrednio w kodzie kontaktować.

Jeszcze raz dzięki.

0

Jeszcze jedno pytanie już na marginesie

ImageCel.Canvas.CopyRect

działa tylko gdy do ImageZrodlo jest wczytana TBitmap.
Jeśli wczytam JPG jest

Can only modyfy an image if it constains a bitmap

Da się to jakoś przysposobić na JPG? czy pozostaje JPG zamieniać na BMP i dopiero wczytać? Ale to już poza konkursem.

2

Nie ma innego sposobu, najpierw skopiuj do BMP;

var Bmp:TBitmap;
Bmp:=TBitmap.Create;
Bmp.Assign(Jpg);

1 użytkowników online, w tym zalogowanych: 0, gości: 1