IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Forme sans bordure et redimensionnable sous D7 et SEVEN 32 bits


Sujet :

Delphi

  1. #1
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut Forme sans bordure et redimensionnable sous D7 et SEVEN 32 bits
    Bonjour,

    Je déterre un vieux machin traité depuis longtemps.

    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, Classes, Controls, Forms;
     
     
    type
      TFMain = class(TForm)
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Déclarations privées }
      protected
        procedure CreateParams(var Params: TCreateParams); override;
      public
        { Déclarations publiques }
      end;
     
    var
      FMain: TFMain;
     
    implementation
     
    {$R *.dfm}
     
    procedure TFMain.CreateParams(var Params: TCreateParams);
    begin
      BorderStyle := bsNone;
      inherited CreateParams(Params);
      Params.ExStyle := Params.ExStyle or WS_EX_STATICEDGE;
      Params.Style := Params.Style or WS_SIZEBOX;
    end;
     
    procedure TFMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if ssRight in Shift then
        Close;
      ReleaseCapture;
      Perform(WM_SYSCOMMAND, $F012, 0);
    end;
     
    end.
    Tout va bien, pas de souci de compil, pas de bug

    la forme se déplace avec un clic de souris et je peux la redimensionner
    MAIS le hic
    les bordures de ma forme sont toujours là !

    si je retire le CreateParams, alors les bordures s'en vont.

    auriez-vous une solution à ce problème ?

    @bientôt

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Supprimer WS_EX_STATICEDGE ?

  3. #3
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut @AndNotOr
    ça marche pas..

    je pourrais utiliser un composant mais ça oblige à initialiser les actions avec des touches appuyées
    ce que je ne veux pas.

    et pourtant, il me semble que sous XP, ça marchait..

    c'était mieux avant..

    ?

    @+

  4. #4
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

    Pour une fenêtre sans bordure sous D7, je n'implémente pas de procédure CreateParams.
    Pour la déplacer : ton code MouseDown.
    Pour la redimensionner, je "récupère" l'événement WM_NCHITTEST.

    Voici un exemple de code (déplacement + dimensions) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    procedure WMNCHitTest(var msg: TWMNCHitTest); message WM_NCHITTEST;
     
    procedure TForm1.WMNCHitTest(var msg: TWMNCHittest);
    var
      pt: TPoint;
    begin
      inherited;
      pt:= ScreenToClient(Point(msg.XPos, msg.YPos));
      if PtInRect(Rect(0, 0, ClientWidth-4, 20), pt) then
        msg.Result:= HTCAPTION  // déplacement
      else if PtInRect(Rect(ClientWidth-4, 4, ClientWidth, ClientHeight-4), pt) then
        msg.Result:= HTRIGHT    // redimensionnement droit
      else if PtInRect(Rect(ClientWidth-4, ClientHeight -4, ClientWidth, ClientHeight), pt) then
        msg.Result:= HTBOTTOMRIGHT    // redimensionnement par droit-bas
      else if PtInRect(Rect(4, ClientHeight -4, ClientWidth - 4, ClientHeight), pt) then
        msg.Result:= HTBOTTOM;    // redimensionnement par le bas
    end;
    Cordialement
    Thierry

  5. #5
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut Suite..
    Bonjour,

    Ah oui le PtInRect..
    bravo ThWilliam !
    Excellent !

    merci

  6. #6
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut redimensionnement par les quatre bords et les quatre angles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    procedure TFMain.WMNCHitTest(var msg: TWMNCHittest);
    var
      pt: TPoint;
    begin
      inherited;
      pt := ScreenToClient(Point(msg.XPos, msg.YPos));
     
    {  if PtInRect(Rect(0, 0, ClientWidth - 4, 20), pt) then
        msg.Result := HTCAPTION // déplacement
      else    }
     
     
      if PtInRect(Rect(-4, -4, 4, 4), pt) then
        msg.Result := HTTOPLEFT // redimensionnement gauche-haut
      else
        if PtInRect(Rect(ClientWidth - 4, -4, ClientWidth, 4), pt) then
          msg.Result := HTTOPRIGHT // redimensionnement par droite-haut
        else
          if PtInRect(Rect(-4, 4, 4, ClientHeight - 4), pt) then
            msg.Result := HTLEFT // redimensionnement gauche
          else
            if PtInRect(Rect(-4, ClientHeight - 4, 4, ClientHeight), pt) then
              msg.Result := HTBOTTOMLEFT // redimensionnement par gauche-bas
            else
              if PtInRect(Rect(0, -4, ClientWidth, 4), pt) then
                msg.Result := HTTOP // redimensionnement par le haut
              else
                if PtInRect(Rect(ClientWidth - 4, 4, ClientWidth, ClientHeight - 4), pt) then
                  msg.Result := HTRIGHT // redimensionnement droit
                else
                  if PtInRect(Rect(ClientWidth - 4, ClientHeight - 4, ClientWidth, ClientHeight), pt) then
                    msg.Result := HTBOTTOMRIGHT // redimensionnement par droit-bas
                  else
                    if PtInRect(Rect(4, ClientHeight - 4, ClientWidth - 4, ClientHeight), pt) then
                      msg.Result := HTBOTTOM; // redimensionnement par le bas
    end;
     
    à noter que du fait du MouseDown, le HTCAPTION n'a plus d'intérêt, sauf si on veut limiter le déplacement en cliquant dans le haut..
     
    encore bravo pour cette piste !
     
    @bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aucun SystemMenu avec une Form sans bordure. Comment faire ?
    Par arnofly dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/06/2009, 15h11
  2. Déplacement d'une Form sans bordure ?
    Par arnofly dans le forum Windows Forms
    Réponses: 5
    Dernier message: 03/06/2009, 01h11
  3. Resize d'une form sans bordure
    Par Papy214 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/05/2008, 15h13
  4. Une Form sans bordure mais redimensionnable
    Par kanzarih dans le forum Débuter
    Réponses: 2
    Dernier message: 29/04/2008, 21h23
  5. Deplacement d'une Form sans bordures
    Par blondelle dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/11/2007, 22h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo