Fenêtre Windows - Supprimer le cadre

a marqué ce sujet comme résolu.

Bonjour,

Certaines applications codée en VB.NET (Windows Form) possèdent l'intéressante particularité de fonctionner dans des fenêtres sans "contour" (le petit liserai tout au tour de la fenêtre).

STOOOOP ! Avant que vous me répondiez "FormBorderStyle.None", sachez que ces fenêtres en question possèdent toujours la possibilité d'être redimensionnées et la petite ombre rajouté par Windows sous les fenêtres. Hors, des fenêtres en "None" ne possèdent pas ces deux caractéristiques. Donc je voudrais parvenir à le faire avec FormBorderStyle.Sizable.

Bien évidemment, l’intérêt d'une telle manipulation serait de créer des fenêtres totalement personnalisées. J'ai d'ailleurs franchi sans problème la première étape pour faire des fenêtres personnalisées, à savoir, supprimer la barre de titre… Mais il me reste encore ces bordures aero…

Avec Barre de titre

Sans barre de titre

J'aimerai donc parvenir à faire ça :


J’espère que vous pourrez m'aider ! :)

Hi,

Une application en VB.net ça ne veut rien dire.

J'en déduis que c'est du winform au vu de la propriété énoncé FormBorderStyle. Je ne peux pas t'aider dans ce cas là.

Par contre j'aimerais vraiment savoir pour information d’où vient cette mode de faire du winform ? On est en 2015 les gars ça fait 10 ans que WPF est sortie… (quoi que mono utilise winform je crois dans ce cas là j'ai rien dis)

Pour répondre quand même au sujet est dans le cas où tu passerais du bon côté de la force :-° voici ce qu'il faut faire pour une application WPF, il faut redéfinir le style de la Window, notamment sur les propriétés AllowTransparency, WindowStyle, WindowChrome.WindowChrome

Petit exemple avec une fenêtre totalement dépourvue de bouton.

Code xaml :

 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
<Style TargetType="{x:Type Window}">
            <Setter Property="Background" Value="#32CD32"/>
            <Setter Property="FontFamily" Value="Segoe UI" />
            <Setter Property="FontSize" Value="16" />
            <Setter Property="Foreground" Value="WhiteSmoke" />
            <Setter Property="ResizeMode" Value="CanResizeWithGrip" />
            <Setter Property="UseLayoutRounding" Value="True" />
            <Setter Property="TextOptions.TextFormattingMode" Value="Display" />
            <Setter Property="AllowsTransparency" Value="True"/>
            <Setter Property="WindowStyle" Value="None"/>
            <Setter Property="WindowChrome.WindowChrome">
                <Setter.Value>
                    <WindowChrome CornerRadius="0" GlassFrameThickness="0" UseAeroCaptionButtons="False" NonClientFrameEdges="None" />
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Window}">
                        <Grid x:Name="Window">                          
                            <AdornerDecorator>
                                <Border Background="{TemplateBinding Background}" Margin="10">
                                    <Border.Effect>
                                        <DropShadowEffect Color="Black" Direction="270" BlurRadius="10" ShadowDepth="3" />
                                    </Border.Effect>

                                    <Grid x:Name="LayoutRoot">
                                        <!-- window content -->
                                        <ContentControl Content="{TemplateBinding Content}" />
                                    </Grid>
                                </Border>
                            </AdornerDecorator>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
+0 -0

Salut,

Il suffit d'overrider le callback WndProc de l'API Win32 dans le code de ta fenetre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
Protected Overrides Sub WndProc(ByRef m As Message)
    If m.Msg = &H84 Then
        ' message WM_NCHITTEST
        Dim pos As New Point(m.LParam.ToInt32() And &Hffff, m.LParam.ToInt32() >> 16)
        pos = Me.PointToClient(pos)
        If pos.Y < 32 Then
            m.Result = DirectCast(2, IntPtr)
            ' HTCAPTION
            Return
        End If
        If pos.X >= Me.ClientSize.Width - 16 AndAlso pos.Y >= Me.ClientSize.Height - 16 Then
            m.Result = DirectCast(17, IntPtr)
            ' HTBOTTOMRIGHT
            Return
        End If
    End If
    MyBase.WndProc(m)
End Sub

Le message WM_NCHITTSET détecte lorsque le pointeur de la souris se situe sur la fenetre. Si il est placé en haut de la form, alors tu peux la déplacer et si il est placé dans le coin inférieur droit, tu peux la redimensionner.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Public Class Form1
    Protected Overrides ReadOnly Property CreateParams() As CreateParams
        Get
            Const CS_DROPSHADOW As Integer = &H20000
            Dim cp As CreateParams = MyBase.CreateParams
            cp.ClassStyle = cp.ClassStyle Or CS_DROPSHADOW
            Return cp
        End Get
    End Property
End Class

réécris cette propriétés en ajoutant le flag CS_DROPSHADOW.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte