2009-05-18 2 views
1

Salut à tous. Je me demandais comment je ferais une interface graphique qui est "transparente" en C#. Maintenant, je ne parle pas de la touche de transparence, etc.C# Transparent GUI

Je veux faire une fenêtre qui utilise le thème vistas aero mais au lieu d'un contrôle dans le formulaire je veux juste qu'il montre plus de ce look aeth seethru. Et aussi je veux enlever tous les boutons et icônes et le texte de la fenêtre. Comment ferais-je cela?

EDIT ... J'ai trouvé un exemple PARFAIT de ce que je veux créer. Chargez le centre de mobilité Windows sur Vista. Comment puis-je créer quelque chose comme ça, mais sans les boîtes à l'intérieur.

Répondre

6

si WPF, il s'agit d'activer la transparence, et de définir les bonnes valeurs pour l'arrière-plan (en outre, WPF prend en charge AERO nativement pour les frontières et what-not). Pour les winforms traditionnels ... les choses commencent à devenir difficiles.

+0

J'ai essayé de faire cela, mais ne pouvais pas obtenir l'effet que je voulais. –

0

Avez-vous essayé de vérifier this qui était referred dans une autre question?

+0

J'ai regardé mais cela semble trop compliqué pour ce que j'essaie d'accomplir. –

1

plus il ya toujours Form.Opacity propriété de la forme des fenêtres.

+0

Cela entre dans l'équation plus tard dans mon projet. Au moment où je veux créer une fenêtre qui ressemble au centre de mobilité de Windows sans le contenu –

7

Comment verre dans votre espace client

Voici l'API je quand je l'ai fait pour notre app de Windows il y a quelques années.

Vérifiez la méthode ExtendGlassIntoClientArea (formulaire Form, int leftMargin, int TopMargin, int rightMargin, int BottomMargin)

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace UserInterface 
{ 
    public enum TextStyle 
    { 
     Normal, 
     Glowing 
    } 

    public static class Glass 
    { 
     [DllImport("dwmapi.dll")] 
     private static extern void DwmIsCompositionEnabled(ref bool pfEnabled); 
     [DllImport("dwmapi.dll")] 
     private static extern void DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMargins); 
     [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)] 
     private static extern IntPtr CreateCompatibleDC(IntPtr hDC); 
     [DllImport("gdi32.dll", ExactSpelling = true)] 
     private static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); 
     [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)] 
     private static extern bool DeleteObject(IntPtr hObject); 
     [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)] 
     private static extern bool DeleteDC(IntPtr hdc); 
     [DllImport("gdi32.dll")] 
     private static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop); 
     [DllImport("UxTheme.dll", CharSet = CharSet.Unicode)] 
     private static extern int DrawThemeTextEx(IntPtr hTheme, IntPtr hdc, int iPartId, int iStateId, string text, int iCharCount, int dwFlags, ref RECT pRect, ref DTTOPTS pOptions); 
     [DllImport("gdi32.dll")] 
     static extern IntPtr CreateDIBSection(IntPtr hdc, [In] ref BITMAPINFO pbmi, uint iUsage, out IntPtr ppvBits, IntPtr hSection, uint dwOffset); 

     [StructLayout(LayoutKind.Sequential)] 
     private struct DTTOPTS 
     { 
      public int dwSize; 
      public int dwFlags; 
      public int crText; 
      public int crBorder; 
      public int crShadow; 
      public int iTextShadowType; 
      public POINT ptShadowOffset; 
      public int iBorderSize; 
      public int iFontPropId; 
      public int iColorPropId; 
      public int iStateId; 
      public bool fApplyOverlay; 
      public int iGlowSize; 
      public int pfnDrawTextCallback; 
      public IntPtr lParam; 
     } 

     private const int DTT_COMPOSITED = 8192; 
     private const int DTT_GLOWSIZE = 2048; 
     private const int DTT_TEXTCOLOR = 1; 

     [StructLayout(LayoutKind.Sequential)] 
     private struct POINT 
     { 
      public POINT(int x, int y) 
      { 
       this.x = x; 
       this.y = y; 
      } 

      public int x; 
      public int y; 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     private class BITMAPINFO 
     { 
      public int biSize; 
      public int biWidth; 
      public int biHeight; 
      public short biPlanes; 
      public short biBitCount; 
      public int biCompression; 
      public int biSizeImage; 
      public int biXPelsPerMeter; 
      public int biYPelsPerMeter; 
      public int biClrUsed; 
      public int biClrImportant; 
      public byte bmiColors_rgbBlue; 
      public byte bmiColors_rgbGreen; 
      public byte bmiColors_rgbRed; 
      public byte bmiColors_rgbReserved; 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     private struct MARGINS 
     { 
      public int left, right, top, bottom; 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     private struct RECT 
     { 
      public int Left; 
      public int Top; 
      public int Right; 
      public int Bottom; 

      public RECT(int left, int top, int right, int bottom) 
      { 
       Left = left; 
       Top = top; 
       Right = right; 
       Bottom = bottom; 
      } 

      public RECT(Rectangle rectangle) 
      { 
       Left = rectangle.X; 
       Top = rectangle.Y; 
       Right = rectangle.Right; 
       Bottom = rectangle.Bottom; 
      } 

      public Rectangle ToRectangle() 
      { 
       return new Rectangle(Left, Top, Right - Left, Bottom - Top); 
      } 

      public override string ToString() 
      { 
       return "Left: " + Left + ", " + "Top: " + Top + ", Right: " + Right + ", Bottom: " + Bottom; 
      } 
     } 
     public static bool IsCompositionEnabled 
     { 
      get 
      { 
       if (Environment.OSVersion.Version.Major < 6) 
        return false; 

       bool compositionEnabled = false; 
       DwmIsCompositionEnabled(ref compositionEnabled); 
       return compositionEnabled; 
      } 
     } 

     public static void ExtendGlassIntoClientArea(Form form, int leftMargin, int topMargin, int rightMargin, int bottomMargin) 
     { 
      MARGINS m = new MARGINS(); 
      m.left = leftMargin; 
      m.right = rightMargin; 
      m.top = topMargin; 
      m.bottom = bottomMargin; 

      DwmExtendFrameIntoClientArea(form.Handle, ref m); 
     } 

     public static void DrawText(Graphics graphics, string text, Font font, Rectangle bounds, Color color, TextFormatFlags flags) 
     { 
      DrawText(graphics, text, font, bounds, color, flags, TextStyle.Normal); 
     } 

     public static void DrawText(Graphics graphics, string text, Font font, Rectangle bounds, Color color, TextFormatFlags flags, TextStyle textStyle) 
     { 
      IntPtr primaryHdc = graphics.GetHdc(); 

      // Create a memory DC so we can work offscreen 
      IntPtr memoryHdc = CreateCompatibleDC(primaryHdc); 

      // Create a device-independent bitmap and select it into our DC 
      BITMAPINFO info = new BITMAPINFO(); 
      info.biSize = Marshal.SizeOf(info); 
      info.biWidth = bounds.Width; 
      info.biHeight = -bounds.Height; 
      info.biPlanes = 1; 
      info.biBitCount = 32; 
      info.biCompression = 0; // BI_RGB 
      int ppvBits; 
      IntPtr dib = CreateDIBSection(primaryHdc, ref info, 0, out ppvBits, IntPtr.Zero, 0); 
      SelectObject(memoryHdc, dib); 

      // Create and select font 
      IntPtr fontHandle = font.ToHfont(); 
      SelectObject(memoryHdc, fontHandle); 

      // Draw glowing text 
      System.Windows.Forms.VisualStyles.VisualStyleRenderer renderer = new System.Windows.Forms.VisualStyles.VisualStyleRenderer(System.Windows.Forms.VisualStyles.VisualStyleElement.Window.Caption.Active); 
      DTTOPTS dttOpts = new DTTOPTS(); 
      dttOpts.dwSize = Marshal.SizeOf(typeof(DTTOPTS)); 

      if (textStyle == TextStyle.Glowing) 
      { 
       dttOpts.dwFlags = DTT_COMPOSITED | DTT_GLOWSIZE | DTT_TEXTCOLOR; 
      } 
      else 
      { 
       dttOpts.dwFlags = DTT_COMPOSITED | DTT_TEXTCOLOR; 
      } 
      dttOpts.crText = ColorTranslator.ToWin32(color); 
      dttOpts.iGlowSize = 8; // This is about the size Microsoft Word 2007 uses 
      RECT textBounds = new RECT(0, 0, bounds.Right - bounds.Left, bounds.Bottom - bounds.Top); 
      DrawThemeTextEx(renderer.Handle, memoryHdc, 0, 0, text, -1, (int)flags, ref textBounds, ref dttOpts); 

      // Copy to foreground 
      const int SRCCOPY = 0x00CC0020; 
      BitBlt(primaryHdc, bounds.Left, bounds.Top, bounds.Width, bounds.Height, memoryHdc, 0, 0, SRCCOPY); 

      // Clean up 
      DeleteObject(fontHandle); 
      DeleteObject(dib); 
      DeleteDC(memoryHdc); 

      graphics.ReleaseHdc(primaryHdc); 
     } 

    } 
} 
+0

je reçois une AccessViolationException sur 'IntPtr dib = CreateDIBSection (primaryHdc, info, 0, 0, IntPtr.Zero, 0);'. Des idées? – Ryan

+0

Veuillez ajouter un exemple d'utilisation de 'DrawText' (votre propre méthode). –