Настройка цвета заголовка и границ
Я пытаюсь изменить программную строку заголовка приложения и границы. Я пробовал много вещей, но безуспешно, и решил изменить эти цвета по всей системе. Потому что для меня также приемлемо изменять цвета заголовка и границ, когда мое приложение запущено, и вернуть их обратно в конце моего приложения. (Управляемая среда с небольшим набором приложений)
Можно ли динамически изменять эти цвета (общесистемные или общесистемные, если не возможно изменение процесса)? Можете ли вы предложить какой-либо способ достичь этого?
Я пробовал что-то вроде следующего, но он не делает то, что я хочу:
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);
Заранее спасибо
ИЗМЕНИТЬ
Это именно то, что я хочу:
![введите описание изображения здесь]()
Ответы
Ответ 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 минус сон. Их пример показывает, как установить цвет, спать и затем вернуться обратно.