web-dev-qa-db-fra.com

Définition de la barre de titre et des couleurs de bordure par programmation

J'essaie de modifier la barre de titre et les couleurs de bordure de mon application par programmation. J'ai essayé beaucoup de choses mais sans succès et j'ai décidé de changer ces couleurs à l'échelle du système. Parce qu'il est également acceptable pour moi de modifier la barre de titre et les couleurs de bordure pendant que mon application est en cours d'exécution, et de les rétablir à la fin de mon application. (Environnement géré, avec un petit ensemble d'applications en cours d'exécution)

Est-il possible de changer ces couleurs dynamiquement (à l'échelle du processus ou à l'échelle du système, sauf si un changement à l'échelle du processus est possible)? Pouvez-vous suggérer un moyen d'y parvenir?

J'ai essayé quelque chose comme ceci mais il ne fait pas ce que je veux:

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

Merci d'avance

[~ # ~] modifier [~ # ~]

C'est exactement ce que je veux:

enter image description here

23
Alpay

Je ne recommande pas de personnaliser la redéfinition des bordures et des titres. C'est vraiment difficile de le faire correctement. Office dessine tout simplement par lui-même dans la zone client mais en utilisant une bordure normale. Utiliser NC_Paint dans le bon sens est une douleur et peut introduire un scintillement. Il est particulièrement difficile de positionner les boutons minimiser, maximiser et fermer, car chaque fenêtre le fait différemment. Tenez également compte de l'accessibilité, des polices plus grandes utilisées, des paramètres utilisateur personnalisés.

Quel est le but de changer les couleurs?

Pour changer les couleurs globales, vous devez au moins séparer votre code

// appelle ceci une fois au démarrage de votre application (par exemple dans WM_CREATE)

SetSysColors(2, aElements, aNewColors); 

// appelle cela lors de la fermeture de votre application (par exemple dans WM_DESTROY)

SetSysColors(2, aElements, aOldColors); 
4
lexx9999

Supprimez le deuxième SetSysColors (2, aElements, aOldColors); ligne de code, qui revient à la couleur d'origine, puis réessayez. L'exemple de code que vous avez semble presque identique au lien MSDN https://msdn.Microsoft.com/en-us/library/windows/desktop/ms724940%28v=vs.85%29.aspx lien moins le sommeil. Leur exemple montre comment définir la couleur, s'endort puis revient en arrière.

2
Joe

Je sais que vous utilisez C++, mais je suis à portée de main avec C #. Pour vous faire une idée, consultez le code suivant, qui modifie l'apparence du formulaire.

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

En outre, vous pouvez utiliser le projet Dessin de bordures personnalisées dans Windows Forms de CodePlex. Ce projet est une petite bibliothèque qui permet aux utilisateurs de personnaliser les formulaires Windows, comme la personnalisation de la zone non client d'une fenêtre.

1
DOTNET Team