![]() |
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:
- Gibt es CommandCodes, die das Seitenverhältnis berücksichtigen, also ein proportionales Resizen?
Perform(WM_SysCommand, $F004, 0);
Beste Grüße von roga |
AW: Schnittrahmen proportional - WM_SysCommand
Hat sich erledigt: mache es nun per Scrollrad oder den Tasten +/- und das ist sogar eine bessere Lösung.
|
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:
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.
Application.OnMessage := OnMessageHandlingHook;
Delphi-Quellcode:
Grüße!
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; |
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; |
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 08:03 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