IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Définir la police et la couleur d'un controle subclassé


Sujet :

Windows

  1. #1
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut Définir la police et la couleur d'un controle subclassé
    Salut à tous,
    Lorsqu'on subclasse un controle (un static par exemple), si on veut modifier la police et/ou la couleur (comme on le ferait en gérant le message WM_CTLCOLORSTATIC), faut-il le faire avec WM_PAINT ou un autre message?

    Merci d'avance,
    Crisanar

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 674
    Points
    10 674
    Billets dans le blog
    3
    Par défaut
    Tu cites toi même WM_CTLCOLORSTATIC. Pourquoi veux-tu précéder autrement ?

  3. #3
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    Dans la nouvelle procédure du controle static subclassé, ce message n'est plus envoyé lorsqu'un static doit être redessiné. Je me demandais donc quel message je devais utiliser pour effectuer la même opération.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 370
    Points : 41 523
    Points
    41 523
    Par défaut
    Je pense que TA nouvelle provédure doit l'envoyer elle-même à la fenêtre parent pour récupérer le HBRUSH et peindre son arrière-plan.

    Je pense que tu dois faire ça dans le traitement de WM_ERASEBKGND...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 674
    Points
    10 674
    Billets dans le blog
    3
    Par défaut
    Faut pas mélanger subclassing et owner drawing. Soit tu fais du subclassing, soit tu gères WM_CTLCOLORSTATIC dans la fenêtre parent, sans faire de subclassing.
    Lorsque tu subclasses, tu laisses l'ancienne procédure faire les traitements, sauf ceux qui t'intéressent. WM_PAINT, tu le reçois automatiquement, quand il y a besoin de dessiner ta fenêtre.
    Donne le code de ta WndProc.

  6. #6
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    En fait, vu que je crée une classe pour un controle personnalisé, j'aurais voulu que l'utilisateur de ma classe (moi), n'aie pas à devoir dessiner le controle, ni a gérer le click dessus,...

    Voici le code de ma WndProc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    LRESULT APIENTRY CWebLink::newWebLinkProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
    { 	
    	CWebLink* m_this = (CWebLink*)GetWindowLong(hwnd, GWL_USERDATA);	// Récupérer un pointeur sur ma classe
    
    	if(m_this != NULL) // Nécessaire?
    	{
    		switch(uMsg) 
    		{	
    		case WM_PAINT:		// Le label va être colorié
    			PAINTSTRUCT ps;
    			HDC hdc;
    			TCHAR buff[1024];
    			long len;
    
    			hdc = BeginPaint(hwnd, &ps);
    			SetBkMode(hdc, TRANSPARENT);					// Couleur de fond = transparente
    			if(m_this->bClicked)		
    				SetTextColor(hdc, 0x800080);				// Couleur du texte = mauve					
    			else		
    				SetTextColor(hdc, 0x0FF0000);				// Couleur du texte = bleue					
    			SelectObject(hdc, (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0));	// Sélectionner la police actuelle
    			len = GetWindowText(hwnd, buff, sizeof(buff));
    			TextOut(hdc, 0, 0, buff, len);
    			EndPaint(hwnd, &ps);		
    			break;
    
    		case WM_LBUTTONDOWN:
    
    			/***** Executer l'opération *****/
    			ShellExecute(hwnd, "open", m_this->DefaultBrowser, m_this->cible, NULL, SW_MAXIMIZE);
    			m_this->bClicked = TRUE;
    			break;
    		}        
    	}
    
    	return CallWindowProc((WNDPROC)GetWindowLong(hwnd, GWL_USERDATA), hwnd, uMsg, wParam, lParam); // USERDATA utilisé 2 fois, à corriger
    }
    Je sais que c'est bourré d'erreurs de programmation, ne soyez pas trop vache mais j'accepte tous les conseils

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 674
    Points
    10 674
    Billets dans le blog
    3
    Par défaut
    Ah oui, le controle lien internet... On en a déjà parlé il me semble.
    Y'a plusieurs façons de procéder. Soit tu subclasses un static par exemple, ou un bouton, soit tu développes complètement ton controle.
    Dans le premier cas, l'inconvénient est que pour personnaliser l'affichage du static, il faut modifier la WndProc du parent : y'a pas variment de controle, mais plutot du code à mettre dans le parent. Dans le second, l'inconvénient est qu'il faut enregistrer la classe de ton composant avant de l'utiliser.
    Dans le premier cas, tu laisses le static se dessiner et tu paramètres son dessin via WM_CTLCOLORSTATIC. Dans le 2°, tu gères toi même le dessin, en entier.
    Note qu'il faut aussi définir le curseur à IDC_HAND afind 'avoir une petite main quand on passe au dessus de l'url. Et faut gérer le clic, ce qui n'est pas trop dans l'exprit du static. C'est plutot un bouton qui est cliqué. Pour faire bien, faudrait récupérer les couleurs du système en ce qui concerne les liens internet plutot que de coder en dur le bleu (au passage, la macro RGB rend le code plus clair : RGB(0,0,255) au lieu de 0x0FF0000).

    En général, le code générique qui fait ça subclasse à la fois le static et le controle parent pour gérer à sa place WM_CTLCOLORSTATIC. C'est ce que font ces exemples:
    http://www.codeguru.com/Cpp/controls/staticctrl/article.php/c5803/
    http://www.wischik.com/lu/programmer/setdlgitemurl.html

  8. #8
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    Merci pour ces liens, j'y ai trouvé des informations précieuses même si j'avais déja réalisé 90% du travail (c'est surtout la méthode pour transformer la police actuelle qui m'a été providencielle ).
    En fait, je n'ai posé ici qu'une petite partie de mon controle, le fait de définir la petite main,... je le fais ailleurs. Je n'ai pas posté mon code entier pour ne pas allourdir le topic et pour ne pas induire d'autres personnes en erreur vu que je débutte. Mais si ma classe hyperlink intéresse quelqu'un, je peux l'uploader.

    Merci à tous pour votre aide

    Crisanar

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/07/2006, 21h00
  2. [VB6] Définir un police en dessous de 6 ou 7pt?
    Par Goldenkiller dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/05/2006, 21h40
  3. copie de requete SQL en gardant la police et la couleur cles
    Par chtiss dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/08/2005, 15h35
  4. [débutant][CSS]définir une police et une taille global
    Par virgul dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 28/04/2005, 09h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo