我想DWMWA_ALLOW_NCPAINT在非客戶端區域使用繪圖,但我不知道如何使用它,有人可以幫助我嗎?
uj5u.com熱心網友回復:
它是一個常量,您可以將它傳遞給Win32API 函式DwmSetWindowAttribute。您不能將其與功能一起使用DwmGetWindowAttribute。它是“僅設定”。
要從托管代碼呼叫本機函式,在您的情況下DwmSetWindowAttribute,您應該使用P/Invoke.
在下面的代碼中,您可以看到如何定義本機函式的簽名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);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/506402.html
上一篇:如何使用帶有后臺作業人員的文本框textChanged屬性來填充datagridview
下一篇:是什么導致了僵局?
