2010-10-25 4 views
2

J'affiche un winform en tant que boîte de dialogue (avec ShowDialog sur une fenêtre principale). Donc, j'ai mis le FormBorderStyle à None parce que je ne voulais ni les boîtes de contrôle ni la barre de titre. Cependant, je voudrais une bordure dessinée (par exemple une bordure bleue comme les fenêtres normales) et garder la possibilité de déplacer le formulaire. Je n'ai pas besoin de la possibilité de le redimensionner. J'ai essayé de dessiner une bordure en remplaçant OnPaint mais il n'est jamais appelé. Voici mon code:winforms dessine une bordure et se déplace lorsque FormBorderStyle est défini sur None

protected override void OnPaint (PaintEventArgs e) 
    { 
    base.OnPaint (e); 
    int borderWidth = 2; 
    Color borderColor = Color.Blue; 
    ControlPaint.DrawBorder (e.Graphics, e.ClipRectangle, borderColor, 
     borderWidth, ButtonBorderStyle.Solid, borderColor, borderWidth, 
     ButtonBorderStyle.Solid, borderColor, borderWidth, ButtonBorderStyle.Solid, 
     borderColor, borderWidth, ButtonBorderStyle.Solid); 
    } 

Toute aide serait grandement appréciée.

+0

S'il vous plaît utiliser les outils de formatage disponibles pour marquer le code, rend beaucoup plus facile à lire des questions de cette façon ... – JohnoBoy

+0

Votre code fonctionne bien quand je le coller dans un formulaire. –

+0

Je suppose que le code est bon, c'est juste pas appelé! – Pierre

Répondre

2

La méthode Paint est incorrecte ici car elle ne peint pas la zone dite non-client de la forme, par ex. la bordure et la barre de titre.

Pour masquer la barre de titre, vous devez définir la propriété ControlBox sur false et effacer la propriété Text du formulaire. Définissez la bordure à FixedDialog pour rendre le formulaire non résiliable.

Pour conserver la possibilité de déplacer le formulaire sans la barre de titre, vous devez remplacer WndProc.

protected override void WndProc(ref Message m) 
{ 
    switch (m.Msg) 
    { 
     case 0x84: m.Result = new IntPtr(0x2); 
      return; 
    } 
    base.WndProc(ref m); 
} 

Fondamentalement, c'est la manière standard de manipulation WM_NCHITTEST message et la tricherie, en disant: - le curseur de la souris est sur la légende de la fenêtre [valeur de retour de 0x2], de sorte que vous pourrez déplacer votre forme même si vous cliquez sur la zone client et faites-la glisser.

+0

La méthode OnPaint est correcte, il a défini le FormBorderStyle sur None. –

+0

Merci, ça aide. – Pierre

+0

Cependant, le code pour le déplacement ne fonctionne pas, le cas est manquant et le résultat est IntPtr, il ne peut pas être affecté 0x2. D'ailleurs, j'aimerais changer la taille et la couleur de la bordure. – Pierre

0

Comme aucune autre information ne semble disponible, je vais laisser la bordure comme suggéré, définie sur FixedDialog avec la propriété ControlBox définie sur false et le texte du formulaire effacé. Je préférerais une autre couleur pour la bordure et la possibilité de déplacer la fenêtre si. En tout cas merci beaucoup pour les réponses.

+0

Pour avoir une bordure personnalisée, vous aurez besoin de faire vos propres calculs de zone non-client et de peindre. Laissez-moi vous dire que c'est un peu compliqué lorsque vous utilisez le code managé.Peut-être vaut-il mieux mettre la bordure à None après tout et peindre votre "bordure" (ce serait un faux, quelque chose qui ressemble visuellement à un) en utilisant une fonction listée dans le code ou autre (DrawRect ou autre). – liggett78

1

Mon problème était d'avoir une forme redimensionnable avec une fine bordure.

Je mis FormBorderStyle sur Aucun

J'utilise un panneau ancré qui contient tous mes contrôles. J'utilise le rembourrage du panneau pour définir la largeur de mes bordures.

Et puis:

Point ResizeLocation = Point.Empty; 
     void panResize_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Left) { 
       ResizeLocation = e.Location; 
       ResizeLocation.Offset(-panResize.Width, -panResize.Height); 
       if (!(ResizeLocation.X > -16 || ResizeLocation.Y > -16)) 
        ResizeLocation = Point.Empty; 
      } 
      else 
       ResizeLocation = Point.Empty; 
     } 
     void panResize_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Left && !ResizeLocation.IsEmpty) { 
       if (panResize.Cursor == Cursors.SizeNWSE) 
        Size = new Size(e.Location.X - ResizeLocation.X, e.Location.Y - ResizeLocation.Y); 
       else if (panResize.Cursor == Cursors.SizeWE) 
        Size = new Size(e.Location.X - ResizeLocation.X, Size.Height); 
       else if (panResize.Cursor == Cursors.SizeNS) 
        Size = new Size(Size.Width, e.Location.Y - ResizeLocation.Y); 
      } 
      else if (e.X - panResize.Width > -16 && e.Y - panResize.Height > -16) 
       panResize.Cursor = Cursors.SizeNWSE; 
      else if (e.X - panResize.Width > -16) 
       panResize.Cursor = Cursors.SizeWE; 
      else if (e.Y - panResize.Height > -16) 
       panResize.Cursor = Cursors.SizeNS; 
      else { 
       panResize.Cursor = Cursors.Default; 
      } 

     } 

     void panResize_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) 
     { 
      ResizeLocation = Point.Empty; 
     } 
+0

Je change un peu de code et travaille pour moi. Merci pour le partage! – MiBol

Questions connexes