簡體   English   中英

如何使用 DWMWA_ALLOW_NCPAINT

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM