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

Vos contributions VB6 Discussion :

Rendre visible des contrôles sur un Form ayant des zones transparentes


Sujet :

Vos contributions VB6

  1. #1
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 092
    Points : 16 606
    Points
    16 606
    Par défaut Rendre visible des contrôles sur un Form ayant des zones transparentes
    Depuis que avigeilpro nous a fournit ce code super interessant, je fais souvent des Forms non standards.

    Mon problème, rendre des contrôles visible pour un Form non carré ou rectangulaire sans avoir a redessiner l’image de base, si au cours de la construction du projet on ajoute, déplace et/ou redimensionne un contrôle.
    L’astuce consiste donc a dessiner des boites de couleurs (autre que la couleur transparente) a chaque démarrage du programme, même si les contrôles sont en dehors de l’image de base.
    Par contre il ne faut dessiner ces boites que pour les contrôles désirés, d’où le renseignement inscrit dans la propriété Tag = OUI du contrôle.
    On retrouvera dans le code la façon de déplacer un Form sans barre de titre, une utilisation possible de la propriété Zorder (clin d’œil).
    APIs utilisées
    -pour réaliser la Form
    CreateRectRgn, CombineRgn, DeleteObject, SetWindowRgn et GetPixel
    -pour le déplacement
    ReleaseCapture et SendMessage

    FormZonesTransp.zip
    (51.3Ko)

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    Un petit ennui : on peut cliquer au travers de la Form, y compris là où elle a sa place "normale", ce qui peut être gênant.
    Je sais, je sais...
    Bon. Une autre méthode existe pour avoir une Form "transparente" mais réellement présente, tout en conservant parfaitement opaques les contrôles qu'elle contient.
    Il suffit pour celà des fonctions SetWindowLong et SetWindowPos de la librairie User32. C'est toutefois un peu "trompeur" car il s'agit en réalité d'une fausse transparence et que certaines choses doivent alors être répétées en cas de déplacement ou modification des dimensions de la fenêtre (mais cela va très vite.
    Idem en ce qui concerne le traitement de Frames transparents mais gardant leurs contrôles opaques
    Mais tout dépend bien évidemment du résultat que l'on veut atteindre

    Bonne continuation ...

  3. #3
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 092
    Points : 16 606
    Points
    16 606
    Par défaut
    Citation Envoyé par ucfoutu
    Un petit ennui : on peut cliquer au travers de la Form, y compris là où elle a sa place "normale", ce qui peut être gênant.
    Personnellement, c'est ce que je voulais, il y a très souvent plusieurs façons d’y parvenir, avec des variations suivant la finalité voulue.
    En général, pour le programme fini, je lance le projet, puis je fais une image de la fenêtre définitive sur fond uni (un bloc note plein écran), je remplace l’image de construction avec, supprime la routine de dessin des boites pour les contrôles qui étaient dans des zones transparents et je crée l’exécutable.

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Tant pis si deuxième édition, j'ai eu plantage de IE
    Bravo ProgElect, source très instructive et impecable. et en plus direct sur Vista
    Comme d'habitude je mémorise ta source sur mon PC
    ucfoutu, tu changerras jamais ? la critique est aisée mais la construction est beaucoups plus difficile
    pourquoi qu'avec toutes tes "connaissances" tu ne nous aident pas a évolués ?
    Cordialement
    Edit: ont peu cliquer sur la partie "visible" où ont veut et elle réagit parfaitement. Ce qui est, je crois, le but premier.

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    Je crois qu'il y a là un sacré malentendu !
    Je ne critiquerais pas (et pour cause ...) les éléments fondamentaux du code montré par Progelect .

    Je voulais simplement appeler l'attention dur certains aspects (appelons-les "colatéraux") de certaines transparences. Les transparences sont, en gros, réparties en deux catégories :
    - celles où un click "sur" la transparence clique "à travers"
    - celles où un click sur la transparence reste un click dans la fenêtre de l'application.

    Voilà tout.

    Quant à la 2ème possibilité, j'ai signalé les deux fonctions à utiliser, non ?

    Amitiés.

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Je ne reprendrais pas ta réponse mais ce que je constate c'est que ta mauvaise fois est toujours intacte, le fais de cliquer "juste à coter" de la forme visible active l'appli qui est juste là dessous.
    et pour ProgElect... enlève-moi ce combo qui est Ch...t
    Contrairement à mon habitude, J'ai pas encore étudier la source...(excuse-moi)
    A+
    EDIT:
    - celles où un click "sur" la transparence clique "à travers"
    - celles où un click sur la transparence reste un click dans la fenêtre de l'application.
    Tu te mélange les pinceaux....

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bon...

    Je fais vite une petite démonstration de ce que je veux dire par click sur une Form transparente mais dont les contrôles restent opaques, tout en faisant que le click ne se fasse pas sur ce qui est "derrière".... mais bien sur la Form ...
    et reviens...

    A + donc...

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Voilà donc un tout petit zip mettant en exergue le principe dont il s'agit....

    J'y ai mis un timer pour passer la form d'un état "transparent" en état opaque et vice-versa
    Le bouton de commande n'est là que pour montrer que les contrôles contenus dans la forme restent eux totalement opaques (j'aurais pu choisir n'importe quoi d'autre).

    Lancer... cliquer sur la forme dans l'un ou l'autre de ses deux états et voir si oui on non on clique bien sur la form et pas au travers (sur ce qu'il y aurait derrière).

    J'ai un peu bâclé, mais celà me parait quand même suffisant.
    Fichiers attachés Fichiers attachés

  9. #9
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 092
    Points : 16 606
    Points
    16 606
    Par défaut
    Citation Envoyé par LeForestier
    pour ProgElect... enlève-moi ce combo qui est Ch...t
    Mais il est la pour être déplacé, pour la démonstration de l'utilité du code, par le programmeur dans l'éditeur VB, dans une zone de couleurs déclarée a rendre transparente,
    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
    'le/les controles dont le Tag = "OUI"
    'doit être visible même si en dehors de l'image de base
    For Each CntrL In Me.Controls
     If CntrL.Tag = "OUI" Then
      'redimensionne la Form eventuellement si ce controle dépace l'image de base
      'calcul du bas et de l'extrémité droite du controle
      If Hauteur < CntrL.Top + CntrL.Height Then Hauteur = CntrL.Top + CntrL.Height
      If Largeur < CntrL.Left + CntrL.Width Then Largeur = CntrL.Left + CntrL.Width
      'verification si la Form est suffisament grande, sinon agrandit
      If Hauteur > Me.ScaleHeight Then Me.Height = ScaleY(Hauteur, 3, 1) + 15 '? 15 pas trouvé pourquoi ?
      If Largeur > Me.ScaleWidth Then Me.Width = ScaleX(Largeur, 3, 1)
      DoEvents
      'creation du masque d'opacité
      Me.Line (CntrL.Left, CntrL.Top)- _
            (CntrL.Left + CntrL.Width - 1, CntrL.Top + CntrL.Height - 1), 0, BF
     End If
    Next
    seule partie du code légèrement nouvelle et que je pensai utiles de partager.
    Si (LeForestier) tu y met un CommandButton, un ListBox, un PictureBox ..... sa ne me gène pas
    Pour le reste, tout programmeur professionnel ou amateur (plus ou moins éclairé ) est une bête susceptible

Discussions similaires

  1. Rendre visible un contrôle variable
    Par Mors_Ubyte dans le forum Access
    Réponses: 3
    Dernier message: 20/06/2006, 22h00
  2. Réponses: 1
    Dernier message: 11/05/2006, 16h23
  3. Réponses: 13
    Dernier message: 09/05/2006, 16h30
  4. Détection des événements sur un form
    Par Jik70 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 28/04/2006, 12h49
  5. Réponses: 11
    Dernier message: 13/04/2006, 15h18

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