Améliorer les fenêtres dans AutoCAD

samedi 24 janvier 2026

La chose qui me pique aux yeux le plus souvent quand je reprends un projet écrit par quelqu'un d'autre, ce sont les fenêtres.

Prenons cet exemple :

Une fenêtre hideuse

Il y a instantanément plusieurs choses qui me dérangent :

  1. Le bouton OK est orthographié Ok ;
  2. La fenêtre est trop grande par rapport à son contenu ;
  3. Le bouton Annuler est collé sur le bord gauche de la fenêtre ;
  4. Le fond de la fenêtre est blanc au lieu d'être dans le gris utilisé habituellement pour les boites de dialogue AutoCAD ;
  5. La fenêtre apparait dans la barre des tâches ;
  6. La fenêtre apparait à une position inappropriée sur l'écran ;
  7. Il y a des boutons Minimiser et Maximiser qui ne servent à rien
  8. La fenêtre peut passer en arrière-plan dans certaines situations.

Des détails, vous me direz, OK, mais la plupart d'entre eux peuvent être corrigés en quelques clics donc c'est dommage de ne les avoir pas corrigés.

Alors reprenons un par un ces problèmes et essayons de les résoudre.

Orthographe, casse

Des boutons OK, on en voit à longueur de journée, ils sont partout dans les interfaces utilisateur. Et pourtant, certaines personnes n'ont visiblement jamais réalisé qu'OK était en majuscule. Les erreurs de casse, les fautes d'orthographe, renvoient l'image d'un produit de mauvaise qualité.

Parfois, certains inversent également le sens des boutons OK et Annuler, avec Annuler en premier. C'est la disposition habituelle sur Mac OS, et bien que je la trouve personnellement plus intuitive, on est sur Windows donc on respecte la convention de la plateforme. Sinon, par réflexe, les utilisateurs risquent de cliquer sur le mauvais bouton.

Taille de la fenêtre

La fenêtre a été développée en WPF. WPF utilise un système de mise en page (layout) automatique, donc on peut lui demander d'adapter automatiquement la taille de la fenêtre en fonction de son contenu. Il suffit d'ajouter la propriété SizeToContent="WidthAndHeight" à la fenêtre et de retirer les propriétés Height et Width (ainsi que les contraintes comme MinHeight, MinWidth, MaxHeight, MaxWidth).

Personnellement le plus souvent, je fixe la largeur et je demande à WPF de calculer la hauteur automatiquement avec SizeToContent="Height", parce que les contrôles de saisie comme TextBox et ComboBox n'ont pas de largeur par défaut et donc ils prennent une largeur qui dépend de leur contenu.

Bouton Annuler collé au bord droit

Souvent, on a une grille ou un StackPanel à la racine du contenu de la fenêtre, donc pour décoller le contenu du bord, il suffit de spécifier une marge avec l'attribut Margin. Dans AutoCAD, c'est environ neuf pixels.

Fond de la fenêtre blanc

Là, il suffit de changer la couleur de fond de la fenêtre avec la propriété Background. Dans AutoCAD, le gris utilisé habituellement pour les boites de dialogue est #F0F0F0.

La fenêtre apparait dans la barre des tâches

Ça, c'est une bizarrerie de WPF. Sur l'élément Window, il faut ajouter la propriété ShowInTaskbar="False" pour empêcher la fenêtre d'apparaître dans la barre des tâches. C'est approprié pour la fenêtre principale de l'application, mais pas pour toutes les autres fenêtres, donc à mon avis, Microsoft aurait dû choisir de mettre cette propriété à False par défaut.

La fenêtre apparaît à une position inappropriée sur l'écran

Ici ça commence à être un peu plus technique. Pour commencer, dans WPF, il y a une propriété WindowStartupLocation qui peut prendre les valeurs CenterScreen, CenterOwner ou Manual. Par défaut, c'est Manual et donc la fenêtre apparait là où Windows le décide, c'est-à-dire un peu n'importe où.

Le mieux ici, comme on a une fenêtre modale (une fenêtre qui bloque l'interaction avec le reste de l'application), c'est de la centrer sur l'écran avec WindowStartupLocation="CenterScreen". On utilise Manual quand on veut spécifier une position précise, c'est généralement quand on veut positionner une fenêtre non modale dans un coin de l'écran pour ne pas gêner l'interaction avec le contenu.

On reviendra sur la troisième option CenterOwner plus tard.

Boutons Minimiser et Maximiser inutiles

Ici la fenêtre est en fait un formulaire qui permet de saisir des informations. On n'a pas besoin d'occuper tout l'écran pour ça, il n'y a que quelques champs. Donc pas besoin de bouton Maximiser. On n'a pas de propriété pour cacher le bouton Maximiser, mais on peut changer le mode de redimensionnement de la fenêtre avec la propriété ResizeMode. Comme on n'a pas besoin de redimensionner la fenêtre, on utilise NoResize. WPF masque alors automatiquement le bouton Maximiser.

Pour le bouton Minimiser, c'est à nouveau une bizarrerie de WPF. On n'a pas de propriété pour cacher ce bouton. Pourtant, il est inapproprié de l'afficher dans la plupart des cas.

Pour le masquer, il faut changer le style de la fenêtre et là, attention, il faut sortir l'artillerie lourde (Interop avec Win32).

using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

public abstract partial class WindowWithoutMinimizeButton : Window
{
    const int GWL_STYLE = -16;
    
    const int WS_MINIMIZEBOX = 0x20000;

    [LibraryImport("user32.dll", EntryPoint = "GetWindowLongPtrW")]
    private static partial IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex);

    [LibraryImport("user32.dll", EntryPoint = "SetWindowLongPtrW")]
    private static partial IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);

        IntPtr hwnd = new WindowInteropHelper(this).Handle;
        IntPtr style = GetWindowLongPtr(hwnd, GWL_STYLE);

        // Retire le bouton Minimiser
        style &= ~new IntPtr(WS_MINIMIZEBOX);

        SetWindowLongPtr(hwnd, GWL_STYLE, style);
    }
}

On doit carrément créer une classe dérivée de Window pour pouvoir surcharger OnSourceInitialized. Cette méthode est appelée lorsque la fenêtre est initialisée et est prévue justement pour éventuellement changer le style de la fenêtre. On utilise GetWindowLongPtr et SetWindowLongPtr pour modifier le style de la fenêtre, en retirant le drapeau WS_MINIMIZEBOX.

Notez qu'ici, j'utilise LibraryImport pour importer les fonctions Win32, qui est une fonctionnalité introduite dans .NET 7, donc ce code n'est valable que pour AutoCAD 2025 et versions ultérieures. Pour les versions antérieures, vous devrez utiliser DllImport à la place.

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex);

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

La fenêtre peut passer en arrière-plan

Dernier point de la liste et le plus compliqué. Dans Windows, les fenêtres d'une application forment une hiérarchie. Chaque fenêtre peut avoir des enfants et/ou un parent. En WPF, cette relation parent/enfant doit être explicitement définie. Si vous ne le faites pas, la fenêtre peut avoir un comportement qui n'est pas celui attendu.

Si par exemple, vous avez une fenêtre modale affichée dans AutoCAD et que vous basculez sur une autre application, quand vous allez revenir dans AutoCAD en cliquant sur son icône dans la barre des tâches par exemple, la fenêtre principale d'AutoCAD va venir au premier plan et va masquer votre fenêtre. Comme c'est une fenêtre modale, AutoCAD va apparaître comme figé.

Ça peut être problématique parce que l'utilisateur peut penser que AutoCAD s'est planté alors qu'en fait, c'est simplement parce qu'il attend que la fenêtre modale se ferme.

Pour que cela ne se produise pas, il faut désigner la fenêtre principale d'AutoCAD comme parent de votre fenêtre modale. Le meilleur moyen de le faire est d'utiliser la méthode Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow() à la place de System.Windows.Window.ShowDialog().

Il y a une surcharge de cette méthode qui prend en paramètre un propriétaire :

public static bool? ShowModalWindow(IntPtr owner, System.Windows.Window formToShow);

AutoCAD fournit le maintien de sa fenêtre principale via la propriété Application.MainWindowHandle. Donc, vous pouvez utiliser :

var window = new MyModalWindow();
Application.ShowModalWindow(Application.MainWindow.Handle, window);

Voilà comme ça, les deux fenêtres seront liées et la fenêtre modale ne pourra pas passer en arrière-plan.

Notez que cette méthode ShowModalWindow() enregistre également la position et la taille de la fenêtre pour la restaurer lorsqu'elle sera ré-affichée. Personnellement, je préfère garder ma fenêtre centrée, donc j'utilise plutôt :

public static bool? ShowModalWindow(System.Windows.Window owner, System.Windows.Window formToShow, bool persistSizeAndPosition);

Le booléen persistSizeAndPosition permet de spécifier si la position et la taille de la fenêtre doivent être enregistrées et restaurées. Je passe false pour garder ma fenêtre centrée.

Enfin, je vous avais dit que WindowStartupLocation avait une option CenterOwner. Comme vous pouvez le deviner, au lieu de centrer la fenêtre sur l'écran, vous pouvez la centrer sur la fenêtre propriétaire. Je pense que c'est la meilleure option, si par exemple votre utilisateur a un écran ultra-large.

Conclusion

Voilà, en suivant ces conseils, vous pouvez améliorer considérablement l'expérience utilisateur de vos fenêtres dans AutoCAD.


Coup de pouce Besoin d'un développement AutoCAD (AutoLISP, ObjectARX, .NET, VBA) ? Contactez-moi pour un devis gratuit.