![]() |
WMNCHitTest ist tot seit Vcl.Styles benutzt wird
Delphi Rio 10.3.2
Hallo, seitdem ich auf Rio umgesattelt habe und Vcl.Styles benutze ist der HitTest komplett tot, kann mir jemand helfen das wieder in Gang zu bekommen?
Delphi-Quellcode:
Ich wollte erreichen das sich mein Formular per Maus bewegen läßt auch innerhalb der Form und nicht nur über deren Titelleiste.
private
procedure WMNCHitTest(var msg: TWMNCHitTest); message WM_NCHITTEST; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMNCHitTest(var msg: TWMNCHitTest); begin inherited; if msg.Result = htClient then msg.Result := htCaption; end; Bin über jeden Hinweis dankbar, nehme auch gerne workarounds an! Grüße! |
AW: WMNCHitTest ist tot seit Vcl.Styles benutzt wird
Ich habe 10.3 U2 (inkl. Patches) und auf meinem NB (Windows 10, Build 19013) klappt es.
|
AW: WMNCHitTest ist tot seit Vcl.Styles benutzt wird
Hallo,
klappt es auch mit Vcl.Styles? |
AW: WMNCHitTest ist tot seit Vcl.Styles benutzt wird
Zitat:
Zitat:
Zitat:
Ich setze den Style in der .dpr Datei global für alle Formulare, Formulare selbst haben keine seperaten Styles gesetzt. (Ich nutze "Jet" falls das weiterhilft) Der HitTest kommt gar nicht mehr an... |
AW: WMNCHitTest ist tot seit Vcl.Styles benutzt wird
Zitat:
Hab's verstanden wie ich es umzusetzen habe und gehe mal von einem Erfolg aus, werde dennoch morgen ein buggy dummy hochladen :-) |
AW: WMNCHitTest ist tot seit Vcl.Styles benutzt wird
Zitat:
Wie KodeZwerg schreibt wird WM_NCHITTEST via die beteiligten VCL Units nicht ans Form weitergeleitet. => WMNCHitTest wird nie aufgerufen. Lösung: Entweder passt du den VCL Code an oder aber (hier wohl besser/einfacher) du überschreibst WndProc des Formulars. Getestet mit D10.3.2 und Win10 19013. |
AW: WMNCHitTest ist tot seit Vcl.Styles benutzt wird
Da ich nicht genau weiß, wegen copyright von style "Jet", lade ich nicht das project hoch sondern zeige hier nur den code.
Vielen Dank an Frühlingsrolle, Du hast mir den Weg gezeigt wie man es lösen könnte!
Delphi-Quellcode:
program Project1;
{$IFNDEF MSWindows} {$MESSAGE ERROR 'This application is made for Windows only!'} {$ENDIF MSWindows} uses Vcl.Forms, Unit1 in 'Unit1.pas' {Form1}, Vcl.Themes, Vcl.Styles; {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; TStyleManager.TrySetStyle('Jet'); Application.CreateForm(TForm1, Form1); Application.Run; end.
Delphi-Quellcode:
Thema für mich erfolgreich abgeschlossen, Danke allen!
unit Unit1;
{$IFNDEF MSWindows} {$MESSAGE ERROR 'This unit is made for Windows only!'} {$ENDIF MSWindows} interface uses Winapi.Windows, Winapi.Messages, System.Classes, Vcl.Forms, Vcl.Controls, Vcl.StdCtrls, Vcl.ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; CheckBox1: TCheckBox; procedure CheckBox1Click(Sender: TObject); private procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest; procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); public end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest); begin inherited; Self.Caption := 'WMNCHitTest aktiv!'; // diese Zeile dient nur zum Beweis ob man sich in dieser prozedur befindet. Panel1.Visible := False; // dies kann man testen indem man die Zeile "TStyleManager.TrySetStyle('Jet');" aus der Project1.dpr auskommentiert. if ((ControlAtPos(ScreenToClient(Msg.Pos), True, True, True) = nil) and (Msg.Result = htClient)) then Msg.Result := htCaption; end; procedure TForm1.CheckBox1Click(Sender: TObject); begin if (Sender as TCheckBox).Checked then Self.OnMouseDown := FormMouseDown else Self.OnMouseDown := nil; Panel1.SetFocus; // damit die CheckBox-Caption-Umrahmung verschwindet wenn man Vcl.Style aktiviert hat. end; // fix von Zarko Gajic mit Verbesserung von Frühlingsrolle procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ReleaseCapture; // SendMessage(Self.Handle, WM_SYSCOMMAND, SC_MOVE or HTCAPTION, 0); // original von Herrn Gajic // (Sender as TControl).Perform(WM_SYSCOMMAND, SC_MOVE or HTCAPTION, 0); // original von Frühlingsrolle Self.Perform(WM_SYSCOMMAND, SC_MOVE or HTCAPTION, 0); // so würde ich es nun nutzen, da ein TControl.Perform wahrscheinlich die komponente anstelle des formulars verschiebt. // SetCapture(Self.Handle); // ich bin mir nicht sicher ob man es setzen sollte/muss...? end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 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