none
WPF redimensionnement d'une fenêtre sans bordure et sans style RRS feed

  • Question

  • Bonjour,

    J'ai besoin de redimensionner une fenêtre sans bordure et sans style pour une application WPF en vb.

    Je veux éviter la fonction AeroSnap de Windows 10 pour la fenêtre. La seule solution que j'ai trouvé, c'est d'empêcher son redimensionnement par la propriété ResizeMode sur NoResize et de créer la fonction de redimensionnement par programme.

    J'ai essayé d'utiliser WndProc avec AddHook.

    Je capte bien le message WM_NCHITTEST dans la fonction.

    J'effectue un Return New IntPtr(HTBOTTOMRIGHT) pour créer un déplacement à partir du coin inférieur droit de la fenêtre.

    je n'ai aucun redimensionnement.

    J'ai ensuite essayé d'utiliser les API ReleaseCapture et SendMessage sans succès.

    Le programme utilisant ces 2 API avec les aménagements nécessaires pour une application WinForm fonctionne correctement.

    J'utilise Visual studio Community 2019.

    Je joints mon code pour essai.

    Imports System.Runtime.InteropServices
    Imports System.Windows.Interop
    Class MainWindow
    
    	<DllImport("user32.dll")>
    	Public Shared Function ReleaseCapture() As Boolean
    	End Function
    
    	<DllImport("user32.dll")>
    	Public Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    	End Function
    
    	Private Sub Window_MouseMove(sender As Object, e As MouseEventArgs)
    
    		Const cGrip As Integer = 16
    		Const HTBOTTOMRIGHT As Integer = 17
    		Const WM_NCLBUTTONDOWN As Integer = &HA1
    
    		If e.LeftButton = MouseButtonState.Pressed Then
    
    			'Récupère la position X et Y de la souris par rapport à l’angle supérieur gauche de la fenêtre
    			Dim PointToWindow As Point = Mouse.GetPosition(Me)
    
    			If (PointToWindow.X >= Me.Width - cGrip And PointToWindow.Y >= Me.Height - cGrip) Then
    
    				Dim windowHelper = New WindowInteropHelper(Me)
    
    				ReleaseCapture()
    				SendMessage(windowHelper.Handle, WM_NCLBUTTONDOWN, HTBOTTOMRIGHT, 0)
    
    				Me.Cursor = Cursors.SizeNWSE
    
    			End If
    		Else
    			Me.Cursor = Nothing
    		End If
    
    	End Sub
    
    	Private Sub Rectangle_MouseDown(sender As Object, e As MouseButtonEventArgs)
    
    		'Déplace le cadre
    		Me.DragMove()
    
    	End Sub
    End Class
    <Window x:Class="MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp3"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800" MouseMove="Window_MouseMove" WindowStyle="None" ResizeMode="NoResize">
        <Grid Background="Black">
           <Rectangle Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="70" Margin="10,10,0,0" Stroke="Black" VerticalAlignment="Top" Width="772" MouseDown="Rectangle_MouseDown"/>
        </Grid>
    </Window>
    lundi 7 octobre 2019 16:49

Réponses

  • Bonjour,

    Après plusieurs essais et recherches sur le Web voici 2 solutions.

    Première solution :

    Ajouter entre le SendMessage les valeurs à la propriété ResizeMode comme décrit ci-dessous.

    ReleaseCapture()
    Me.ResizeMode = ResizeMode.CanResize
    SendMessage(windowHelper.Handle, WM_NCLBUTTONDOWN, HTBOTTOMRIGHT, 0)
    Me.ResizeMode = ResizeMode.NoResize

    Deuxième solution :

    Supprimer les 5 lignes ci-dessous

    'ReleaseCapture()
    'Me.ResizeMode = ResizeMode.CanResize
    'SendMessage(windowHelper.Handle, WM_NCLBUTTONDOWN, HTBOTTOMRIGHT, 0)
    'Me.ResizeMode = ResizeMode.NoResize

    Définir les constantes suivantes

    Const WM_SYSCOMMAND As Integer = &H112
    Const SC_SIZE As Integer = &HF000
    Const sc_SizeBottomRight As Integer = 8

    Ajouter la ligne suivante

    SendMessage(windowHelper.Handle, WM_SYSCOMMAND, (SC_SIZE Or sc_SizeBottomRight), 0)

    Jacky

    mercredi 9 octobre 2019 15:44