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

Windows Forms Discussion :

[C#] Fenêtre non-déplaçable


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut [C#] Fenêtre non-déplaçable
    Bonjour à tous,
    Je cherche à rendre une fenêtre non-déplaçable, sans mettre formBorderStyle à None. C'est moche.
    J'ai essayé aussi la propriété locked à true, ce qui ne change rien.
    Je suis tombé sur ce thread, mais la solution proposé n'est pas très propre (code non managé).
    Quelqu'un aurait-il une autre idée?
    Merci

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Ce bout de code simplissime devrait correspondre à ton besoin (en tout cas il marche) :

    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
     
            private Point _initialLocation = Point.Empty;
            public Form1()
            {
                InitializeComponent();
                this.Activated += new EventHandler( Form1_Activated );         
                this.LocationChanged += new EventHandler( Form1_LocationChanged );
            }
     
            void Form1_Activated( object sender, EventArgs e )
            {
                _initialLocation = this.Location;
            }
     
            void Form1_LocationChanged( object sender, EventArgs e )
            {
                if (this.Location != _initialLocation && _initialLocation != Point.Empty)
                {
                    Location = _initialLocation;
                }
            }

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    la solution du
    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
     
    protected override void WndProc(ref Message m)
            {
                switch (m.Msg)
                {
                    case 0x84:    //message WM_NCHITTEST
                        base.WndProc(ref m);
                        if (m.Result == (IntPtr)2)        // 2 =  barre de titre
                            m.Result = (IntPtr)0;     //0 = fond de la fenetre
                        break;
                    default:
                        base.WndProc(ref m);
                        break;
                }    
            }
    C'est du code managé et c'est tout à fait propre...

    The Monz, Toulouse

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    C'est même mieux que ma solution, car :

    - tu peux déplacer par programme
    - il n'y pas l'"ombre" quand on tente de bouger la fenêtre.

  5. #5
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Code non managé, c'est pas quand on transmet des paramètres par référence?
    Je vais utiliser la solution managé et propre alors . Je m'orientais sinon vers une solution par évènement comme Bluedeep.
    Merci à tous deux.

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par dahtah Voir le message
    Code non managé, c'est pas quand on transmet des paramètres par référence?
    Rien à voir : les paramétres par référence sont une caractéristique du langage C# (un des plus vs java, d'ailleurs, où ca manque grandement).

  7. #7
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Ah non, c'est l'utilisation explicite des pointeurs...
    Merci

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Par défaut
    bonjour,

    cette solution je n'arrive pas à l'implémenter.
    je suis en VB.NET.
    j'ai posté ici, car il me semble que je trouve plus de monde sur cette partie du forum, mais je ne développe que peu en C# :o(
    j'ai cherché dans mon projet, je n'ai pas de wndproc semble t-il, dans mon application.

    de plus, je ne souhaites bloquer que les fenêtre filles de la LDI.
    si je comprends bien, override de wndProc va bloquer tout déplacement, fenêtre mère, fenêtre fille.

    l'autre solution, qui consiste à ajouter mon event dans un handler existant, je dois la tester. je ne sais pas comment j'ajoute cela en VB.NET mais je devrais pouvoir trouver facilement sur le net des infos à ce sujet.
    je cherche, et reviens sur ce post, pour dire si j'ai reussi ou non.

    merci pour l'aide
    Olivier


    Citation Envoyé par theMonz31 Voir le message
    salut

    la solution du
    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
     
    protected override void WndProc(ref Message m)
            {
                switch (m.Msg)
                {
                    case 0x84:    //message WM_NCHITTEST
                        base.WndProc(ref m);
                        if (m.Result == (IntPtr)2)        // 2 =  barre de titre
                            m.Result = (IntPtr)0;     //0 = fond de la fenetre
                        break;
                    default:
                        base.WndProc(ref m);
                        break;
                }    
            }
    C'est du code managé et c'est tout à fait propre...

    The Monz, Toulouse

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Par défaut
    bonjour,
    voici le code que j'ai créer en VB.NET, pour implémenter une event handler, et bloquer la fenêtre :

    Code VB : 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
     
     
        Private _initialLocation As Point = Point.Empty
        Public Sub Init_Event()
            AddHandler Me.Activated, AddressOf Form1_Activated
            AddHandler Me.LocationChanged, AddressOf Form1_LocationChanged
        End Sub
     
        Public Sub Form1_Activated(ByVal sender As Object, ByVal e As EventArgs)
            _initialLocation = Me.Location
        End Sub
     
        Public Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As EventArgs)
     
            If (Me.Location <> _initialLocation And _initialLocation <> Point.Empty) Then
                Location = _initialLocation
            End If
        End Sub

    cela marche un peu.
    cela bloque presque ma fenêtre
    mais cela fait pareil que quand j'utilise l'évènement "MOVE". la fenêtre est déplacable pendant 1/100e de secondes.
    cela fait un effet très laid de clignotement, où la fenêtre essaie de bouger, et reviens à sa place.

    merci pour l'idée en tout cas
    Olivier

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Par défaut
    bonjour,

    ca y est, j'ai résolu avec votre aide mon problème :

    j'ai maintenant une fenêtre mère MDI, déplaçable, qui contient des fenêtre fille MLDI, non déplaçable.

    je pose le code ici, afin que cela puisse aider quelqu'un :
    Code VB : 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
     
        ' Empêche de déplacer la fenêtre.
     
        Protected Overrides Sub WndProc(ByRef m As Message)
            Const WM_NCLBUTTONDOWN As Integer = 161
            Const WM_SYSCOMMAND As Integer = 274
            Const HTCAPTION As Integer = 2
            Const SC_MOVE As Integer = 61456
            If (m.Msg = WM_SYSCOMMAND) AndAlso (m.WParam.ToInt32() = SC_MOVE) Then
                Return
            End If
            If (m.Msg = WM_NCLBUTTONDOWN) AndAlso (m.WParam.ToInt32() = HTCAPTION) Then
                Return
            End If
            MyBase.WndProc(m)
        End Sub


    merci encore à tous,

    Olivier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Obtenir une fenêtre non-déplaçable C# WPF
    Par NahMean dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 10/01/2013, 10h17
  2. Handle de fenêtre non valide
    Par bernie.noel dans le forum Langage
    Réponses: 5
    Dernier message: 18/03/2008, 18h48
  3. Réponses: 2
    Dernier message: 16/03/2007, 09h13
  4. Réponses: 4
    Dernier message: 13/06/2004, 15h28
  5. [Kylix] Fenêtres non redimensionnables
    Par fred78 dans le forum EDI
    Réponses: 2
    Dernier message: 01/12/2002, 14h08

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