AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Schnittrahmen proportional - WM_SysCommand
Thema durchsuchen
Ansicht
Themen-Optionen

Schnittrahmen proportional - WM_SysCommand

Ein Thema von roga · begonnen am 16. Jul 2013 · letzter Beitrag vom 16. Jul 2013
Antwort Antwort
Benutzerbild von roga
roga

Registriert seit: 15. Jun 2008
Ort: Sachsen-Anhalt
109 Beiträge
 
Delphi XE8 Professional
 
#1

Schnittrahmen proportional - WM_SysCommand

  Alt 16. Jul 2013, 08:20
Hallo,

für einen Bildschnitt benutze ich einen Markierungsrahmen, der an den Ecken und Seiten zur Anpassung mit der Maus angefasst werden kann. Das klappt alles wunderbar. Nun ist jedoch auch ein proportionaler Schnitt für die Seitenverhältnisse 4x3 und 16x9 gefordert. Das Umrechnen und Setzen eines Ausgangsrahmen sind nicht das Problem. In diesem Modus sind nur die Eckpunkte sichtbar und es soll beim Ändern der Größe das vorgegebene Seitenverhältnis beibehalten bleiben. Nun meine Frage:
Das Anpassen geschieht u.a. über Perform(WM_SysCommand, $F004, 0); - Gibt es CommandCodes, die das Seitenverhältnis berücksichtigen, also ein proportionales Resizen?

Beste Grüße von roga
Ronald
  Mit Zitat antworten Zitat
Benutzerbild von roga
roga

Registriert seit: 15. Jun 2008
Ort: Sachsen-Anhalt
109 Beiträge
 
Delphi XE8 Professional
 
#2

AW: Schnittrahmen proportional - WM_SysCommand

  Alt 16. Jul 2013, 11:33
Hat sich erledigt: mache es nun per Scrollrad oder den Tasten +/- und das ist sogar eine bessere Lösung.
Ronald
  Mit Zitat antworten Zitat
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

AW: Schnittrahmen proportional - WM_SysCommand

  Alt 16. Jul 2013, 13:01
Hi,

Hatte da mal ein Problem mit Resize und musste das manuell erledigen. Für die Interresierten:

Messages fangen:
Im FormCreate:
Application.OnMessage := OnMessageHandlingHook; Wenn ein Klick auf den Rahmen erfolgt, dann lokalisieren auf welchen Teil und dann den gewünschten Resize Befehl abschicken. Konstanten sind in der Windows.pas zu finden.

Delphi-Quellcode:
procedure Tmainform.OnMessageHandlingHook(var Msg: TMsg; var Handled: Boolean);
var
Direction : Integer;
begin
Handled := False;
 if (MSG.message = 161) then begin //WM_NCLBUTTONDOWN = 161
    if (MSG.hwnd = Mainform.Handle) then begin
      if ((MSG.wParam = 8) or (MSG.wParam = 9) or (MSG.wParam = 20)) then
        Handled:=true
      else begin
        Direction := -1;
        case MSG.wParam of
          HTLEFT : Direction := WMSZ_LEFT;
          HTRIGHT : Direction := WMSZ_RIGHT;
          HTTOP : Direction := WMSZ_TOP;
          HTBOTTOM : Direction := WMSZ_BOTTOM;
          HTTOPLEFT : Direction := WMSZ_TOPLEFT;
          HTTOPRIGHT : Direction := WMSZ_TOPRIGHT;
          HTBOTTOMLEFT : Direction := WMSZ_BOTTOMLEFT;
          HTBOTTOMRIGHT : Direction := WMSZ_BOTTOMRIGHT;
        end;
        if Direction <> -1 then begin
          ReleaseCapture;
          DefWindowProc(mainform.Handle,WM_SYSCOMMAND,SC_SIZE+Direction,0);
          Handled:=true;
        end;
      end;
    end;
 end;
end;
Grüße!
Chris
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Schnittrahmen proportional - WM_SysCommand

  Alt 16. Jul 2013, 14:39
Ich habe mir mal erlaubt, den Code leicht zu modifizieren:
Delphi-Quellcode:
procedure TMainForm.OnMessageHandlingHook(var Msg: TMsg; var Handled: Boolean);
var
  Direction: Integer;
begin
  Handled := False;
  if (Msg.message = WM_NCLBUTTONDOWN) then
    if (Msg.hwnd = Handle) then
      begin
        if Msg.wParam in [HTMINBUTTON, HTMAXBUTTON, HTCLOSE] then
          Handled := true
        else
          begin
            Direction := -1;
            case Msg.wParam of
              HTLEFT:
                Direction := WMSZ_LEFT;
              HTRIGHT:
                Direction := WMSZ_RIGHT;
              HTTOP:
                Direction := WMSZ_TOP;
              HTBOTTOM:
                Direction := WMSZ_BOTTOM;
              HTTOPLEFT:
                Direction := WMSZ_TOPLEFT;
              HTTOPRIGHT:
                Direction := WMSZ_TOPRIGHT;
              HTBOTTOMLEFT:
                Direction := WMSZ_BOTTOMLEFT;
              HTBOTTOMRIGHT:
                Direction := WMSZ_BOTTOMRIGHT;
            end;
            if Direction <> -1 then
              begin
                ReleaseCapture;
                DefWindowProc(Handle, WM_SYSCOMMAND, SC_SIZE or Direction, 0);
                Handled := true;
              end;
          end;
      end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von roga
roga

Registriert seit: 15. Jun 2008
Ort: Sachsen-Anhalt
109 Beiträge
 
Delphi XE8 Professional
 
#5

AW: Schnittrahmen proportional - WM_SysCommand

  Alt 16. Jul 2013, 19:01
Danke für die Antworten! Wenn ich es richtig sehe, wird die Größenänderung über einen Eckpunkt des Markierungsrahmens trotzdem nicht proportional bleiben. Also doch selbst Hand anlegen. Ich brauche es für Bildschnitte im Seitenverhältnis 4x3 und 16x9, die man dann selber auswählen kann, indem man den Rahmen dort hinschiebt und beim Resizen immer das vorgebene Verhältnis erhalten bleibt. Wie bereits erwähnt, geht das jetzt per Scrollrad oder +/- Tasten viel besser - hätte ich auch gleich drauf kommen können
Ronald
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:50 Uhr.
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