2011-10-13 20 views

Respuesta

19

Sé que esto es un viejo correo y no he pasado algún tiempo y el dolor que trabaja la materia borde 3D cabo (porque lo necesitaba también) a partir de fragmentos a través el Internet incluyendo:

Elements from Jacob Slusser's page at codeproject.com (Accessed 1st Aug'12)

Así que aquí va:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace MDITest 
{ 
    public static class MDIClientSupport 
    { 
     [DllImport("user32.dll")] 
     private static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

     [DllImport("user32.dll")] 
     private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 

     [DllImport("user32.dll", ExactSpelling = true)] 
     private static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); 

     private const int GWL_EXSTYLE = -20; 
     private const int WS_EX_CLIENTEDGE = 0x200; 
     private const uint SWP_NOSIZE = 0x0001; 
     private const uint SWP_NOMOVE = 0x0002; 
     private const uint SWP_NOZORDER = 0x0004; 
     private const uint SWP_NOREDRAW = 0x0008; 
     private const uint SWP_NOACTIVATE = 0x0010; 
     private const uint SWP_FRAMECHANGED = 0x0020; 
     private const uint SWP_SHOWWINDOW = 0x0040; 
     private const uint SWP_HIDEWINDOW = 0x0080; 
     private const uint SWP_NOCOPYBITS = 0x0100; 
     private const uint SWP_NOOWNERZORDER = 0x0200; 
     private const uint SWP_NOSENDCHANGING = 0x0400; 

     public static bool SetBevel(this Form form, bool show) 
     { 
      foreach (Control c in form.Controls) 
      { 
       MdiClient client = c as MdiClient; 
       if (client != null) 
       { 
        int windowLong = GetWindowLong(c.Handle, GWL_EXSTYLE); 

        if (show) 
        { 
         windowLong |= WS_EX_CLIENTEDGE; 
        } 
        else 
        { 
         windowLong &= ~WS_EX_CLIENTEDGE; 
        } 

        SetWindowLong(c.Handle, GWL_EXSTYLE, windowLong); 

        // Update the non-client area. 
        SetWindowPos(client.Handle, IntPtr.Zero, 0, 0, 0, 0, 
         SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | 
         SWP_NOOWNERZORDER | SWP_FRAMECHANGED); 

        return true; 
       } 
      } 
      return false; 
     } 

    } 
} 

En el evento de carga del formulario llamada:

form.SetBevel(false); 

No se olvide de cambiar el espacio de nombres y recordar que esto es un método de extensión pero podría cambiar para ser jsut una llamada de método en otra clase o en ti MDI forma parental

+0

excelente trabajo man.upvote para usted. gracias – Napster

+0

Eso fue genial .. – Sayka

+0

qué héroe ..... – zxc

0

Intente cambiar el FormBorderStyle propiedad a FixedSingle

+1

Es lo primero que intenté ... ¡la forma principal pierde "capacidad de búsqueda" y el borde 3D todavía está allí! – EmirZ

5

Si prefiere no importar bibliotecas externas, también existe la siguiente trampa que reposiciona/cambia el tamaño del control del contenedor mdi.

protected override void OnLoad(EventArgs e) 
    { 
     var mdiclient = this.Controls.OfType<MdiClient>().Single(); 
     this.SuspendLayout(); 
     mdiclient.SuspendLayout(); 
     var hdiff = mdiclient.Size.Width - mdiclient.ClientSize.Width; 
     var vdiff = mdiclient.Size.Height - mdiclient.ClientSize.Height; 
     var size = new Size(mdiclient.Width + hdiff, mdiclient.Height + vdiff); 
     var location = new Point(mdiclient.Left - (hdiff/2), mdiclient.Top - (vdiff/2)); 
     mdiclient.Dock = DockStyle.None; 
     mdiclient.Size = size; 
     mdiclient.Location = location; 
     mdiclient.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom; 
     mdiclient.ResumeLayout(true); 
     this.ResumeLayout(true); 
     base.OnLoad(e); 
    } 
Cuestiones relacionadas