2008-10-24 6 views
3

Nous avons une application WinForms qui fonctionne sur un écran tactile sur un peu d'équipements industriels. Pour des raisons historiques qui ne sont pas modifiables aujourd'hui, le formulaire affiché possède une barre de titre Windows normale.Quelle est la plus élégante façon d'arrêter une fenêtre Winforms être déplacé autour

Nous voudrions empêcher les gens en utilisant la souris (à savoir l'écran tactile) de déplacer la fenêtre en faisant glisser la barre de titre. Nous ne nous soucions pas s'il y a un autre moyen de déplacer la fenêtre en utilisant le clavier.

Quelle est la façon la plus élégante pour y parvenir? Je peux penser à essayer de renverser les messages de la souris s'il y a une souris sur la barre de titre (bien que le hit-test NC ne semble pas évident à première vue dans Winforms), et je peux penser à répondre aux messages de déplacement restaure la position de la fenêtre.

Mais ces deux semblent maladroites, et j'ai un sentiment que je me manque quelque chose d'élégant et évident.

Répondre

3

messages Nc sont toujours le feu je pense. Les fenêtres de Syncfusion faq ont le code dont vous avez besoin. (! Grognement, grogner) Je coller un lien, mais je suis sur un iPhone sans copier coller

+0

http://www.faqdev.com/FAQ/WINDOWS/Windows-Forms/Form/656/How-do-I-prevent-a-user-from-moving-a-form-at-run-time – Romoku

0

Comment modifier au sujet de la principale LocationChanged événement de forme, SizeChanged, etc ...

0

Vous pouvez forcer la fenêtre à rester maximisé, si c'est pratique pour votre application.

2

Ok, grâce à un peu d'encouragement de DANF, je suis venu avec ceci:

protected override void WndProc(ref Message msg) 
    { 
     const int WM_NCLBUTTONDOWN = 0xa1; 

     switch (msg.Msg) 
     { 
     case WM_NCLBUTTONDOWN: 
      // To prevent people moving the window with the mouse 
      // unless CTRL is held 
      if (!(GetKeyState((int)Keys.ControlKey) < 0)) 
      { 
       return; 
      } 
      break; 
     } 
     base.WndProc(ref msg); 
    } 

Ce qui semble être juste la chose. Merci a tous.

+0

Que se passe-t-il lorsque quelqu'un appuie sur Alt + Espace suivi de & Déplacer depuis le menu contextuel? –

+0

Si vous relisez la question, vous verrez que j'ai dit: «Peu importe s'il y a un autre moyen de déplacer la fenêtre en utilisant le clavier. –

+0

Cela n'empêche pas le déplacement, il empêche les clics de la souris, ce qui est génial sauf si vous devez autoriser l'utilisateur à cliquer sur des choses comme le bouton de fermeture à droite du formulaire – rotard

0

Pour gérer le commentaire de @ Rotard sur votre solution, vous pouvez bloquer juste mouvement avec la souris par ce qui suit: Dans votre WndProc override, pour WM_NCHITTEST, appelez base.WndProcpremier. Si elle renvoie HTCAPTION, renvoyez HTNONE à la place.

Questions connexes