Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#8

Re: Control mit handle

  Alt 9. Apr 2008, 17:39
Das ist meine Funktion welche den Skin stepweise vergrößert oder verkleinert.

Delphi-Quellcode:
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);

        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 );
            exit;
          end;

        If (POINT.x <= mPBRec.left) And (POINT.y <= mPBRec.top) Then
          begin
            //Standart weite erzwingen wenn Formweite unter 4125
            If w < 275 Then
                w := 275;
            
            //Standart 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);
          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
            //Standart 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
            //Standart 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;
wenn ich nun ein normales Image nehme und Image.canvas.handle anstelle von picFormResize.Handle(=TPanel) nehme funktioniert das ganze mit der größenänderung nicht mehr.
Was ist anders an canvas.handle gegenüber TPanel.handle.

Gibt es eine möglichkeit das trotzdem noch auf diese art zu händeln ?

Die Maus wird innerhalb vom Record TPanel gehalten mit SetCursorPos damit beim verschieben diese
nicht irgendwo auf dem Desktop langschliert.

gruss Emil
  Mit Zitat antworten Zitat