Hi
Hier nun mal meine selbstgebastelte Methode eine Form so in der größe zu verändern wie Winamp es tut.
1. Problem .. TImage kann man nicht verwenden da dieses kein reales THandle besitzt.
Ka was man damit überhaupt machen kann..
eigentlich sinnlos das Teil.
Habe deshalb picFormResize mit einem Panel ersetzt nur mal so zum testen.
2. Der Code ist nicht so schön klein wie der ursprüngliche den ich verwenden wollte.
Damit kann man aber so wie ich festgestellt habe das Resitz verhalten ala Winamp nicht verwirklichen
wenn Skins auf der Oberfläsche sind.
Deshalb das neue hier.
Testen kann man das mit Gen_Bitmap hier im Forum einfach die Funktionen ersetzen.
Delphi-Quellcode:
Var
mRightStep : Integer = 25;
mHeightStep : Integer = 29;
mDrag : boolean;
procedure Tfrm_Gen.picFormResizeMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If ssLeft in Shift Then
mDrag := True
end;
procedure Tfrm_Gen.picFormResizeMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
Var
L : Integer; //Form links
T : Integer; //Form Top
W : Integer; //form weite
H : Integer; //Form Höhe
mPBRec : TRECT; //Record der PicBox
POINT : TPOINT; //Maus Position
begin
L := self.left;
T := self.top;
W := self.Width;
H := self.Height;
//MouseDown ereignis ausgelößt?
If mDrag = True Then
begin
//Aktuelle Position der PictureBox ermitteln
GetWindowRect(picFormResize.Handle, mPBRec);
//Aktuelle Cursor Position ermitteln
GetCursorPos(POINT);
//******* Form Schrittweise Diagonal nach unten rechts verschieben abhängig von der Cursor Position *******
If (POINT.x >= mPBRec.Right - 5) And (POINT.y >= mPBRec.Bottom - 5) Then
begin
self.left := L;
self.top := T;
self.Width := W + mRightStep;
self.Height := H + mHeightStep;
//Neue Position der PictureBox ermitteln. Alte wurde verändert
GetWindowRect(picFormResize.Handle, mPBRec);
//Cursor Position setzen auf die mitte der PicBox
//damit nicht die nächste abfrage ausgelößt wird
SetCursorPos(mPBRec.Left + ((mPBRec.Right - mPBRec.Left) div 2) - 3,
mPBRec.Top + ((mPBRec.Bottom - mPBRec.Top) div 2) - 3 );
//Raus hier
exit;
end;
//******* Form Schrittweise Diagonal nach oben links verschieben abhängig von der Cursor Position *******
If (POINT.x <= mPBRec.left) And (POINT.y <= mPBRec.top) Then
begin
//Standard weite erzwingen wenn Formweite unter 4125
If w < 275 Then
w := 275;
//Standard höhe erzwingen wenn Formhöhe unter 1740
If h < 116 Then
h := 116;
self.left := L;
self.top := T;
self.Width := W - mRightStep;
self.Height := H - mHeightStep;
//Neue Position der PictureBox ermitteln. Alte wurde verändert
GetWindowRect(picFormResize.Handle, mPBRec);
//Cursor Position setzen auf die mitte der PicBox
//damit nicht die nächste abfrage ausgelößt wird
SetCursorPos( mPBRec.left + ((mPBRec.Right - mPBRec.left) div 2) - 3,
mPBRec.Top + ((mPBRec.Bottom - mPBRec.Top) div 2) - 3);
//Raus hier
exit;
end;
//******* Form Schrittweise nach Rechts verschieben abhängig von der Cursor Position *******
If (POINT.x >= (mPBRec.left + (mPBRec.Right - mPBRec.left))) Then
begin
self.left := L;
self.top := T;
self.Width := W + mRightStep;
self.Height := H;
//Neue Position der PictureBox ermitteln. Alte wurde verändert
GetWindowRect(picFormResize.Handle, mPBRec);
//Cursor Position setzen auf die mitte der PicBox
//damit nicht die nächste abfrage ausgelößt wird
SetCursorPos( mPBRec.left + ((mPBRec.Right - mPBRec.left) div 2) - 3,
mPBRec.Top + ((mPBRec.Bottom - mPBRec.Top) div 2) - 3);
//******* Form Schrittweise nach Unten verschieben abhängig von der Cursor Position *******
end else
If (POINT.y >= (mPBRec.tOp + (mPBRec.Bottom - mPBRec.tOp))) Then
begin
self.left := L;
self.top := T;
self.Width := W;
self.Height := H + mHeightStep;
//Neue Position der PictureBox ermitteln. Alte wurde verändert
GetWindowRect(picFormResize.Handle, mPBRec);
//Cursor Position setzen auf die mitte der PicBox
//damit nicht die nächste abfrage ausgelößt wird
SetCursorPos(mPBRec.left + ((mPBRec.Right - mPBRec.left) div 2) - 3,
mPBRec.Top + ((mPBRec.Bottom - mPBRec.Top) div 2) - 3);
//******* Form Schrittweise nach Links verschieben abhängig von der Cursor Position *******
end else
If (POINT.x <= (mPBRec.Right + (mPBRec.left - mPBRec.Right) - 6)) Then
begin
//Standard weite erzwingen wenn Formweite unter 4125
If w < 275 Then
w := 275;
self.left := L;
self.top := T;
self.Width := W - mRightStep;
self.Height := H;
//Neue Position der PictureBox ermitteln. Alte wurde verändert
GetWindowRect(picFormResize.Handle, mPBRec);
//Cursor Position setzen auf die mitte der PicBox
//damit nicht die nächste abfrage ausgelößt wird
SetCursorPos(mPBRec.left + ((mPBRec.Right - mPBRec.left) div 2) - 3,
mPBRec.Top + ((mPBRec.Bottom - mPBRec.Top) div 2) - 3);
//******* Form Schrittweise nach Oben verschieben abhängig von der Cursor Position *******
end else
If (POINT.y <= (mPBRec.Bottom + (mPBRec.Top - mPBRec.Bottom)) - 6) Then
begin
//Standard höhe erzwingen wenn Formhöhe unter 1740
If h < 116 Then
h := 116;
self.left := L;
self.top := T;
self.Width := W ;
self.Height := H - mHeightStep;
//Neue Position der PictureBox ermitteln. Alte wurde verändert
GetWindowRect(picFormResize.Handle, mPBRec);
//Cursor Position setzen auf die mitte der PicBox
//damit nicht die nächste abfrage ausgelößt wird
SetCursorPos(mPBRec.left + ((mPBRec.Right - mPBRec.left) div 2) - 3,
mPBRec.Top + ((mPBRec.Bottom - mPBRec.Top) div 2) - 3);
end;
end;
end;
procedure Tfrm_Gen.picFormResizeMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If mDrag Then
mDrag := False;
end;
gruss Emil