我的 WinForms 应用程序在 Vista/Windows 7 上具有标准 Aero 玻璃外观。
我想自定义绘制窗口标题栏,使其保留带有玻璃最小/最大/关闭按钮的 Aero 玻璃外观,但没有标题文本和窗口图标。我已经通过覆盖 WM_NCPAINT 进行了尝试,但覆盖此事件总是会导致玻璃被移除。
有谁知道如何用玻璃覆盖 WM_NCPAINT 以便有效地正确绘制玻璃区域?
我的 WinForms 应用程序在 Vista/Windows 7 上具有标准 Aero 玻璃外观。
我想自定义绘制窗口标题栏,使其保留带有玻璃最小/最大/关闭按钮的 Aero 玻璃外观,但没有标题文本和窗口图标。我已经通过覆盖 WM_NCPAINT 进行了尝试,但覆盖此事件总是会导致玻璃被移除。
有谁知道如何用玻璃覆盖 WM_NCPAINT 以便有效地正确绘制玻璃区域?
WM_NCPAINT
我没有涉及WM_NCPAINT
.
首先定义这个类。您将使用它的类型和功能来实现您想要的功能:
internal class NonClientRegionAPI
{
[DllImport( "DwmApi.dll" )]
public static extern void DwmIsCompositionEnabled( ref bool pfEnabled );
[StructLayout( LayoutKind.Sequential )]
public struct WTA_OPTIONS
{
public WTNCA dwFlags;
public WTNCA dwMask;
}
[Flags]
public enum WTNCA : uint
{
NODRAWCAPTION = 1,
NODRAWICON = 2,
NOSYSMENU = 4,
NOMIRRORHELP = 8,
VALIDBITS = NODRAWCAPTION | NODRAWICON | NOSYSMENU | NOMIRRORHELP
}
public enum WINDOWTHEMEATTRIBUTETYPE : uint
{
/// <summary>Non-client area window attributes will be set.</summary>
WTA_NONCLIENT = 1,
}
[DllImport( "uxtheme.dll" )]
public static extern int SetWindowThemeAttribute(
IntPtr hWnd,
WINDOWTHEMEATTRIBUTETYPE wtype,
ref WTA_OPTIONS attributes,
uint size );
}
接下来,在您的表单中,您只需执行以下操作:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// Set your options. We want no icon and no caption.
SetWindowThemeAttributes( NonClientRegionAPI.WTNCA.NODRAWCAPTION | NonClientRegionAPI.WTNCA.NODRAWICON );
}
private void SetWindowThemeAttributes( NonClientRegionAPI.WTNCA attributes )
{
// This tests that the OS will support what we want to do. Will be false on Windows XP and earlier,
// as well as on Vista and 7 with Aero Glass disabled.
bool hasComposition = false;
NonClientRegionAPI.DwmIsCompositionEnabled( ref hasComposition );
if( !hasComposition )
return;
NonClientRegionAPI.WTA_OPTIONS options = new NonClientRegionAPI.WTA_OPTIONS();
options.dwFlags = attributes;
options.dwMask = NonClientRegionAPI.WTNCA.VALIDBITS;
// The SetWindowThemeAttribute API call takes care of everything
NonClientRegionAPI.SetWindowThemeAttribute(
this.Handle,
NonClientRegionAPI.WINDOWTHEMEATTRIBUTETYPE.WTA_NONCLIENT,
ref options,
(uint)Marshal.SizeOf( typeof( NonClientRegionAPI.WTA_OPTIONS ) ) );
}
}
结果如下:
http://img708.imageshack.us/img708/1972/noiconnocaptionform.png
我通常会创建一个基类,用我所有时髦的扩展行为实现 Form,然后让我的实际表单实现该基类,但如果您只需要一个 Form,只需将其全部放在那里。