2011-10-13 9 views
10

Pracuję nad aplikacją MDF WinForms w VS2010 (.NET 4.0) i po prostu nienawidzę granic 3D w formularzu nadrzędnym MDI.Jak usunąć obramowanie 3d (zatopiony) z komponentu MDIClient w formularzu nadrzędnym MDI?

Więc wszelkie pomysły, jak go usunąć (uczynić płaskim lub po prostu nie ma granicy to wszystko)?

+1

Nie, jesteście z tym związani. Klasa MdiClient nie ma właściwości BorderStyle i nie ma żadnego oczywistego sposobu, który widzę w celu utworzenia jej instancji. –

Odpowiedz

19

Wiem, że to stary post, ale spędziłem trochę czasu i ból pracuje rzeczy border 3D out (bo potrzebował zbyt) z fragmentów całej Internet w tym:

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

Więc tu idzie:

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; 
     } 

    } 
} 

W wywołaniu zdarzenia Load formularza:

form.SetBevel(false); 

Nie zapomnij zmienić nazw i pamiętać, że jest to metoda rozszerzenie, ale może to być zmienione być jsut wywołanie metody w innej klasy lub w was MDI forma rodzica.

+0

Doskonała robota man.upvote dla Ciebie. dzięki – Napster

+0

To było wspaniałe .. – Sayka

+0

co za bohater ..... – zxc

0

Spróbuj zmieniając FormBorderStyle nieruchomość do FixedSingle

+1

To pierwsza rzecz, którą wypróbowałem ... Główny formularz traci "rozmiar", a granica 3D wciąż tam jest! – EmirZ

5

Jeśli nie chcesz importować bibliotek zewnętrznych, istnieje również oszukiwanie, które repozycje/zmienia rozmiar kontrolki kontenera 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); 
    } 
Powiązane problemy