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

MFC Discussion :

[Win32] Transparence d'un Edit Control


Sujet :

MFC

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut [Résolu] [Win32] Transparence d'un Edit Control
    Bonjour à toutes et à tous,

    A première vue, d'autres avant moi ont rencontré le même problème, mais tout ce que j'ai pu lire ne m'a pas permis de le résoudre.
    J'ai une fenetre dont le fond est entièrement recouvert par une image.
    Je voudrais que les edits que je crée soient complètement transparents de manière à ce que je puisse continuer à voir l'image de fond à travers les edits.

    Pour le moment, j'ai ceci dans la DlgProc (qui ne fonctionne pas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		case WM_CTLCOLOREDIT:
     
    			hbrBack = CreateSolidBrush(RGB(COULEUR_EDIT_R,COULEUR_EDIT_V,COULEUR_EDIT_B));
    			SetBkMode((HDC)wParam, TRANSPARENT);
    			return (int)hbrBack;
    A noter que je crée les edits avec CreateWindowEx()

    Merci de vos conseils,
    Bigbang

  2. #2
    Membre actif Avatar de blackhorus
    Inscrit en
    Février 2003
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 209
    Points : 226
    Points
    226
    Par défaut
    tu as essayé avec le style WS_EX_TRANSPARENT, ou la fonction SetLayeredWindowAttributes()

    jette un coup d'oeil sur le site de MSDN
    C'est le devoir de chaque homme de rendre au monde au moins autant qu'il en a reçu -- Albert Einstein

    Mon blog: http://blackhorus.blogspot.com

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    salut,
    Il me semble que ceci n'est valable que pour 2k et Me, non ?

  4. #4
    Membre actif Avatar de blackhorus
    Inscrit en
    Février 2003
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 209
    Points : 226
    Points
    226
    Par défaut
    Citation Envoyé par bigbang
    salut,
    Il me semble que ceci n'est valable que pour 2k et Me, non ?
    eh ben d'après le site de Microsoft :
    Minimum operating systems Windows 2000
    C'est le devoir de chaque homme de rendre au monde au moins autant qu'il en a reçu -- Albert Einstein

    Mon blog: http://blackhorus.blogspot.com

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    A vrai dire, j'ai essayé de compiler, et ça n'a pas marché. Le compilo ne connaissait pas les identifiants.
    Et apres j'ai trouvé ceci :
    http://www.codeproject.com/win32/quaker1.asp

  6. #6
    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 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case WM_CTLCOLOREDIT: 
     
             hbrBack = CreateSolidBrush(RGB(COULEUR_EDIT_R,COULEUR_EDIT_V,COULEUR_EDIT_B)); 
             SetBkMode((HDC)wParam, TRANSPARENT); 
             return (int)hbrBack;
    SetBkMode( TRANSPARENT ) s'applique au text affiché, pas à la brosse utilisée pour peindre le fond (celle que tu dois renvoyer).
    Essaye de renvoyer NULL.

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Salut,
    Tout d'abord merci de m'aider.

    J'ai donc remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		case WM_CTLCOLOREDIT: 
     
    			 hbrBack = CreateSolidBrush(RGB(COULEUR_EDIT_R,COULEUR_EDIT_V,COULEUR_EDIT_B)); 
    			 return NULL;
    Mais ceci mets un fond tout blanc dans les edits

  8. #8
    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 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    En fait non ça marchera pas, du moins pas quand il faudra redessiner.
    En fait je me demande s'il faudrait pas redessiner le bitmap et renvoyer NULL pour pas effacer.
    Y'a des exemples de static transparent sur codeproject, tu peux t'en inspirer (cela dit je crois que le mec se crée son propre controle au lieu de modifier STATIC...)

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Tu veux dire qu'au lieu de mettre un fond transparent dans l'edit, tu remets la zone correspondante du fond de l'image ?

  10. #10
    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 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Mais là tu ne mets pas un fond transparent, tu mets le fond transparent pour le texte dessiné seulement.
    Je pense que oui il faut dessiner le bout de bitmap caché...
    La transparence avec SetLayeredWindowAttributes c'est pas bon car si tu y arrives, le texte sera lui aussi transparent et... invisible.

  11. #11
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    oui je vois le problème.
    et donc comment on fait pour mettre une image en fond d'un edit ? ca se fait facilement ?

  12. #12
    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 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Je pense que dans WM_CTLCOLOREDIT tu peux blitter directement sur le HDC. Reste à définir la portion de bitmap à blitter. Tu peux peut être rendre le truc un poil générique en utilisant les coordonnées de ton edit dans la fenêtre mère, mais faut un moment ou un autre avoir le bitmap à blitter.

  13. #13
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Salut,

    Alors c'est sur la bonne voie !
    Voici ce que j'ai maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    		case WM_CTLCOLOREDIT:
     
    			BitBlt(GetDC(hEdit1), 0, 0, 369, 20, hdcBmp, 15, 136, SRCCOPY);
    			BitBlt(GetDC(hEdit2), 0, 0, 369, 20, hdcBmp, 15, 172, SRCCOPY);
     
    			return 0;
    Mais maintenant, dès que je modifie le contenu de l'edit, il retrouve en partie son aspect initial, c'est à dire avec un fond blanc.
    A quoi cela est-ce du ?

  14. #14
    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 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Hum... Pas bon le GetDC comme ça, tu crées des fuites d'objets GDI. Utilise simplement le paramètre wParam, il est là pour ça.
    Pour que le fond du texte devienne transparent, utilise ce que tu avais fait au début:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetBkMode((HDC)wParam, TRANSPARENT);

  15. #15
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    A vrai dire, je ne vois pas bien comment utiliser wParam étant donné qu'il y a plusieurs edits auxquels appliquer un traitement différent (les coordonnées)

  16. #16
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    j'ai modifié par ceci, mais toujours le problème de fond blanc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    		case WM_CTLCOLOREDIT:
     
    			SelectObject((HDC)wParam, hFontEdit);
    			SetBkMode((HDC)wParam, TRANSPARENT);
     
    			if((HWND)lParam==hEdit1)
    				BitBlt((HDC)wParam, 0, 0, 369, 14, hdcBmp, 15, 136, SRCCOPY);
    			else if((HWND)lParam==hEdit2)
    				BitBlt((HDC)wParam, 0, 0, 369, 14, hdcBmp, 15, 172, SRCCOPY);
     
    			return 0;

  17. #17
    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 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    WM_CTLCOLOREDIT ne doit pas être commun à tous les edit. Chacun son traitement. Normal que ton code ne fonctionne pas, wParam c'est un HDC, pas un HWND (rien à voir). Le HWND tu l'as avec lParam, mais je te déconseille de l'utiliser comme tu fais avec des valeurs codées en dur.
    Au lieu d'utiliser des coordonnées fixes comme ça, utilise GetWindowRect( (HWND) lParam ) afin de récupérer la position de l'edit, et après ça roule 8)

  18. #18
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    salut,

    Je suis désolé, mais je ne comprends pas pourquoi mon code ne marche pas. Je distingue bien selon les edits, et j'applique bien le mode TRANSPARENT aux edits
    Si tu pouvais me donner ton idée sur la chose. Merci beaucoup

    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
     
    		case WM_CTLCOLOREDIT:
     
    			hFontEdit =	CreateFont(13, 6, 0, 0, FW_BOLD, 0, 0, 0,DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH, "Tahoma");
     
    			SelectObject((HDC)wParam, hFontEdit);
    			SetBkMode((HDC)wParam, TRANSPARENT);
     
    			if((HWND)lParam==hEdit1)
    			{
    				BitBlt((HDC)wParam, 0, 0, 369, 14, hdcBmp, 15, 136, SRCCOPY);
    			}
    			else if((HWND)lParam==hEdit2)
    			{
    				BitBlt((HDC)wParam, 0, 0, 369, 14, hdcBmp, 15, 172, SRCCOPY);
    			}
     
    			return 0;

  19. #19
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    extrait MSDN:
    WM_CTLCOLOREDIT
    An edit control that is not read-only or disabled sends the WM_CTLCOLOREDIT message to its parent window when the control is about to be drawn. By responding to this message, the parent window can use the specified device context handle to set the text and background colors of the edit control.
    A window receives this message through its WindowProc function.


    Return Values
    If an application processes this message, it must return the handle of a brush. The system uses the brush to paint the background of the edit control.
    et donc essaye de retourner une brosse null :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ::GetStockObject(NULL_BRUSH);

  20. #20
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    C'est merveilleux, ça marche !
    Merci beaucoup !

    Voici finalement le bout de code :

    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
     
    		case WM_CTLCOLOREDIT:
     
    			hFontEdit =	CreateFont(13, 6, 0, 0, FW_BOLD, 0, 0, 0,DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH, "Tahoma");
     
    			SelectObject((HDC)wParam, hFontEdit);
    			SetBkMode((HDC)wParam, TRANSPARENT);
    			SetTextColor((HDC)wParam, RGB(COULEUR_TEXT_R,COULEUR_TEXT_V,COULEUR_TEXT_B));
     
    			if((HWND)lParam==hEdit1)
    				BitBlt((HDC)wParam, 0, 0, 369, 14, hdcBmp, 15, 136, SRCCOPY);
    			else if((HWND)lParam==hEdit2)
    				BitBlt((HDC)wParam, 0, 0, 369, 14, hdcBmp, 15, 172, SRCCOPY);
     
    			return (int)GetStockObject(NULL_BRUSH);

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. win32 api - EDIT control
    Par opc0de dans le forum C++
    Réponses: 0
    Dernier message: 25/04/2011, 16h51
  2. [c++ Win32] Edit Control avec fopen
    Par swo.line dans le forum C++
    Réponses: 10
    Dernier message: 05/05/2008, 14h38
  3. Positionner le curseur + edit control
    Par Atomikx dans le forum MFC
    Réponses: 2
    Dernier message: 27/10/2005, 14h51
  4. [Win32] Transparence !COMPLETE! de la fenetre
    Par cyber_N dans le forum Windows
    Réponses: 2
    Dernier message: 22/10/2005, 21h12
  5. [mfc]edit control
    Par marseillais57 dans le forum MFC
    Réponses: 4
    Dernier message: 21/06/2004, 10h28

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