Pour utiliser GDI, vous aurez besoin de la fonction GradientFill. Vous pouvez également utiliser GDI + pour obtenir des dégradés. Voici un exemple simple GDI:
TRIVERTEX vert[2] ;
GRADIENT_RECT gRect;
vert [0] .x = 0;
vert [0] .y = 0;
vert [0] .Red = 0x0000;
vert [0] .Green = 0x0000;
vert [0] .Blue = 0x0000;
vert [0] .Alpha = 0x0000;
vert [1] .x = 100;
vert [1] .y = 32;
vert [1] .Red = 0x0000;
vert [1] .Green = 0x0000;
vert [1] .Blue = 0xff00;
vert [1] .Alpha = 0x0000;
gRect.UpperLeft = 0;
gRect.LowerRight = 1;
GradientFill(hdc,vert,2,&gRect,1,GRADIENT_FILL_RECT_H);
En ce qui concerne le contrôle de l'onglet, vous pourriez sous-classe le contrôle et passer outre ses gestionnaires de dessin non-client et le client pour rendre le gradient.
à la classe sous un contrôle, créez d'abord le contrôle et remplacer sa fonction WNDPROC:
OldWndProc = (WNDPROC)SetWindowLongPtr (hControl, GWLP_WNDPROC, (LONG_PTR)NewWndProc);
puis, dans votre nouvelle WNDPROC:
NewWndProc (usual args)
{
switch message
{
case paint:
draw gradient
return result
default:
return CallWindowProc (OldWndProc, ..args..); <- important!
}
}
Je pense que vous devriez mettre l'appel 'return CallWindowProc' en dehors du commutateur, ou le compilateur pourrait donner un avertissement que" tous les chemins de contrôle ne retournent pas .. ". +1 cependant, réponse très étendue. Et je ne savais pas sur le sous-classement :) – Default
+1 Merci pour la réponse détaillée. Ça a l'air très prometteur. –
Pourriez-vous me diriger vers le bon message (s) à gérer. WM_PAINT? –