C#透明GUI

大家好。 我想知道如何在C#中制作一个“透明”的GUI。 现在我不是在谈论transparencykey等。

我想创建一个使用vistas航空主题的窗口,但不是表单中的控件,我只是想让它显示更多的seethru aero外观。 而且我想从窗口中删除所有按钮,图标和文本。 我该怎么办?

编辑…我找到了一个完美的例子,我想要创建。 在vista上加载Windows移动中心。 我怎样才能创建类似的东西,但没有盒子。

如何进入客户区域

这是几年前我为Windows应用程序执行此操作时使用的API。

查看方法ExtendGlassIntoClientArea(Form 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); } } } 

如果是WPF,那就是打开透明度,并为背景设置正确的值(另外,WPF本身支持AERO用于边框和什么不是)。

对于传统的winforms ……事情开始变得艰难。

加上Windows窗体的Form.Opacity属性。

您是否试图查看另一个问题中提到的内容 ?