2010-06-22 7 views
3

Je suis en train de le faire (en WPF):WPF - supprimer l'icône du menu système de fenêtre modale, mais pas la fenêtre principale application

  1. Vous avez déjà un fichier .exe qui affiche l'icône du menu système (l'icône la partie supérieure gauche de la fenêtre) comme normale
  2. pas cette icône apparaissent dans des fenêtres modales appelées par cette application

J'ai essayé ici la solution: Removing Icon from a WPF window

Et cela a fonctionné. Il y a un échantillon téléchargeable de la même chose: http://blogs.msdn.com/b/wpfsdk/archive/2007/08/02/a-wpf-window-without-an-window-icon-the-thing-you-click-to-get-the-system-menu.aspx

Cependant, il cesse de fonctionner si j'ajouter un fichier .ico aux propriétés du projet du .exe (Propriétés -> Application -> Icône et Manifest). Vous pouvez essayer ceci avec l'échantillon téléchargeable.

Il semble que l'icône du fichier .exe soit également utilisée dans les fenêtres modales (que nous avons dans les fichiers .dll) même si les propriétés de ce fichier .dll indiquent "icône par défaut". Il doit être transmis depuis le fichier .exe. Alors, est-il possible d'afficher l'icône sur la fenêtre principale, mais pas sur une fenêtre enfant?

Éventuellement, une façon plus simple de poser cette question est la suivante: Est-il possible de supprimer l'icône même si un fichier .ico est spécifié dans les propriétés du projet?

La seule chose que j'ai trouvé pour travailler est de définir le WindowStye de la fenêtre modale à "ToolWindow". Cela me donne presque ce que je veux: pas d'icône et le bouton "Fermer" ("x" en haut à droite) est toujours là. Pourtant, le x est super petit. Est-ce le meilleur qui existe?

Merci pour toute aide.

Répondre

6

J'ai eu le même problème. Il semble que WS_EX_DLGMODALFRAME supprime uniquement l'icône lorsque la fenêtre native Win32 de la fenêtre WPF n'a pas d'icône associée. WPF (commodément) utilise l'icône de l'application comme icône par défaut pour toutes les fenêtres sans icône explicitement définie. Normalement, cela ne cause aucun problème et nous évite de mettre manuellement l'icône de l'application sur chaque fenêtre; Cependant, cela nous cause un problème lorsque nous essayons de supprimer l'icône. Comme le problème est que WPF définit automatiquement l'icône de la fenêtre pour nous, nous pouvons envoyer WM_SETICON à la fenêtre Win32 pour réinitialiser son icône lorsque nous appliquons WS_EX_DLGMODALFRAME.

const int WM_SETICON = 0x0080; 
const int ICON_SMALL = 0; 
const int ICON_BIG = 1; 

[DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
static extern IntPtr SendMessage(
    IntPtr hWnd, 
    int msg, 
    IntPtr wParam, 
    IntPtr lParam); 

code pour supprimer l'icône:

IntPtr hWnd = new WindowInteropHelper(window).Handle; 
int currentStyle = NativeMethods.GetWindowLongPtr(hWnd, GWL_EXSTYLE); 

SetWindowLongPtr(
    hWnd, 
    GWL_EXSTYLE, 
    currentStyle | WS_EX_DLGMODALFRAME); 

// reset the icon, both calls important 
SendMessage(hWnd, WM_SETICON, (IntPtr)ICON_SMALL, IntPtr.Zero); 
SendMessage(hWnd, WM_SETICON, (IntPtr)ICON_BIG, IntPtr.Zero); 

SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0, 
    SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); 

Edit: Oh, et il semble que cela ne fonctionne que lorsque l'application est exécutée en dehors de Visual Studio.

Questions connexes