Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mausposition von gestretchten Bild (https://www.delphipraxis.net/176481-mausposition-von-gestretchten-bild.html)

EWeiss 8. Sep 2013 23:51


Mausposition von gestretchten Bild
 
Komme irgendwie nicht an die mausposition bei einem gestretchten Bild heran.
Jemand nen Tip?

Delphi-Quellcode:
  case (Msg) of
    WM_LBUTTONDOWN:
      SendMessage(VisDataThread.ParentHandle, WM_LBUTTONDOWN, wParam, lParam);
sind ja im lParam vorhanden, die passen aber nicht mehr wenn das Bild gestretcht wurde.

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

sx2008 9. Sep 2013 00:08

AW: Mausposition von gestretchten Bild
 
Mit dem Dreisatz.
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:
 := (300 * 1600) div 450;
Analog geht die Berechnung für die y-Koordinate.

EWeiss 9. Sep 2013 00:13

AW: Mausposition von gestretchten Bild
 
Zitat:

Zitat von sx2008 (Beitrag 1227654)
Mit dem Dreisatz.
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:
 := (300 * 1600) div 450;
Analog geht die Berechnung für die y-Koordinate.

Und das geht dann auch mit einem Buffer?
Dem die weite StretchWidth zugewiesen wird?

Muss ich gleich mal testen.
Danke.

Hmm Image hab ich keins.

gruss

EWeiss 9. Sep 2013 00:32

AW: Mausposition von gestretchten Bild
 
Will nicht.

Delphi-Quellcode:
    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;
Kann den Aufgemalten Dialog nicht schließen.
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:
    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;
gruss

Namenloser 9. Sep 2013 06:21

AW: Mausposition von gestretchten Bild
 
Zitat:

Zitat von sx2008 (Beitrag 1227654)
Mit dem Dreisatz.
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:
 := (300 * 1600) div 450;
Analog geht die Berechnung für die y-Koordinate.

Du meinst wohl
Delphi-Quellcode:
(300 * 450) div 1600;
.

EWeiss 9. Sep 2013 06:33

AW: Mausposition von gestretchten Bild
 
Zitat:

Zitat von NamenLozer (Beitrag 1227663)
Zitat:

Zitat von sx2008 (Beitrag 1227654)
Mit dem Dreisatz.
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:
 := (300 * 1600) div 450;
Analog geht die Berechnung für die y-Koordinate.

Du meinst wohl
Delphi-Quellcode:
(300 * 450) div 1600;
.

Habe ich ja über deinen Beitrag so geschrieben ;)

Zitat:

Jetzt gehts musste das nur umtauschen..
gruss

EWeiss 10. Sep 2013 07:23

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

jfheins 10. Sep 2013 10:12

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:

EWeiss 10. Sep 2013 10:59

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

Perlsau 10. Sep 2013 19:42

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 10:20 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz