2010-07-29 4 views
2

Je cherche un indice ou une solution concernant le problème suivant.Maximiser la forme sur les deux écrans (moniteur double écran)

J'ai une boîte de dialogue .NET 2.0 WinForm qui fonctionne dans un environnement double écran. La zone de travail est définie par .NET Framework pour refléter l'écran principal. Je veux MAXIMISER le FORMULAIRE sur les DEUX écrans, mais après avoir cliqué sur le "bouton de maximisation", la boîte de dialogue est agrandie uniquement pour l'écran "actif" (écran actif sur lequel la boîte de dialogue est actuellement placée).

Je ne m'intéresse pas à la solution des limites, cela fonctionne, mais quand on clique sur le bouton Maximiser, le dialogue revient à l'un des 2 écrans.

Je serais reconnaissant pour toute aide ou des conseils.

Répondre

0

Ne le faites pas.

On y va: le comportement est tel que défini PAR L'UTILISATEUR et le système d'exploitation. Vous ne devez pas remplacer les souhaits des utilisateurs.

Le collage d'écrans (pour former un écran virtuel) est possible avec certains pilotes matériels (ATI me vient à l'esprit pour les cartes actuelles, ils l'appellent EyeFinity). Bien que je vois le sens de cela - dans la plupart des cas, il rompt les attentes des utilisateurs sur la façon dont le programme se comporterait. Et je dis que comme quelqu'un qui travaille avec 3+ écrans souvent;) Comme dans: en utilisant un programme sur tous les écrans;) Je ne voudrais pas cela;)

+1

L'UTILISATEUR ont demandé cette fonctionnalité! C'est pourquoi je cherche une solution pour cela! – jodie

+1

Le problème avec ce type de conseil est que vous n'avez pas assez de contexte pour savoir si c'est approprié. Il y a beaucoup de situations où les auteurs d'applications ont besoin de beaucoup de contrôle sur des systèmes complets - ce ne sont pas les applications de bureau/bureau auxquelles vous pensez, mais des choses comme les kiosques et le contrôle industriel. –

+0

Le problème est que ce n'est même pas simple de répondre SI nécessaire - ce qui est également une des raisons pour lesquelles MS ne l'incluait pas. Deux écrans? Pouvez-vous 100% supposer que les deux sont "côte à côte" et ont la même taille/résolution? Si non, les choses deviennent vraiment moche. Industrial Control peut travailler avec l'un ou l'autre en utilisant ATI Eyefinity/Nvidia équivalent pour faire apparaître plusieurs écrans comme un pour le système d'exploitation (le problème n'existe pas) ou l'utilisateur qui ouvre la fenêtre manuellement (ce que fait mon 4 GRAND écran de contrôle des écrans). Eh oui ... – TomTom

4

Combinez les 2 tailles d'écran et définissez votre formulaire à cette résolution. Quelque chose comme:

int height = 0; 
int width = 0; 
foreach (screen in System.Windows.Forms.Screen.AllScreens) 
{ 
    //take smallest height 
    height = (screen.Bounds.Height <= height) ? screen.Bounds.Height: height; 
    width += screen.Bounds.Width; 
} 

Form1.Size = new System.Drawing.Size(width, height); 

Pour remplacer le bouton Maximize vous pouvez vérifier par WndProc pour l'événement Maximize

const int WM_SYSCOMMAND= 0x0112; 
const int SC_MAXIMIZE= 0xF030; 
protected override void WndProc(ref Message m) 
{ 
    if(m.Msg==WM_SYSCOMMAND) 
    { 
     if((int)m.WParam==SC_MAXIMIZE) 
     { 
      MessageBox.Show("Maximized!!"); 
      return; 
     } 
    } 
    base.WndProc (ref m); 
} 

ou vous inscrire à l'événement Resize du formulaire (vous devriez vérifier si elle est redimensionne ou un agrandissement) (MSDN)

+0

juste ce que je vais dire ... Mon scénario va comme ceci: 1. utilisateur clique OPTIMISER 2. La forme est optimisée pour les deux écrans S'il vous plaît observer que les opérations maximisent provoque plusieurs choses, sauf le changement taille: 1) position fixe (dévers mouvement) 2) taille fixe (dévers Redimensionner) 3) bouton Agrandir répond à « rollback à la dernière taille » l'action Comme je peux simuler 1) et 2) Je ne sais pas comment simuler 3) (Maximiser le bouton permet de revenir à la dernière taille) etc. – jodie

+0

Thx pour le code WinAPI - Je vais le tester dès que possible – jodie

+0

Aussi, pour autant que je puisse voir, il semble mal. Si vous avez deux écrans de 640x480, vous obtiendrez un formulaire de format 1280x960. Cela aurait dû être 1280x480 ou 640x960 en fonction de la configuration des écrans. – Svish

0

Permet aux utilisateurs de modifier leurs paramètres d'affichage Windows (ou de les modifier pour eux). Par exemple, sur les cartes NVidia, le comportement par défaut de Windows est appelé «Dualview». Si vous activez 'Horizontal span', les fenêtres agrandies commenceront à se comporter comme vous le décrivez.

+1

Je cherche une solution universelle qui ne soit pas spécifique à une carte ... Certaines applications (source fermée) fonctionnent comme je le décris, mais je ne trouve pas de principe comment elles le font ... – jodie

+0

Il n'y a pas de solution universelle. Windows lui-même maximise les fenêtres pour remplir un moniteur. Les fournisseurs de cartes y parviennent en faisant en sorte que deux moniteurs physiques apparaissent en un seul gros. –

0

Seule la solution que je connais utilise les limites en combinaison avec la redéfinition de l'événement Resize. Dans le gestionnaire, vous pouvez vérifier la propriété WindowState pour voir si le formulaire est Maximisé ou Réduit. Si elle est agrandie, redimensionnez la fenêtre avec toutes les limites d'écran ensemble.

Je vois un problème avec ce que vous voulez. Que se passe-t-il si le second écran est plus petit que le premier (visa versa) ...
Et si le deuxième écran est situé en diagonale (par exemple en haut à gauche) du premier écran (visa versa) ...
Il y aura des pièces qui ne seront pas visibles!

+0

Je suppose pour l'instant qu'ils sont de taille égale. Iam envisage d'exécuter votre solution, mais ce serait génial Si je sais comment forcer le bouton MAXIMIZE pour afficher autre glyph – jodie

4

peut être en retard, mais voici un moyen facile de le faire. Il définit la taille du formulaire à partir de la taille de la résolution. alors il place la forme pour qu'elle puisse être visible.

 int screenLeft = SystemInformation.VirtualScreen.Left; 
     int screenTop = SystemInformation.VirtualScreen.Top; 
     int screenWidth = SystemInformation.VirtualScreen.Width; 
     int screenHeight = SystemInformation.VirtualScreen.Height;    

     this.Size = new System.Drawing.Size(screenWidth, screenHeight); 
     this.Location = new System.Drawing.Point(screenLeft, screenTop); 
+1

cool man, j'ai réussi à maximiser mes fenêtres dans deux moniteurs en mettant votre code dans la partie départ de Form1_Load(), merci –

+1

Cela a fonctionné parfaitement pour 3 moniteurs aussi! –

0

je sais que ce fil est très vieux - mais j'ai trouvé très utile et une solution de travail de here après avoir essayé et ayant des problèmes avec toutes les solutions énumérées ici.

Ce qui a fonctionné pour moi était

Rectangle r = new Rectangle(); 
     foreach (Screen s in Screen.AllScreens) 
     { 
      if (s != Screen.FromControl(this)) // Blackout only the secondary screens 
       r = Rectangle.Union(r, s.Bounds); 
     } 

     this.Top = r.Top; 
     this.Left = r.Left; 
     this.Width = r.Width; 
     this.Height = r.Height; 
Questions connexes