Set color on TabControl border

Louis Dolbecq 1 Reputation point
2022-03-21T20:33:58.98+00:00

Hi everyone,

I'm actually making a C# winforms application and i want to make a dark theme.

I already found how to apply dark theme on menutoolstrip but right now i'm stuck onhow apply it to Tabcontrol border and TabPages header.

Is someone know how to make that ?

This is my code:

using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Diagnostics;

namespace NUTs___Network_Utility_Tools
{
    public partial class MainForm : Form
    {

        public
            IPAddressCollection
            DnsAddresses
        { get; }

        public MainForm()
        {
            InitializeComponent();
            switchtoen_menuBtn.Enabled = false;
            ltheme_menuBtn.Enabled = false;
        }

        #region french_Ver
        private void chng_FR(object sender, EventArgs e)
        {
            #region form_Content
            this.Text = "NUTs - un utilitaire réseau";
            language_menuItem.Text = "Langue";
            switchtofr_menuBtn.Text = "Passer en français";
            switchtoen_menuBtn.Text = "Passer en anglais";
            switchtofr_menuBtn.Enabled = false;
            switchtoen_menuBtn.Enabled = true;
            #endregion

            #region chng_FR_Tab
            networkinfos_tabPage.Text = "Vos informations réseau";
            changeparameters_tabPage.Text = "Changer vos paramètres réseau";
            ip_richTxtBx1.Text = "Adresse IP";
            ip_richTxtBx2.Text = "Adresse IP";
            subnetmask_richTxtBx1.Text = "Masque de sous réseau";
            subnetmask_richTxtBx2.Text = "Masque de sous réseau";
            defgateway_richTxtBx1.Text = "Passerelle par défaut";
            defgateway_richTxtBx2.Text = "Passerelle par défaut";
            primdns_richTxtBx1.Text = "Adresse DNS primaire";
            primdns_richTxtBx2.Text = "Adresse DNS primaire";
            secdns_richTxtBx1.Text = "Adresse DNS secondaire";
            secdns_richTxtBx2.Text = "Adresse DNS secondaire";
            retrieveinfos_Btn.Text = "RECUPERER INFOS";
            setStaticparams_Btn.Text = "APPLIQUER PARAMETRES STATIQUE";
            setDynamicparams_Btn.Text = "APPLIQUER PARAMETRES DHCP";
            ip_TxtBx1.Text = "";
            subnetmask_TxtBx1.Text = "";
            defgateway_TxtBx1.Text = "";
            primdns_TxtBx1.Text = "";
            secdns_TxtBx1.Text = "";
            #endregion
        }
        #endregion

        #region english_Ver
        private void chng_EN(object sender, EventArgs e)
        {
            #region form_Content
            this.Text = "NUTs - a network utility tool";
            language_menuItem.Text = "Language";
            switchtofr_menuBtn.Text = "Switch to french";
            switchtoen_menuBtn.Text = "Switch to english";
            switchtofr_menuBtn.Enabled = true;
            switchtoen_menuBtn.Enabled = false;
            #endregion

            #region chng_EN_Tab
            networkinfos_tabPage.Text = "Your network informations";
            changeparameters_tabPage.Text = "Change your network parameters";
            ip_richTxtBx1.Text = "IP Address";
            ip_richTxtBx2.Text = "IP Address";
            subnetmask_richTxtBx1.Text = "Subnet mask";
            subnetmask_richTxtBx2.Text = "Subnet mask";
            defgateway_richTxtBx1.Text = "Default gateway";
            defgateway_richTxtBx2.Text = "Default gateway";
            primdns_richTxtBx1.Text = "Primary DNS address";
            primdns_richTxtBx2.Text = "Primary DNS address";
            secdns_richTxtBx1.Text = "Secondary DNS address";
            secdns_richTxtBx2.Text = "Secondary DNS address";
            retrieveinfos_Btn.Text = "RETRIEVE INFOS";
            setStaticparams_Btn.Text = "APPLY STATIC PARAMETERS";
            setDynamicparams_Btn.Text = "APPLY DHCP PARAMETERS";
            ip_TxtBx1.Text = "";
            subnetmask_TxtBx1.Text = "";
            defgateway_TxtBx1.Text = "";
            primdns_TxtBx1.Text = "";
            secdns_TxtBx1.Text = "";
            #endregion
        }
        #endregion

        #region retrieve_infos
        private void retrieve_Infos(object sender, EventArgs e)
        {
            foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (adapter.Name.Contains("Ethernet") || adapter.Name.Contains("Wi-Fi"))
                {
                    if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && adapter.OperationalStatus == OperationalStatus.Up || adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.OperationalStatus == OperationalStatus.Up)
                    {
                        foreach (UnicastIPAddressInformation ip in adapter.GetIPProperties().UnicastAddresses)
                        {
                            if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
                            {
                                ip_TxtBx1.Text = (ip.Address.ToString());
                                subnetmask_TxtBx1.Text = (ip.IPv4Mask.ToString());
                            }
                        }
                        foreach (GatewayIPAddressInformation defgateway in adapter.GetIPProperties().GatewayAddresses)
                        {
                            defgateway_TxtBx1.Text = (defgateway.Address.ToString());
                        }
                    }
                }
            }
            foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (adapter.Name.Contains("Ethernet") || adapter.Name.Contains("Wi-Fi"))
                {
                    IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
                    IPAddressCollection dnsServers = adapterProperties.DnsAddresses;

                    if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && adapter.OperationalStatus == OperationalStatus.Up || adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.OperationalStatus == OperationalStatus.Up)
                    {
                        foreach (UnicastIPAddressInformation ip in adapter.GetIPProperties().UnicastAddresses)
                        {
                            if (dnsServers.Count > 0 && ip.Address.AddressFamily == AddressFamily.InterNetwork)
                            {
                                foreach (IPAddress dns in dnsServers)
                                {
                                    primdns_TxtBx1.Text = dnsServers[0].ToString();
                                    secdns_TxtBx1.Text = dnsServers[1].ToString();
                                }
                            }
                        }
                    }
                }
            }
        }
        #endregion

        #region change_toStatic
        private void set_StaticParams(object sender, EventArgs e)
        {
            foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (adapter.Name.Contains("Ethernet") || adapter.Name.Contains("Wi-Fi"))
                {
                    if (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.OperationalStatus == OperationalStatus.Up)
                    {
                        ProcessStartInfo psi = new ProcessStartInfo("cmd.exe");
                        psi.UseShellExecute = true;
                        psi.WindowStyle = ProcessWindowStyle.Hidden;
                        psi.Verb = "runas";
                        psi.Arguments = ("/c netsh interface ip set address " + adapter.Name + " static " + ip_TxtBx2.Text + " " + subnetmask_TxtBx2.Text + " " + defgateway_TxtBx2.Text + " & netsh interface ip set dns " + adapter.Name + " static " + primdns_TxtBx2.Text + "& netsh interface ip add dns " + adapter.Name + secdns_TxtBx2 + "index=2");
                        Process.Start(psi);
                    }
                    else if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && adapter.OperationalStatus == OperationalStatus.Up)
                    {
                        ProcessStartInfo psi = new ProcessStartInfo("cmd.exe");
                        psi.UseShellExecute = true;
                        psi.WindowStyle = ProcessWindowStyle.Hidden;
                        psi.Verb = "runas";
                        psi.Arguments = ("/c netsh interface ip set address " + adapter.Name + " static " + ip_TxtBx2.Text + " " + subnetmask_TxtBx2.Text + " " + defgateway_TxtBx2.Text + " & netsh interface ip set dns " + adapter.Name + " static " + primdns_TxtBx2.Text + "& netsh interface ip add dns " + adapter.Name + secdns_TxtBx2 + "index=2");
                        Process.Start(psi);
                    }
                }
            }
            ip_TxtBx2.Clear();
            subnetmask_TxtBx2.Clear();
            defgateway_TxtBx2.Clear();
            primdns_TxtBx2.Clear();
            secdns_TxtBx2.Clear();
        }
        #endregion

        #region change_toDynamic
        private void set_DyanmicParams(object sender, EventArgs e)
        {
            foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (adapter.Name.Contains("Ethernet") || adapter.Name.Contains("Wi-Fi"))
                {
                    if (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.OperationalStatus == OperationalStatus.Up)
                    {
                        ProcessStartInfo psi = new ProcessStartInfo("cmd.exe");
                        psi.UseShellExecute = true;
                        psi.WindowStyle = ProcessWindowStyle.Hidden;
                        psi.Verb = "runas";
                        psi.Arguments = ("/c netsh interface ip set address " + adapter.Name + " dhcp " + " & netsh interface ip set dns " + adapter.Name + " dhcp ");
                        Process.Start(psi);
                    }
                    else if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && adapter.OperationalStatus == OperationalStatus.Up)
                    {
                        ProcessStartInfo psi = new ProcessStartInfo("cmd.exe");
                        psi.UseShellExecute = true;
                        psi.WindowStyle = ProcessWindowStyle.Hidden;
                        psi.Verb = "runas";
                        psi.Arguments = ("/c netsh interface ip set address " + adapter.Name + " dhcp " + " & netsh interface ip set dns " + adapter.Name + " dhcp ");
                        Process.Start(psi);
                    }
                }
            }
        }
        #endregion

        #region darkMode
        private void enable_dMode(object sender, EventArgs e)
        {
            menu_menuStrip.Renderer = new ToolStripProfessionalRenderer(new MyColorTable());
            this.BackColor = Color.FromArgb(45, 45, 45);
            language_menuItem.ForeColor = Color.White;
            switchtoen_menuBtn.ForeColor = Color.White;
            switchtofr_menuBtn.ForeColor = Color.White;
            enablethemes_menuItem.ForeColor = Color.White;
            dtheme_menuBtn.ForeColor = Color.White;
            dtheme_menuBtn.Enabled = false;
            ltheme_menuBtn.ForeColor = Color.White;
            ltheme_menuBtn.Enabled = true;
            networkinfos_tabPage.BackColor = Color.FromArgb(45, 45, 45);
            changeparameters_tabPage.BackColor = Color.FromArgb(45, 45, 45);

        }
        #endregion

        #region tableColor
        public class MyColorTable : ProfessionalColorTable
        {
            public override Color ToolStripDropDownBackground
            {
                get
                {
                    return Color.FromArgb(45, 45, 45);
                }
            }

            public override Color ImageMarginGradientBegin
            {
                get
                {
                    return Color.FromArgb(45, 45, 45);
                }
            }

            public override Color ImageMarginGradientMiddle
            {
                get
                {
                    return Color.FromArgb(45, 45, 45);
                }
            }

            public override Color ImageMarginGradientEnd
            {
                get
                {
                    return Color.FromArgb(45, 45, 45);
                }
            }

            public override Color MenuBorder
            {
                get
                {
                    return Color.Black;
                }
            }

            public override Color MenuItemBorder
            {
                get
                {
                    return Color.Black;
                }
            }

            public override Color MenuItemSelected
            {
                get
                {
                    return Color.FromArgb(45, 45, 45);
                }
            }

            public override Color MenuStripGradientBegin
            {
                get
                {
                    return Color.FromArgb(45, 45, 45);
                }
            }

            public override Color MenuStripGradientEnd
            {
                get
                {
                    return Color.FromArgb(45, 45, 45);
                }
            }

            public override Color MenuItemSelectedGradientBegin
            {
                get
                {
                    return Color.FromArgb(45, 45, 45);
                }
            }

            public override Color MenuItemSelectedGradientEnd
            {
                get
                {
                    return Color.FromArgb(45, 45, 45);
                }
            }

            public override Color MenuItemPressedGradientBegin
            {
                get
                {
                    return Color.FromArgb(45, 45, 45);
                }
            }

            public override Color MenuItemPressedGradientEnd
            {
                get
                {
                    return Color.FromArgb(45, 45, 45);
                }
            }
        }
        #endregion

    }
}

(Sorry for my bad english)

Developer technologies C#
0 comments No comments
{count} votes

3 answers

Sort by: Most helpful
  1. Jack J Jun 25,296 Reputation points
    2022-03-22T03:08:20.8+00:00

    @Louis Dolbecq , Welcome to Microsoft Q&A, you could try the following method to color the tabpage's header and border.

      private void Form1_Load(object sender, EventArgs e)  
            {  
                menuStrip1.Renderer = new ToolStripProfessionalRenderer(new MyColorTable());  
                this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;  
                this.tabControl1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tabControl1_DrawItem);  
                  
            }  
      
            
            private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)  
            {  
                // Set Border header  
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(45, 45, 45)), e.Bounds);  
                Rectangle paddedBounds = e.Bounds;  
                paddedBounds.Inflate(-2, -2);  
                e.Graphics.DrawString(tabControl1.TabPages[e.Index].Text, this.Font, SystemBrushes.HighlightText, paddedBounds);  
                  
                //set  Tabcontrol border  
                Graphics g = e.Graphics;  
                Pen p = new Pen(Color.FromArgb(45, 45, 45), 10);  
                g.DrawRectangle(p, tabPage1.Bounds);                                                                                                             
              
      
            
            private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)  
            {  
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(45, 45, 45)), e.Bounds);  
                Rectangle paddedBounds = e.Bounds;  
                paddedBounds.Inflate(-2, -2);  
                e.Graphics.DrawString(tabControl1.TabPages[e.Index].Text, this.Font, SystemBrushes.HighlightText, paddedBounds);  
                Graphics g = e.Graphics;  
                Pen p = new Pen(Color.FromArgb(45, 45, 45), 10);  
                g.DrawRectangle(p, tabPage1.Bounds);  
            }  
    

    Result:

    185420-image.png

    Hope this could help you

    Best Regards,
    Jack


    If the answer is the right solution, please click "Accept Answer" and upvote it.If you have extra questions about this answer, please click "Comment".

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.


  2. Louis Dolbecq 1 Reputation point
    2022-03-25T15:10:04.413+00:00

    I try to get back to .NET Framework 4.7.2 (i was on .NET 6.0) but problem always here (i made a simple winform with only menustrip and tabcontrol to test).

    0 comments No comments

  3. Castorix31 90,521 Reputation points
    2022-03-25T18:58:11.767+00:00

    From comments, a test by overriding WM_PAINT to replace Tab Control background color (behind the Pages, the Pages using parent Form.BackColor)
    (add using System.Runtime.InteropServices; at beginning and replace default TabControl class by this one named TabControlPaint ) :

    187018-tabcontrol-paint.jpg

    public partial class Form1 : Form  
    {       
        public Form1()  
        {  
            InitializeComponent();  
        }  
    
        //Color colorBackgroundDark = Color.FromArgb(255, 32, 32, 32);  
        Color colorBackgroundDark = Color.FromArgb(255, 39, 39, 39);  
        //Color colorBackgroundDark = Color.Blue;  
        //Color colorBackgroundDark = SystemColors.ControlDarkDark;   
    
        private void Form1_Load(object sender, EventArgs e)  
        {  
            BackColor = colorBackgroundDark;  
             
            //button1.BackColor = Color.Black;  
            //button1.ForeColor = Color.White;  
            //textBox1.BackColor = Color.Black;  
            //textBox1.ForeColor = Color.White;  
        }  
    }  
    
    [Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(System.ComponentModel.Design.IDesigner))]  
    public partial class TabControlPaint : TabControl  
    {  
        public enum HRESULT : int  
        {  
            S_OK = 0,  
            S_FALSE = 1,  
            E_NOINTERFACE = unchecked((int)0x80004002),  
            E_NOTIMPL = unchecked((int)0x80004001),  
            E_FAIL = unchecked((int)0x80004005),  
            E_UNEXPECTED = unchecked((int)0x8000FFFF),  
            E_OUTOFMEMORY = unchecked((int)0x8007000E)  
        }  
    
        [DllImport("UxTheme.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern IntPtr BeginBufferedPaint(IntPtr hdcTarget, ref RECT prcTarget, BP_BUFFERFORMAT dwFormat, IntPtr pPaintParams, out IntPtr phdc);  
    
        public enum BP_BUFFERFORMAT  
        {  
            BPBF_COMPATIBLEBITMAP,  
            BPBF_DIB,  
            BPBF_TOPDOWNDIB,  
            BPBF_TOPDOWNMONODIB  
        }  
    
        [DllImport("UxTheme.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern HRESULT EndBufferedPaint(IntPtr hBufferedPaint, bool fUpdateTarget);  
    
        [DllImport("UxTheme.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern HRESULT BufferedPaintInit();  
    
        [DllImport("UxTheme.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern HRESULT BufferedPaintUnInit();  
    
        [DllImport("User32.dll", SetLastError = true)]  
        public static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);  
    
        [StructLayout(LayoutKind.Sequential)]  
        public 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;  
            }  
        }  
    
        [DllImport("Gdi32.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern IntPtr CreateCompatibleDC(IntPtr hDC);  
    
        [DllImport("Gdi32.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth, int nHeight);  
    
        [DllImport("Gdi32.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);  
    
        [DllImport("Gdi32.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern bool DeleteDC(IntPtr hDC);  
    
        [DllImport("Gdi32.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern bool DeleteObject(IntPtr ho);  
    
        [DllImport("Gdi32.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern IntPtr CreateSolidBrush(int crColor);  
    
        [DllImport("Msimg32.dll", SetLastError = true)]  
        public static extern bool TransparentBlt(IntPtr hdcDest, int xoriginDest, int yoriginDest, int wDest, int hDest, IntPtr hdcSrc, int xoriginSrc, int yoriginSrc, int wSrc, int hSrc, uint crTransparent);  
    
        [DllImport("Gdi32.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern bool BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);  
    
        public const int SRCCOPY = 0x00CC0020;  
    
        [DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern bool FillRect(IntPtr hdc, [In] ref RECT rect, IntPtr hbrush);  
    
        [DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)]  
        public static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, IntPtr lParam);  
    
        public const int WM_PRINT = 0x0317;  
        public const int WM_PRINTCLIENT = 0x0318;  
    
        public const int PRF_CHECKVISIBLE = 0x00000001;  
        public const int PRF_NONCLIENT = 0x00000002;  
        public const int PRF_CLIENT = 0x00000004;  
        public const int PRF_ERASEBKGND = 0x00000008;  
        public const int PRF_CHILDREN = 0x00000010;  
        public const int PRF_OWNED = 0x00000020;  
    
        [DllImport("User32.dll", SetLastError = true, ExactSpelling = true, EntryPoint = "BeginPaint", CharSet = CharSet.Auto)]  
        private static extern int BeginPaint(IntPtr hWnd, [In, Out] ref PAINTSTRUCT lpPaint);  
    
        [DllImport("User32.dll", SetLastError = true, ExactSpelling = true, EntryPoint = "EndPaint", CharSet = CharSet.Auto)]  
        private static extern bool EndPaint(IntPtr hWnd, ref PAINTSTRUCT lpPaint);  
    
        [StructLayout(LayoutKind.Sequential)]  
        public struct PAINTSTRUCT  
        {  
            public IntPtr hdc;  
            public bool fErase;  
            public int rcPaint_left;  
            public int rcPaint_top;  
            public int rcPaint_right;  
            public int rcPaint_bottom;  
            public bool fRestore;  
            public bool fIncUpdate;  
            public int reserved1;  
            public int reserved2;  
            public int reserved3;  
            public int reserved4;  
            public int reserved5;  
            public int reserved6;  
            public int reserved7;  
            public int reserved8;  
        }  
    
        public const int WM_PAINT = 0x000F;  
    
        public TabControlPaint()  
        {  
            BufferedPaintInit();  
            //this.SetStyle(ControlStyles.UserPaint, true);  
            this.DrawMode = TabDrawMode.OwnerDrawFixed;  
            this.DrawItem += new System.Windows.Forms.DrawItemEventHandler(tabControl_DrawItem);            
        }  
    
        protected override void OnCreateControl()  
        {  
            base.OnCreateControl();  
            ((Form)this.Parent).Closing += new CancelEventHandler(Parent_Closing);  
            ((Form)this.Parent).Load += Parent_Load;  
        }  
    
        private void Parent_Load(object sender, EventArgs e)  
        {  
            foreach (TabPage tp in this.TabPages)  
            {  
                tp.BackColor = this.Parent.BackColor;  
            }  
        }  
    
        private void Parent_Closing(object sender, CancelEventArgs e)  
        {  
            BufferedPaintUnInit();  
        }  
    
        private void tabControl_DrawItem(object sender, DrawItemEventArgs e)  
        {  
            TabControl tc = (TabControl)sender;  
            TabPage tp = tc.TabPages[e.Index];  
            SolidBrush backBrush = (e.State == DrawItemState.Selected) ? new SolidBrush(tp.BackColor) : new SolidBrush(Color.Black);  
            e.Graphics.FillRectangle(backBrush, e.Bounds);  
            Rectangle rectBounds = e.Bounds;  
            int nYOffset = (e.State == DrawItemState.Selected) ? -1 : 1;  
            rectBounds.Offset(1, nYOffset);  
            Color textColor = (e.State == DrawItemState.Selected) ? Color.White : Color.LightGray;  
            Color backColor = this.Parent.BackColor;  
            if (backColor == SystemColors.Control)  
                textColor = (e.State == DrawItemState.Selected) ? Color.Black : Color.LightGray;  
            TextRenderer.DrawText(e.Graphics, tp.Text, e.Font, rectBounds, textColor);  
        }  
    
        protected override void WndProc(ref Message m)  
        {  
            if (m.Msg == WM_PAINT)  
            {  
                PAINTSTRUCT ps = new PAINTSTRUCT();  
                IntPtr hDC = (IntPtr)BeginPaint(m.HWnd, ref ps);  
    
                IntPtr targetDC = hDC;  
                IntPtr bufferedDC = IntPtr.Zero;  
                HRESULT hr = HRESULT.S_OK;  
                RECT rectClient;  
                GetClientRect(this.Handle, out rectClient);  
    
                IntPtr pb = BeginBufferedPaint(targetDC, ref rectClient, BP_BUFFERFORMAT.BPBF_TOPDOWNDIB, IntPtr.Zero, out bufferedDC);  
                IntPtr hDCMem = CreateCompatibleDC(hDC);  
                IntPtr hBitmap = CreateCompatibleBitmap(hDC, rectClient.right - rectClient.left, rectClient.bottom - rectClient.top);  
                IntPtr hBitmapOld = SelectObject(hDCMem, hBitmap);  
    
                // Copie control image into Memory DC with custom color as background  
                IntPtr hBrush1 = CreateSolidBrush(ColorTranslator.ToWin32(Color.FromArgb(255, 255, 254, 255)));  
                FillRect(hDCMem, ref rectClient, hBrush1);  
                DeleteObject(hBrush1);  
    
                SendMessage(this.Handle, WM_PRINTCLIENT, (int)hDCMem, (IntPtr)PRF_CLIENT);  
                IntPtr hDCMem2 = CreateCompatibleDC(hDC);  
                IntPtr hBitmap2 = CreateCompatibleBitmap(hDC, rectClient.right - rectClient.left, rectClient.bottom - rectClient.top);  
                IntPtr hBitmapOld2 = SelectObject(hDCMem2, hBitmap2);  
    
                // Custom color => Back color  
                IntPtr hBrush2 = CreateSolidBrush(ColorTranslator.ToWin32(this.Parent.BackColor));  
                FillRect(hDCMem2, ref rectClient, hBrush2);  
                DeleteObject(hBrush2);  
                TransparentBlt(hDCMem2, 0, 0, rectClient.right - rectClient.left, rectClient.bottom - rectClient.top, hDCMem, 0, 0,  
                    rectClient.right - rectClient.left, rectClient.bottom - rectClient.top, (uint)ColorTranslator.ToWin32(Color.FromArgb(255, 255, 254, 255)));  
                BitBlt(bufferedDC, 0, 0, rectClient.right - rectClient.left, rectClient.bottom - rectClient.top, hDCMem2, 0, 0, SRCCOPY);  
    
                SelectObject(hDCMem, hBitmapOld);  
                DeleteObject(hBitmap);  
                DeleteDC(hDCMem);  
                SelectObject(hDCMem2, hBitmapOld2);  
                DeleteObject(hBitmap2);  
                DeleteDC(hDCMem2);  
    
                hr = EndBufferedPaint(pb, true);  
    
                EndPaint(m.HWnd, ref ps);  
                m.Result = IntPtr.Zero;  
            }            
            else  
                base.WndProc(ref m);  
        }       
    }  
    

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.