c++ - titulo - color y apariencia de las ventanas windows 10
Establecer la barra de tÃtulo y los colores del borde mediante programación (3)
Estoy tratando de cambiar la barra de título de mi aplicación y los colores del borde mediante programación. Intenté muchas cosas pero sin éxito, y decidí cambiar estos colores en todo el sistema. Debido a que también es aceptable para mí cambiar la barra de título y los colores del borde a medida que mi aplicación se está ejecutando, y los invierto de nuevo al final de mi aplicación. (Entorno administrado, con un pequeño conjunto de aplicaciones ejecutándose)
¿Es posible cambiar estos colores dinámicamente (en todo el proceso, o en todo el sistema a menos que sea posible un cambio en todo el proceso)? ¿Puedes sugerir alguna forma de lograr esto?
Intenté algo como lo siguiente pero no hago lo que quiero:
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);
Gracias por adelantado
EDITAR
Esto es exactamente lo que quiero:
Elimine el segundo SetSysColors (2, aElements, aOldColors); línea de código, que vuelve al color original y luego vuelve a intentarlo. El ejemplo de código que tiene parece casi idéntico al enlace de MSDN https://msdn.microsoft.com/en-us/library/windows/desktop/ms724940%28v=vs.85%29.aspx enlace menos el modo de suspensión. Su ejemplo muestra cómo establecer el color, duerme y luego revierte.
No recomiendo personalizar el redibujado de bordes y títulos. Es realmente difícil hacerlo de la manera correcta. Office simplemente dibuja todo por sí mismo en el área del cliente pero usando el borde normal. Usar NC_PAINT de la manera correcta es un dolor y puede introducir parpadeos. Especialmente posicionar los botones minimizar, maximizar y cerrar es difícil, porque cada ventana lo hace de manera diferente. También tenga en cuenta la accesibilidad, las fuentes más grandes utilizadas, la configuración de usuario personalizada.
¿Cuál es el propósito de cambiar los colores?
Para cambiar los colores globales, al menos debe separar su código
// llama esto una vez al inicio de tu aplicación (por ejemplo, en WM_CREATE)
SetSysColors(2, aElements, aNewColors);
// llama esto al cerrar tu aplicación (por ejemplo, en WM_DESTROY)
SetSysColors(2, aElements, aOldColors);
Sé que estás usando C ++, pero estoy a mano con C #. Para que pueda hacerse una idea, observe el siguiente código, que modifica la apariencia del formulario.
[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);
}
}
}
Además, podría usar los Bordes personalizados de dibujo en el proyecto de Windows Forms desde CodePlex. Este proyecto es una pequeña biblioteca que permite a los usuarios personalizar formularios de Windows, como la personalización de un área de Windows que no es cliente.