![](/img/trans.png)
[英]Possible to use WM_NCPAINT and still get the shadow behind a window on Aero?
[英]How to use DWMWA_ALLOW_NCPAINT
我想使用DWMWA_ALLOW_NCPAINT
在非客戶端區域進行繪圖,但我不知道如何使用它,有人可以幫助我嗎?
這是一個常量,您可以將其傳遞給Win32
API function DwmSetWindowAttribute
。 您不能將它與 function DwmGetWindowAttribute
使用。 它是“僅設置”。
要從托管代碼調用本機 function,在您的情況下,它是DwmSetWindowAttribute
,您應該使用P/Invoke
。
在下面的代碼中,您可以看到如何定義原生 function DwmSetWindowAttribute
的簽名並將常量DWMWA_ALLOW_NCPAINT
傳遞給它。
PS :但是,我認為使用DWMWA_ALLOW_NCPAINT
來繪制非客戶區是不夠的。 SO上有很多這樣的話題。 你可以搜索一下。
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace DWMWA_ALLOW_NCPAINT
{
public partial class MainForm : Form
{
public Form1()
{
InitializeComponent();
}
private IntPtr TRUE;
private IntPtr FALSE;
protected override void OnHandleCreated(EventArgs e)
{
TRUE = Marshal.AllocHGlobal(sizeof(int));
Marshal.WriteInt32(TRUE, 1);
FALSE = Marshal.AllocHGlobal(sizeof(int));
Marshal.WriteInt32(TRUE, 0);
EnableNCPaint(Handle);
//DisableNCPaint(Handle);
base.OnHandleCreated(e);
}
private void EnableNCPaint(IntPtr hwnd)
{
DwmSetWindowAttribute(hwnd, (int)DWMWINDOWATTRIBUTE.DWMWA_ALLOW_NCPAINT, TRUE, sizeof(int));
}
private void DisableNCPaint(IntPtr hwnd)
{
DwmSetWindowAttribute(hwnd, (int)DWMWINDOWATTRIBUTE.DWMWA_ALLOW_NCPAINT, FALSE, sizeof(int));
}
enum DWMNCRENDERINGPOLICY
{
DWMNCRP_USEWINDOWSTYLE,
DWMNCRP_DISABLED,
DWMNCRP_ENABLED,
DWMNCRP_LAST
};
[Flags]
enum DWMWINDOWATTRIBUTE : uint
{
DWMWA_NCRENDERING_ENABLED = 1,
DWMWA_NCRENDERING_POLICY,
DWMWA_TRANSITIONS_FORCEDISABLED,
DWMWA_ALLOW_NCPAINT,
DWMWA_CAPTION_BUTTON_BOUNDS,
DWMWA_NONCLIENT_RTL_LAYOUT,
DWMWA_FORCE_ICONIC_REPRESENTATION,
DWMWA_FLIP3D_POLICY,
DWMWA_EXTENDED_FRAME_BOUNDS,
DWMWA_HAS_ICONIC_BITMAP,
DWMWA_DISALLOW_PEEK,
DWMWA_EXCLUDED_FROM_PEEK,
DWMWA_CLOAK,
DWMWA_CLOAKED,
DWMWA_FREEZE_REPRESENTATION,
DWMWA_LAST
};
[DllImport("dwmapi.dll")]
private static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, IntPtr pvAttribute, int cbAttribute);
[DllImport("dwmapi.dll")]
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int dwAttribute, IntPtr pvAttribute, int cbAttribute);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.