Setting title bar and border colors programmatically

前端 未结 3 979
暗喜
暗喜 2021-01-01 11:45

I am trying to change my application\' s title bar and border colors programmatically. I tried lots of things but with no success, and decided to change these colors system-

相关标签:
3条回答
  • 2021-01-01 12:03

    I know you are using C++, but I am handy with C#. So that you may get some idea, take look at the following code, which modifies form appearance.

    [DllImport("User32.dll", CharSet = CharSet.Auto)]
    public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
    
    [DllImport("User32.dll")]
    private static extern IntPtr GetWindowDC(IntPtr hWnd);
    
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        const int WM_NCPAINT = 0x85;
        if (m.Msg == WM_NCPAINT)
        {
            IntPtr hdc = GetWindowDC(m.HWnd);
            if ((int)hdc != 0)
            {
                Graphics g = Graphics.FromHdc(hdc);
                g.FillRectangle(Brushes.Green, new Rectangle(0, 0, 4800, 23));
                g.Flush();
                ReleaseDC(m.HWnd, hdc);
            }
        }
    }
    

    Also, you could use the Drawing Custom Borders in Windows Forms project from CodePlex. This project is a tiny library that allows users to customize Windows Forms, like customizing a windows' non-client area.

    0 讨论(0)
  • 2021-01-01 12:20

    Remove the second SetSysColors(2, aElements, aOldColors); line of code, which reverts back to the orignal color and then try again. The code example you have seems almost identical to the MSDN link https://msdn.microsoft.com/en-us/library/windows/desktop/ms724940%28v=vs.85%29.aspx link minus the sleep. Their example shows how to set color, sleeps and then reverts back.

    0 讨论(0)
  • 2021-01-01 12:22

    I don't recommend to customize border and title redrawing. It's really hard to do it the right way. Office just draws everything by itself in the client area but using normal border. Using NC_PAINT the right way is a pain and may introduce flickering. Especially positioning the minimize,maximize and close buttons is difficult, because every windows does it differently. Also take into account accessibility, larger fonts used, customized user settings.

    Whats the purpose of changing the colors?

    To change the global colors you have to at least separate your code

    // call this once at startup of your application (e.g. in WM_CREATE)

    SetSysColors(2, aElements, aNewColors); 
    

    // call this when closing you application (e.g. in WM_DESTROY)

    SetSysColors(2, aElements, aOldColors); 
    
    0 讨论(0)
提交回复
热议问题