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

C++Builder Discussion :

TImage en premier plan


Sujet :

C++Builder

  1. #1
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut TImage en premier plan
    Bonjour,
    Comment faire pour mettre une image en premier plan?

    Je m'explique, j'essaie de simuler un écran (à pixel) dans un appareil. J'ai une image et un StringGrid pour l'écran. Le hic c'est que l'écran est censé aller sous la photo pour être le plus représentatif.

    Quand j'essaie les méthodes "Bring to front" et "Send to back" en construction et en run, mais l'image reste toujours en fond!

    Si quelqun connait une méthode pour mettre l'image en premier plan, je suis tout ouïe!

    Merci

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut bandit boy
    Si j'ai bien compris, tu a une TForm, sur cette TForm tu a pose un TStringGrid, sur ce StringGrid tu pose unTImage, et tu a ton TImage transparent pour visualiser le TStringGrid et tu va ecrire sur le TImage

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Tu prends un TPanel et tu places ton TImage dessus !
    Accessoirement, tu peux fixer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Image1->Align = alClient;
    Image1->Stretch = true;
    Je me suis donc amusé à faire (via un popupmenu) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void __fastcall TForm1::Front1Click(TObject *Sender)
    {
    Panel1->BringToFront();
    }
     
    void __fastcall TForm1::Back1Click(TObject *Sender)
    {
    Panel1->SendToBack();
    }
    A plus !

  4. #4
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Bonjour messieurs,

    Blondelle, t'es sur la voie J'ai bien une TForm, sur laquelle j'ai mon StringGrid, et par dessus (en plus large que la grille) j'ai une image avec une partie transparente à travers laquelle on voit la grille. Le but est de considérer la grille comme un écran matricielle (une case = un pixel), donc je vais écrire dans la StringGrid.

    henderson, j'ai essayé de faire le bout de code que tu as posté. Ca fonctionne bien, sauf que je perds l'avantage de la transparence, vu que je vois le fond du TPanel à la place de ma StringGrid à travers mon image. Il n'existe pas une méthode pour le rendre transparent lui aussi ?

    Dans les deux cas, merci pour votre aide messieurs.

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    Tu peux dessiner ton image directement sur le fond de ton Form, en utilisant l'événement OnPaint du TForm:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm32::FormPaint(TObject *Sender)
    {
      // vImg1 est un TImage masqué (Visible=false)
      Canvas->Draw(0, 0, vImg1->Picture->Graphic);
    }

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut bandit boy
    Est ce que tu touche pas a ton image ?
    Est ce que ton image doit etre imperativement au dessus du StringGrid ?

  7. #7
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    totoche76, l'idée est bonne mais j'avais déjà essayé et on se retrouve avec 2 problèmes: la proportion (due au Strech de l'image) et le fait que encore une fois la grille se retrouve au dessus.

    Sinon blondelle, l'image n'est jamais modifiée et oui elle doit impérativement être au dessus. En fait, c'est pour simuler un écran LCD (StringGrid) dans une partie mécanique (TImage). Cette partie mécanique reste toujours au dessus de l'écran et possède une vitre (partie transparente du TImage) à travers laquelle on voit le LCD.
    Pourquoi une telle précision, tu as une idée?

  8. #8
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    J'ai fais un teste vite fait et c'est tres difficile d'avoir l'image au premier plan d'ou ma question, je sais que l'on peut tapisser un StringGrid complet avec une Image, on voit l'image, on voie la grille et on peut ecrire dans le StringGrid

  9. #9
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Bon, j'ai repris des idées d'un peu tout le monde avec l'aide d'un collègue et on a fait du bricolage.

    On a 2 TForm. L'une en premier plan avec un TPanel, dans laquelle se trouve l'image avec une couleur de fond du panel propre. Cette Form a ses propriétés transparent à true, et transparentcolor à la couleur du panel.
    La seconde Form contient la StringGrid, et se "cache" toujours derrière la première. Avec la Proriété Enable à false, elle ne repasse jamais devant.

    En conclusion, la Première Form contient l'image et la seconde la grille reste toujours dans le même ordre de présentation (ordre, taille, position).

    Par contre, il faut gérer la proportion de l'image, ainsi que le placement de la grille en fonction de l'image ...

    Sinon ce sujet est résolu.
    Merci beaucoup messieurs pour ces idées !

  10. #10
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    Je viens d'essayer un truc, pour reprendre l'idée de Henderson de mettre un TPanel au dessus du TStringGrid, mais en rendant le TPanel transparent:
    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
    class TMyPanel: public TPanel
    {
    public:
      virtual void __fastcall CreateParams(TCreateParams &Params)
      {
      TPanel::CreateParams(Params);
      if (!ComponentState.Contains(csDesigning))
        Params.ExStyle =Params.ExStyle | WS_EX_TRANSPARENT;
      }
     
      __fastcall TMyPanel(TComponent* Owner) : TPanel(Owner)
      {
      //Brush->Style = bsClear;
      }
     
      virtual void __fastcall Paint(void)
      {
      return;
      }
     
    };
    Dans le constructeur de ton TForm:
    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
    __fastcall TForm32::TForm32(TComponent* Owner)
      : TForm(Owner)
    {
    pnl = new TMyPanel (this);
    pnl->Parent = this;
    pnl->Left = vGrd1->Left;
    pnl->Top = vGrd1->Top;
    pnl->Height = vGrd1->Height;
    pnl->Width = vGrd1->Width;
    pnl->Visible = true;
     
    vImg1->Parent = pnl;
    vImg1->Left = 0;
    vImg1->Top = 0;
    vImg1->Visible = true;
    vImg1->Transparent = true;

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Sinon il existe aussi la possibilité de combiner des régions.

    Voici un exemple avec un TPanel sur lequel j'ai posé un TImage.
    L'idée ici, étant de créer une lucarne...
    Pour le test (j'ai BCB3 Pro ...), au niveau du TImage j'ai fixé :
    -Align sur alClient
    -Stretch sur true

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    HRGN R1;
    HRGN R2;
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    R1 = CreateRectRgn(0,0, Panel1->Width, Panel1->Height);
    R2 = CreateRectRgn(50,50, Panel1->Width-50, Panel1->Height-50);
    CombineRgn(R1,R1,R2, RGN_XOR);
    SetWindowRgn(Panel1->Handle, R1, true);
    }
    Donc de ton coté, il faudrait localiser l'ouverture pour le LCD dans l'image et affecter les bons paramètres pour R2.

    A plus !

  12. #12
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Encore plus propre et plus simple.
    Par contre, henderson ta solution fonctionne mais il faut que la fenêtre soit rectangulaire, s'il y a des courbes ca ne fonctionne pas, non?

    Merci beaucoup messieurs

  13. #13
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    En fait, il y a plusieurs découpes possibles, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    R2 = CreateEllipticRgn(50,50, Panel1->Width-50, Panel1->Height-50);
    On peut même utiliser :

    CreateRoundRectRgn
    CreatePolygonRgn
    ...
    En principe on devrait pouvoir combiner autant qu'il est nécessaire !

    Voir l'aide MS (Regions) !

    Le problème est quand même de bien ajuster !

    A plus !

  14. #14
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    Pour créer une région à partir d'un Bitmap:
    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
    HRGN CreateRegionFromBitmap(Graphics::TBitmap* pBitmapSource, TColor couleurTransparente)
    {
      HRGN pBitmapRGN = CreateRectRgn(0,0,0,0);
      HRGN tmpRGN;
     
      int largeurBitmap = pBitmapSource->Width;
      int hauteurBitmap = pBitmapSource->Height;
      int x, largeur;
     
      for (int y = 0; y<largeurBitmap; y++)
        {
        x = 0;
        largeur = 0;
        while (x < hauteurBitmap)
          {
          if (pBitmapSource->Canvas->Pixels[y][x] != couleurTransparente)
            largeur++;
          else
            if (largeur != 0)
              {
              tmpRGN = CreateRectRgn(x - largeur, y, x, y + 1);
              CombineRgn(pBitmapRGN, pBitmapRGN, tmpRGN, RGN_OR);
              DeleteObject(tmpRGN);
              largeur = 0;
              }
          x++;
          }
        if (largeur != 0)
          {
          tmpRGN = CreateRectRgn(x - largeur, y, x, y + 1);
          CombineRgn(pBitmapRGN, pBitmapRGN, tmpRGN, RGN_OR);
          DeleteObject(tmpRGN);
          }
        }
      return pBitmapRGN;
    }
    Pour l'utiliser (on enlève de la fenêtre toutes les parties en blanc sur l'image):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HRGN reg = CreateRegionFromBitmap(Image1->Picture->Bitmap, clWhite);
    SetWindowRgn(Handle, reg, true);

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

Discussions similaires

  1. [VB6]Form en premier plan
    Par VeNus2 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 30/04/2004, 12h05
  2. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  3. Réponses: 2
    Dernier message: 14/03/2004, 22h04
  4. Premier plan sur un dialog
    Par |PaRa-BoL dans le forum MFC
    Réponses: 5
    Dernier message: 04/03/2004, 12h52
  5. forcer une fenetre à etre au premier plan jusqu'a ...
    Par peppena dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 22/12/2003, 16h14

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