Подтвердить что ты не робот

Настройка цвета заголовка и границ

Я пытаюсь изменить программную строку заголовка приложения и границы. Я пробовал много вещей, но безуспешно, и решил изменить эти цвета по всей системе. Потому что для меня также приемлемо изменять цвета заголовка и границ, когда мое приложение запущено, и вернуть их обратно в конце моего приложения. (Управляемая среда с небольшим набором приложений)

Можно ли динамически изменять эти цвета (общесистемные или общесистемные, если не возможно изменение процесса)? Можете ли вы предложить какой-либо способ достичь этого?

Я пробовал что-то вроде следующего, но он не делает то, что я хочу:

int aElements[2] = {COLOR_WINDOW, COLOR_ACTIVECAPTION};
DWORD aOldColors[2];
DWORD aNewColors[2];

aOldColors[0] = GetSysColor(aElements[0]); 
aOldColors[1] = GetSysColor(aElements[1]); 
aNewColors[0] = RGB(0x80, 0x80, 0x80);  // light gray 
aNewColors[1] = RGB(0x80, 0x00, 0x80);  // dark purple 

SetSysColors(2, aElements, aNewColors);
SetSysColors(2, aElements, aOldColors);

Заранее спасибо

ИЗМЕНИТЬ

Это именно то, что я хочу:

введите описание изображения здесь

4b9b3361

Ответ 1

Я знаю, что вы используете С++, но мне удобно с С#. Чтобы вы могли подумать, посмотрите на следующий код, который изменяет внешний вид формы.

[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);
        }
    }
}

Кроме того, вы можете использовать проект Рисование пользовательских границ в Windows Forms из CodePlex. Этот проект представляет собой небольшую библиотеку, которая позволяет пользователям настраивать Windows Forms, например, настраивать неклиентскую область Windows.

Ответ 2

Я не рекомендую настраивать перерисовку границ и заголовков. Это действительно сложно сделать правильно. Офис просто рисует все сам по себе в клиентской области, но использует обычную границу. Используя NC_PAINT, правильный путь - это боль и может вызвать мерцание. Особенно удобно размещать кнопки минимизации, максимизации и закрытия, потому что все окна делают это по-другому. Также учитывайте доступность, используемые большие шрифты, настраиваемые пользовательские настройки.

Какова цель изменения цветов?

Чтобы изменить глобальные цвета, вы должны по крайней мере отделить свой код

//вызываем это один раз при запуске вашего приложения (например, в WM_CREATE)

SetSysColors(2, aElements, aNewColors); 

//вызывать это при закрытии приложения (например, в WM_DESTROY)

SetSysColors(2, aElements, aOldColors); 

Ответ 3

Удалить второй SetSysColors (2, aElements, aOldColors); строка кода, которая возвращается к цвету orignal, а затем повторите попытку. Пример кода, который у вас есть, почти идентичен ссылке MSDN https://msdn.microsoft.com/en-us/library/windows/desktop/ms724940%28v=vs.85%29.aspx минус сон. Их пример показывает, как установить цвет, спать и затем вернуться обратно.