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

Lazarus Pascal Discussion :

Redimensionner et centrer une image sur un TPanel avec BGRABitmap [Lazarus]


Sujet :

Lazarus Pascal

  1. #21
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Bonsoir,

    Citation Envoyé par Jipété Voir le message
    Félicitations à vous deux, c'est un plaisir d'attraper le grip en bas à droite de la fiche et de le déplacer dans tous les sens, avec l'image et ses dimensions qui suivent sans broncher !
    J'ai oublié un truc : je vois bien dans le code ultra-court (dans le zip de Roland) les calculs pour adapter l'image aux dimensions de son container, ok.

    Mais qui ou quoi appelle la procedure TForm1.Panel1Paint(Sender: TObject); pour faire le boulot ?

    Car je ne vois nulle part de procedure TForm1.OnResize(Sender: TObject); ou procedure TForm1.Panel1OnResize(Sender: TObject);
    Est-ce que le fait de redimensionner le Panel1 appellerait son (Re)Paint sans qu'on le sache ?

    Merci de vos lumières.

    EDIT : bon, ben la lumière a jailli ici, avec l'idée de faire un test s'appuyant sur un point d'arrêt :
    Nom : panel-resize-et-breakpoint.png
Affichages : 111
Taille : 151,8 Ko

    et, oui, redimensionner fait passer par repaint.
    Bien bien

  2. #22
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 477
    Points : 4 676
    Points
    4 676
    Par défaut
    Bonjour Jipété,

    Citation Envoyé par Jipété Voir le message
    ...Mais qui ou quoi appelle la procedure TForm1.Panel1Paint(Sender: TObject); pour faire le boulot ? Car je ne vois nulle part de procedure TForm1.OnResize(Sender: TObject); ou procedure TForm1.Panel1OnResize(Sender: TObject);
    Est-ce que le fait de redimensionner le Panel1 appellerait son (Re)Paint sans qu'on le sache ?
    ...
    Le Repaint est appelé par le système dès qu'il y a besoin de rafraichir la zone concernée. Un déplacement, un redimensionnement, un démasquage par une fenêtre qui recouvrait une partie de la zone, une sortie du mode minimize etc. Cela passe par des messages que le système envoie à l'application qui le diffuse à qui de droit avec un empilement d'éventuels repaint des zones sous la zone cible. Tout cela ne se voit pas grâce au double buffered qui permet de n'afficher que le résultat final.

    A cause de cette chaîne de transmissions, ces traitements ne sont pas immédiats et dépendent de la disponibilité de l'OS et de l'application. Par exemple, un calcul prolongé sans interaction peut bloquer ces actualisations (d'où le recours à quelque ProcessMessages ou placer le traitement bloquant dans un autre thread).

    L'application elle-même peut, avec invalidate et invalidaterect, utiliser cette mécanique qui passe par le système. Cela peut avoir un intérêt, car le système peut réduire une foule de requêtes à une seule. En général pourtant au sein d'une application on utilise repaint (ou refresh qui ne fait qu'appeler repaint) pour provoquer une actualisation immédiate et limitée à la seule zone (en théorie car une zone avec des parties transparentes sollicitera celle d'en dessous).

    Donc tout se passe à l'insu de ton plein gré

    Salut

  3. #23
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Salut les copains,
    Citation Envoyé par Guesset Voir le message
    Donc tout se passe à l'insu de ton plein gré
    Oh tu sais, avec moi rien n'est jamais simple et, c'est bien connu, les règles sont faites pour ne pas être respectées,

    En ce qui concerne mon petit projet en construction, la récente manip pour le redimensionnement fonctionne impeccablement, mais j'ai un gag ailleurs, à l'utilisation d'un RadioGroup qui me permet de choisir une image parmi 3 plus un fond vide et qui m'oblige à des trucs tarabiscotés qui me font parfois hurler face à l'écran :
    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
    procedure TForm1.rdgOrientationClick(Sender: TObject);
      procedure FondBlanc;
      begin
        pnl4img.Canvas.Pen.Color   := clWhite;
        pnl4img.Canvas.Brush.Color := clWhite;
        pnl4img.Canvas.Rectangle(0,0,pnl4img.ClientWidth,pnl4img.ClientHeight);
      end;
    begin
      // effacer l'image précédente, if any
      FondBlanc; // mandatory sinon les images s'empilent
     
      case rdgOrientation.ItemIndex of
        0: imgSRC := TBGRABitmap.Create('image.png'); // horizontale
        1: imgSRC := TBGRABitmap.Create('Penguins-384x384.png'); // carrée 
        2: imgSRC := TBGRABitmap.Create('Penguins-256x384.png'); // verticale
        3: begin imgSRC.EraseRect(0,0,pnl4img.Width,pnl4img.Height,255); // fond blanc
             SomeText0 := ''; stb.Panels[0].Text := SomeText0; // texte d'info dans le StatusBar
             exit; // pour éviter le pnl4imgPaint
           end;
      end;
     
      pnl4imgPaint(nil); // obligatoire, sinon aucun changement d'image n'est pris en compte
    end;
    Bonne soirée,

  4. #24
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 477
    Points : 4 676
    Points
    4 676
    Par défaut
    Bonjour,

    Si c'est la nécessité du pnl4imgPaint (ou plus classiquement pnl4img.Repaint) qui inquiète c'est parce que les modifications ne se voient que lors du prochain repaint. Au lieu de provoquer ce rafraichissement par code, il y a l'alternative Orangina qui consiste à secouer l'application mais on s'en lasse

    Il y a aussi la possibilité de piéger la modification du bitmap et de lui faire provoquer le repaint. Il faut cependant remarquer que cela risque de multiplier à outrance ces rafraichissements.

    Salutations

  5. #25
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 9
    Points
    9
    Par défaut
    Salut Jipete, salut Roland.

    A propos d'arrondir, un bon condensé ici: https://github.com/bgrabitmap/bgrabitmap/issues/238

    Fre;D

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. LEVAN : le système informatique en mesure d’apprendre tout sur n’importe quoi
    Par Arsene Newman dans le forum Intelligence artificielle
    Réponses: 10
    Dernier message: 03/06/2014, 13h20
  2. Ajouter 'TER222' devant un nombre dans toute une colonne
    Par TheTcha dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 08/01/2013, 13h50
  3. [CodeLite] Compile tout et n'importe quoi !
    Par hornon dans le forum Autres EDI
    Réponses: 0
    Dernier message: 11/06/2009, 00h02

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