none
WPF Utilisation de SendMessage pour redimensionnement d'une fenêtre et événement MouseLeave de la fenêtre RRS feed

  • Question

  • Bonjour,

    Je redimensionne une fenêtre en utilisant l'envoi d'un message à l'aide de l'Api SendMessage.

    Lors du redimensionnement, j'ai constaté que l'événement MouseLeave de la fenêtre était parfois déclenché. Ce qui entraîne dans mon programme un changement du curseur souris.

    Est-il normal que cet événement soit déclenché pendant le redimensionnement?

    Comment peux-t-on éviter le déclenchement de l'événement?

    Le programme ci-dessous pour essai.

    <Window x:Name="MainWindow" 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" Height="450" Width="800" ShowInTaskbar="False" Background="{x:Null}" WindowStyle="None" AllowsTransparency="True" ResizeMode="NoResize">
        <Grid Background="#FF870A0A">
            <Rectangle x:Name="rctTitre" Fill="#FF1D1DB9" Stroke="Black" Height="53" VerticalAlignment="Top"/>
            <Label x:Name="lbEssai" HorizontalAlignment="Left" Height="28" VerticalAlignment="Top" Width="262" Background="#FF949B0F" Margin="10,100,0,0"/>
        </Grid>
    </Window>

    Imports System.Runtime.InteropServices
    Imports System.Windows.Interop
    Class MainWindow
    
    	<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 MainWindows_MouseMove(sender As Object, e As MouseEventArgs) Handles MyBase.MouseMove
    
    		Const cGrip As Integer = 20
    
    		'Commande pour la fenêtre
    		Const WM_SYSCOMMAND As Integer = &H112
    		Const SC_SIZE As Integer = &HF000
    		Const sc_SizeBottomRight As Integer = 8
    
    		If e.LeftButton = MouseButtonState.Pressed Then
    
    			'Récupère la position X et Y de la souris
    			Dim PointToWindow As Point = Mouse.GetPosition(Me)
    
    			'Vérifie les coordonnées par rapport à l’angle inférieur droit de la fenêtre
    			If (PointToWindow.X >= Me.Width - cGrip And PointToWindow.Y >= Me.Height - cGrip) Then
    
    				lbEssai.Content = "Resize activé"
    
    				Me.Cursor = Cursors.SizeNWSE
    
    				'Commande le redimensionnnement
    				SendMessage(New WindowInteropHelper(Me).Handle, WM_SYSCOMMAND, (SC_SIZE Or sc_SizeBottomRight), 0)
    
    				Me.Cursor = Nothing
    
    				lbEssai.Content = "Resize terminé"
    
    			End If
    		End If
    
    	End Sub
    
    	Private Sub MainWindow_MouseLeave(sender As Object, e As MouseEventArgs) Handles MyBase.MouseLeave
    
    		'Indique le passage par l'événement
    		lbEssai.Content = "Event Mouseleave détecté"
    
    	End Sub
    
        Private Sub RctTitre_MouseDown(sender As Object, e As MouseButtonEventArgs) Handles rctTitre.MouseDown
    
    		'Déplace la fenêtre
    		Me.DragMove()
    
    	End Sub
    
    End Class

     
    samedi 12 octobre 2019 04:41