2010-10-07 18 views
1

J'ai une application basée sur des onglets pour les fenêtres, que je développe moi-même.Question de programmation Win32

Je voudrais ajouter un dégradé subtil à l'arrière-plan de mon contrôle onglet. Comment pourrais-je faire ça? Quelle est la meilleure méthode pour moi d'utiliser?

Je pense que l'implémentation d'un contrôle personnalisé qui occupe l'espace du contrôle onglet fonctionnerait, mais comment puis-je dessiner un dégradé en utilisant GDI?

Merci à l'avance.

Répondre

4

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! 
    } 
} 
+0

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

+0

+1 Merci pour la réponse détaillée. Ça a l'air très prometteur. –

+0

Pourriez-vous me diriger vers le bon message (s) à gérer. WM_PAINT? –