![]() |
Mausposition von gestretchten Bild
Komme irgendwie nicht an die mausposition bei einem gestretchten Bild heran.
Jemand nen Tip?
Delphi-Quellcode:
sind ja im lParam vorhanden, die passen aber nicht mehr wenn das Bild gestretcht wurde.
case (Msg) of
WM_LBUTTONDOWN: SendMessage(VisDataThread.ParentHandle, WM_LBUTTONDOWN, wParam, lParam); Hab einen Auflösung von 1920x1200 und das Bild wird gestretcht mit 800x600
Delphi-Quellcode:
if not VisDataThread.UseOpenGL then
begin if (nw > VisDataThread.StretchWidth) or (nh > VisDataThread.StretchHeight) then begin StretchWidth := VisDataThread.StretchWidth; StretchHeight := VisDataThread.StretchHeight; end else begin StretchWidth := nw; StretchHeight := nh; end; FillChar(BmpInfo, SizeOf(BITMAPINFO), 0); BmpInfo.bmiHeader.biSize := SizeOf(BITMAPINFOHEADER); BmpInfo.bmiHeader.biWidth := StretchWidth; BmpInfo.bmiHeader.biHeight := -StretchHeight; BmpInfo.bmiHeader.biPlanes := 1; BmpInfo.bmiHeader.biBitCount := 32; gruss |
AW: Mausposition von gestretchten Bild
Mit dem
![]() Beispiel: * das Bitmap hat eine Breite von 1600 Pixel * Image ist 450 Pixel breit Der Benutzer klickt ins Image auf die Position (300, 167). Dann ist die Position im Bitmap
Delphi-Quellcode:
Analog geht die Berechnung für die y-Koordinate.
:= (300 * 1600) div 450;
|
AW: Mausposition von gestretchten Bild
Zitat:
Dem die weite StretchWidth zugewiesen wird? Muss ich gleich mal testen. Danke. Hmm Image hab ich keins. gruss |
AW: Mausposition von gestretchten Bild
Will nicht.
Delphi-Quellcode:
Kann den Aufgemalten Dialog nicht schließen.
WM_LBUTTONDOWN:
begin if (VisInfo^.w > StretchWidth) and (VisDataThread.UseOpenGL = False) then begin GetCursorPos(CurPos); ScreenToClient(WndHandle, CurPos); X := (CurPos.X * VisInfo^.w) div StretchWidth; Y := (CurPos.Y * VisInfo^.h) div StretchHeight; SendMessage(VisDataThread.ParentHandle, WM_LBUTTONDOWN, wParam, MakeLong(x, y)); end else SendMessage(VisDataThread.ParentHandle, WM_LBUTTONDOWN, wParam, lParam); end; OK! Jetzt gehts musste das nur umtauschen..
Delphi-Quellcode:
:= (300 * 1600) div 450;
Delphi-Quellcode:
:= (300 * 450) div 1600;
Danke für die Hilfe. Falls es mal jemand braucht so ist es richtig.
Delphi-Quellcode:
gruss
WM_LBUTTONDOWN:
begin // Bildschirmweite > Bildweite und kein OpenGL verwenden if (VisInfo^.w > StretchWidth) and (VisDataThread.UseOpenGL = False) then begin GetCursorPos(CurPos); ScreenToClient(WndHandle, CurPos); // Cursor Position x * Gestretchte Bildweite div BildSchirmweite X := (CurPos.X * StretchWidth) div VisInfo^.w ; // Cursor Position y * Gestretchte Bildhöhe div BildSchirmhöhe Y := (CurPos.Y * StretchHeight) div VisInfo^.h; // Message an die Anwendung senden SendMessage(VisDataThread.ParentHandle, WM_LBUTTONDOWN, wParam, MakeLong(x, y)); end else SendMessage(VisDataThread.ParentHandle, WM_LBUTTONDOWN, wParam, lParam); end; |
AW: Mausposition von gestretchten Bild
Zitat:
Delphi-Quellcode:
.
(300 * 450) div 1600;
|
AW: Mausposition von gestretchten Bild
Zitat:
Zitat:
|
AW: Mausposition von gestretchten Bild
@sx2008
Mal so nebenbei wie kamst du darauf das eine Dreisatzrechnung zu grunde lag? So direkt war mir das nicht ersichtlich. gruss |
AW: Mausposition von gestretchten Bild
Was man da ausrechnet ist ja eigentlich nur ein Skalierungsfaktor.
Und wenn du einen Klick bei 1919 auf den Pixel 799 mappen willst, dann stellt sich folgendes "Problem": 1919 * x = 799 Diese Gleichung kann man relativ flott umstellen oder "durch anschauen lösen" zu x = 799/1919. Ich benutze hier übrigens absichtlich die Werte 799, weil der rechte Pixel eben genau diesen X-Wert besitzt. Ein Bild, dass 800px breit ist, beginnt bei Pixel 0 und endet bei Pixel 799. Manche Leute machen da jetzt einen Dreisatz draus und merken sich das Schritt für Schritt. Ich muss mir schon die komplizierten Sätze merken, dann bleibt für solche trivialen Dinger nicht mehr so viel Gehirn-Kapazität übrig. :wink: |
AW: Mausposition von gestretchten Bild
Jo ;)
Ein Dreisatz ist ja was vom 4 Schuljahr Mir ging es darum woran er bemerkt hat das es ein Dreisatz war. Da es sich mir nicht so einfach offenbart hat. Kam einfach nicht auf die richtige lösung!. :) gruss |
AW: Mausposition von gestretchten Bild
Derartige Verhältnisse sind immer mit Dreisatz zu lösen: Wenn 10 Stück 15 Euro kosten, wieviel kosten dann 7 Stück? Lösung 15 / 10 * 7
Wenn X-Position bei einer Breite von 1000 auf 500 steht, um in der Mitte zu sein, wo muß sie dann bei einer Breite von 800 stehen, um wieder in der Mitte zu sein? Oder Prozentrechnen, Zinsen usw.: Das alles ist immer Dreisatz-Rechnung. Da kommt man doch automatisch drauf, wenn man Dreisatzrechnung kennt. Ich brauch das regelmäßig beim Programmieren, das ist absolutes Mathe-Grundwissen, fast so grundlegend wie das kleine Einmaleins – aber wer kann heute noch Kopfrechnen ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz