Möglich ist alles. Die Farbe und Größe kannst du nur global über die Bildschirmeinstellungen ändern. Das ist aber sicherlich nicht dein Ziel.
Die andere Möglichkeit mit der eigenen Titelleiste ist da schon besser.
Hier mal ein kleiner Code:
Delphi-Quellcode:
TForm1 =
class(TForm)
PanelFormMover: TPanel;
...
{ Private-Deklarationen }
FMoveStartPos: TPoint;
FFormMoving: Boolean;
end;
...
procedure TForm1.PanelFormMoverMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft
then
begin
FFormMoving := True;
FMoveStartPos := Point(X, Y);
end;
end;
procedure TForm1.PanelFormMoverMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if FFormMoving
then
SetWindowPos(
Handle, 0,
Left + (X - FMoveStartPos.X),
Top + (Y - FMoveStartPos.Y),
0, 0, SWP_NOSIZE
or SWP_NOZORDER);
end;
procedure TForm1.PanelFormMoverMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft
then
FFormMoving := False;
end;
Das Panel
PanelFormMover kannst du an jeder beliebigen Stelle des Formulars setzen. Du kannst anstatt eines Panels auch jede andere Komponente verwenden, die die Ereignisse OnMouseDown, OnMouseMove und OnMouseUp unterstützt.
Die Lösung über die Botschaft WM_NCHITTEST funktioniert nicht im Zusammenhang mit Controls, die das Verschieben möglich machen sollen, da WM_NCHITTEST nur gesendet wird, wenn der Mousecursor
direkt über dem Formular ist, und das ist er bei einer darauf liegenden Komponente eben nicht.