Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Schnittrahmen proportional - WM_SysCommand (https://www.delphipraxis.net/175761-schnittrahmen-proportional-wm_syscommand.html)

roga 16. Jul 2013 08:20

Schnittrahmen proportional - WM_SysCommand
 
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
Delphi-Quellcode:
Perform(WM_SysCommand, $F004, 0);
- Gibt es CommandCodes, die das Seitenverhältnis berücksichtigen, also ein proportionales Resizen?

Beste Grüße von roga

roga 16. Jul 2013 11:33

AW: Schnittrahmen proportional - WM_SysCommand
 
Hat sich erledigt: mache es nun per Scrollrad oder den Tasten +/- und das ist sogar eine bessere Lösung.

Photoner 16. Jul 2013 13:01

AW: Schnittrahmen proportional - WM_SysCommand
 
Hi,

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

Messages fangen:
Im FormCreate:
Delphi-Quellcode:
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!

DeddyH 16. Jul 2013 14:39

AW: Schnittrahmen proportional - WM_SysCommand
 
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;

roga 16. Jul 2013 19:01

AW: Schnittrahmen proportional - WM_SysCommand
 
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 :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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