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

VB.NET Discussion :

Adapter les objets dans la Forme à la transparence Aero Vista/7


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 106
    Par défaut Adapter les objets dans la Forme à la transparence Aero Vista/7
    Bonjour,

    j'ai commencé à écrire un programme qui intègre la transparence Aero. Le problème, c'est que les objets dans ma forme (à part les picturebox et les progressbar) s'intègre mal à la transparence.

    Le texte en noir devient illisible et transparent et si je met le texte en blanc, il ne ressort pas très bien.

    Un tutoriel explique comment arranger ce problème mais il est en anglais et le code est en C++ (ou C#) et pas en VB.NET.
    Le voici pour les intéressés: http://www.codeproject.com/KB/vista/...px?msg=2876851

    J'aimerais donc que, comme sur ce tutoriel, une form comme ça:



    deviennent comme ça:




    Voici le code pour la transparence que j'utilise en ce moment:

    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
    Imports System.Runtime.InteropServices
     
    Public Class Form1
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            Try
                Dim margins As MARGINS = New MARGINS
                margins.cxLeftWidth = -1
                margins.cxRightWidth = -1
                margins.cyTopHeight = -1
                margins.cyButtomheight = -1
                'mettre toutes les valeurs à -1 pour la transparence de la fenêtre en entier
                Dim hwnd As IntPtr = Me.Handle
                Dim result As Integer = DwmExtendFrameIntoClientArea(hwnd, margins)
     
     
     
     
            Catch ex As Exception
     
            End Try
        End Sub
     
     
     
     
    #Region " Effet de transparence sous vista "
        <StructLayout(LayoutKind.Sequential)> _
        Public Structure MARGINS
            Public cxLeftWidth As Integer
            Public cxRightWidth As Integer
            Public cyTopHeight As Integer
            Public cyButtomheight As Integer
        End Structure
     
        <DllImport("dwmapi.dll")> _
        Public Shared Function DwmExtendFrameIntoClientArea(ByVal hWnd As IntPtr, ByRef pMarinset As MARGINS) As Integer
        End Function
     
        'Le reste est dans form_load
    #End Region
     
     
     
    End Class
    (N'oubliez pas de mettre la couleur de fond à Noir.)



    Si quelqu'un a une idée ou sait comment arranger ce problème, envoyez-moi une réponse ou le code.

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    J'ai fait le test chez moi, je constate le même problème... Je sais pas trop ce qu'a fait le gars sur codeproject pour que ça marche bien, mais ça a l'air compliqué et j'ai pas le courage de me plonger dans un long code C++ . De toutes façons, je doute que ça puisse s'appliquer facilement en Windows Forms...

    J'ai testé une solution qui donne des résultats à peu près corrects : mettre la TransparencyKey de la Form à une couleur que tu n'utilises pas ailleurs, et mettre la même couleur comme BackColor. Par contre, ça a un gros inconvénient : le fond de la Form devient transparent (on voit l'effet de verre Aero, mais quand on clique dessus la souris "traverse" et clique sur ce qui est derrière).

    En cherchant "aero windows forms" sur google, on trouve pas mal de choses, qui seront sans doute plus facile à appliquer que le truc que tu as trouvé sur CodeProject... Par contre la plupart n'étendent pas le verre sur toute la form mais seulement sur une partie, et mettent les contrôles sur une partie où il n'y a pas de verre

    A noter qu'il est beaucoup plus facile de faire ce genre de choses en WPF qu'en Windows Forms, car WPF ne repose pas sur GDI+ et gère correctement la transparence. La seule "difficulté" est l'interop Win32 car on n'a pas directement accès au handle de la fenêtre, mais ça reste relativement simple. La librairie Dvp.NET contient d'ailleurs une classe qui permet d'activer l'effet Glass directement en XAML :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <Window ...
            xmlns:dvp="http://www.developpez.com/xaml"
            dvp:DwmUtil.EnableBlur="True"
            dvp:DwmUtil.GlassFrameMargins="0,35,0,0">

  3. #3
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Par contre la plupart n'étendent pas le verre sur toute la form mais seulement sur une partie, et mettent les contrôles sur une partie où il n'y a pas de verre
    C'est en général le comportement adopté. Trop de transparence tue la transparence.

    Pour écrire sur de la transparence tu peux utiliser la technique décrite ici:
    http://badger.developpez.com/tutorie...ass-vista/#LVI
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 106
    Par défaut
    Merci tomlev et The_badger_man de m'avoir répondu.

    Citation Envoyé par tomlev Voir le message
    J'ai testé une solution qui donne des résultats à peu près corrects : mettre la TransparencyKey de la Form à une couleur que tu n'utilises pas ailleurs, et mettre la même couleur comme BackColor.
    J'ai essayé la TransparencyKey. Les boutons marche bien dessus mais ce n'est pas la même chose avec les Labels et les PictureBox; les labels deviennent illisible et les images dans les picturebox perde un peu de leur transparence sur la form.


    -----------------------
    J'ai trouvé une méthode pour mettre le texte en noir (n'a pas un très bon rendu) et afficher correctement des boutons sur la Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Button1.UseCompatibleTextRendering = True
                Label1.UseCompatibleTextRendering = True
    Par contre, je croix que ça ne marche qu'avec un simple label ou un bouton. J'aimerais être capable d'en faire autant avec un MenuStrip .
    -----------------------


    Citation Envoyé par The_badger_man Voir le message
    Pour écrire sur de la transparence tu peux utiliser la technique décrite ici:
    http://badger.developpez.com/tutorie...ass-vista/#LVI
    Ça marche à la perfection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Dim g As Graphics = Me.CreateGraphics()
            Dim blackfont As New GraphicsPath()
            Dim brsh As New SolidBrush(Color.Black)
     
            blackfont.AddString("Du texte sur de la transparence", New FontFamily("Tahoma"), CInt(FontStyle.Regular), 26, New Point(10, 10), StringFormat.GenericDefault)
     
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
            g.FillPath(brsh, blackfont)
    L'ennuit c'est que, comme je l'ai dis plus haut, j'aimerais être capable d'en faire autant avec un MenuStrip .



    Si vous avez d'autres idées (pour l'incorporer à un menustrip), n'hésitez pas à les envoyées.
    Merci d'avance.

  5. #5
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut
    Citation Envoyé par The_badger_man Voir le message
    Pour écrire sur de la transparence tu peux utiliser la technique décrite ici:
    http://badger.developpez.com/tutorie...ass-vista/#LVI
    Pas mal du tout ce petit tuto, c'est en favori, merci :-).

Discussions similaires

  1. Comment adapter les objets graphiques (uicontrol) à toutes résolutions d'écran
    Par camillechambon dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 01/05/2007, 23h01
  2. Accèder les objets d'une form à partir d'une classe
    Par xyron_x dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/04/2007, 14h49
  3. [Forms]Concernant les boutons dans Oracle Forms 9 i
    Par samba2005kanoute dans le forum Forms
    Réponses: 1
    Dernier message: 29/11/2006, 13h07
  4. Comment faire pour faire glisser un objet dans une form ?
    Par Olun dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2005, 17h49
  5. [C#] Travailler efficacement avec les panels dans une forme
    Par WwiloO dans le forum Windows Forms
    Réponses: 8
    Dernier message: 27/06/2005, 15h33

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