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 :

eVC++ 4 : check box transparente [FAQ]


Sujet :

MFC

  1. #1
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut eVC++ 4 : check box transparente
    Bonjour,

    j'ai écrit ce code pour avoir des controles transparent:
    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
    38
    39
    40
    41
    42
    HBRUSH EOBD_MODE5::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
     
    	// TODO: Change any attributes of the DC here
    	CBrush Temp;
    	CBitmap BTemp;
    	CPoint m_pts;
    	RECT m_rect;
     
     
    	  // Are we painting the IDC_MYSTATIC control? We can use
      // CWnd::GetDlgCtrlID() to perform the most efficient test.
    	//si c des controles qui nous interressent:
    	if ( (nCtlColor == CTLCOLOR_BTN)|(nCtlColor == CTLCOLOR_LISTBOX))|(nCtlColor == CTLCOLOR_STATIC))
    	{
    		// Set the text color to red.
    		pDC->SetTextColor(RGB(255, 0, 0));
    		// Set the background mode for text to transparent 
    		// so background will show thru.
    		pDC->SetBkMode(TRANSPARENT);
    		// Return handle to our CBrush object.
     
    		//on recupere la position du controle
    		pWnd->GetWindowRect( &m_rect );
    		//on recuper le bord haut gauche
    		if ( nCtlColor != CTLCOLOR_BTN )
    			m_pts.x = -m_rect.left-1;
    		else
    			m_pts.x = -m_rect.left;
    		m_pts.y = -m_rect.top+25;//+25 => c'est la barre de menu!
     
    		//on change la position du pinceaux pour reprendre l'image au bon endroit
    		pDC->SetBrushOrg(m_pts);
    		//on affecte la position du pinceau au controle.
    		hbr = m_brush;
    	}
     
     
    	// TODO: Return a different brush if the default is not desired
    	return hbr;
    }
    ca marche très bien, sauf pour les controle check box, ou le repositionnement de la brush ne serait pas pris en compte...
    j'ai éssayé de virer les 2 autres controles static text, mais ca change rien.
    pareil si je laisse un seul check box...

    j'aurais fait une erreur?

    ps: je suis sur Visual C++ 4 embedded ( developpement pocket pc ).

    merci d'avance

  2. #2
    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,
    pour la check box transparente je ferais un truc comme ça :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    void CCheckBoxEx::OnPaint() 
    {
        CPaintDC dc(this); // device context for painting
     
        // TODO: Add your message handler code here
     
        //creation d'un DC en memoire .
        CDC memDC;
        memDC.CreateCompatibleDC( &dc );
     
        CRect rcClip, rcClient;
        dc.GetClipBox( &rcClip );
        GetClientRect(&rcClient);
     
        // seletionne un bitmap sur le DC en memoire
        CBitmap bitmap;
        bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );
        memDC.SelectObject( &bitmap );
     
        // selectionne la region dans le dc en memoire
        CRgn rgn;
        rgn.CreateRectRgnIndirect( &rcClip );
        memDC.SelectClipRgn(&rgn);
        rgn.DeleteObject();
     
        CClientDC clientDC(GetParent());
     
        CRect crect;
        CRect wrect;
        GetClientRect(crect);
        GetWindowRect(wrect);
        GetParent()->ScreenToClient(wrect);
     
        CRect rcText=crect;
        // recopie du fond.
        memDC.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &clientDC, wrect.left, wrect.top, SRCCOPY);
     
        BOOL bChecked =GetCheck ();
        crect.right=crect.left+13;
     
        // dessin du check.
        memDC.DrawFrameControl(crect, DFC_BUTTON, 
            (bChecked)? DFCS_BUTTONCHECK | DFCS_CHECKED : DFCS_BUTTONCHECK);
     
        CString strText;
        GetWindowText(strText);
     
        rcText.OffsetRect(18,0);
        memDC.SetBkMode(TRANSPARENT);
        memDC.SelectObject(GetFont());
        int nStyle= GetStyle();
     
        memDC.DrawText(strText, &rcText, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
     
        // ecriture finale du bitmap.
        dc.BitBlt( rcClip.left, rcClip.top, rcClip.Width(), 
               rcClip.Height(), &memDC, rcClip.left, rcClip.top, SRCCOPY );
    }
    note j'ai pas tout géré ,c'est juste pour le principe...

  3. #3
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    Merci pour cette reponse!

    mais en fait, je trouve la solution un peu lourde, et surtout, loin de mes competence!

    je vais quand même essaye de la coder, c'est la moindre des choses.

    par contre, je ne sais toujours pas pkoi ma soluce marche pas

  4. #4
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    Bonjour,

    je viens de coder ta solution.
    En fait, j'avais mal compris ou elle se situait.
    Finalement, c pas si complexe que ce que je pensais!

    Le seul problème, c'est que le check box est telement transparent qu'on voit la fenêtre d'en dessous...

    je cherche à trouver d'ou ca peut venir mais je seche un min... :

    merci pour ta réponse!

  5. #5
    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
    Citation Envoyé par zenetcalme
    Bonjour,

    je viens de coder ta solution.
    En fait, j'avais mal compris ou elle se situait.
    Finalement, c pas si complexe que ce que je pensais!

    Le seul problème, c'est que le check box est telement transparent qu'on voit la fenêtre d'en dessous...

    je cherche à trouver d'ou ca peut venir mais je seche un min... :

    merci pour ta réponse!
    c'est un passe murail lol,
    en fait j'ai recuperer le fond du parent ,je pensais que c'etait l'effet recherché .
    donc si on met une image de fond on voit l'image sous le check ..

  6. #6
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    Salut,

    en fait j'ai déjà mis une image en fond sur ma fenêtre. j'ai mis ca dans le WM_PAINT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	bm.GetBitmap(&bmInf);
    	TransparentImage((HDC)dc,0,0,
    	                bmInf.bmWidth,bmInf.bmHeight,(HBITMAP)bm,
    		0,0,bmInf.bmWidth,bmInf.bmHeight,
    		RGB(255,255,255));
    tu a une autre methode pour mettre une image de fond?
    ou alors, c'est que le parent du checkbox ne serais pas le bon, mais j'en doute...

  7. #7
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    En fait, j'ai trouvé d'ou viens le pb.
    Quand je met l'image en fond, EVC desinne l'image partout, sauf sous les controles.
    donc, l'image residuel de l'ancienne fenetre est tjs la.
    et c'est celle la que tu utilise pour faire ton transparent je suppose.

    je trouve pas comment faire pour tout mettre a jour.
    peut etre ne suis je pas dans le bon event? ( WM_INIT? WM_ERASEBKG?)

  8. #8
    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
    re,
    l'image de fond est a mettre de preference dans WM_ERASEBKG.
    exemple sur une view.:
    le lien sur la classe m_Picture est dans la faq.
    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
     
    BOOL CCtrlTransparentView::OnEraseBkgnd(CDC* pDC) 
    {
    	// TODO: Add your message handler code here and/or call default
    	 if(m_Picture.m_IPicture)   
        {
            CRect rect;
            GetClientRect(&rect);
            m_Picture.UpdateSizeOnDC(pDC); // Get Picture Dimentions In Pixels
     
            m_Picture.Show(pDC, CPoint(0,0), CPoint(m_Picture.m_Width,
                            m_Picture.m_Height), 0,0);
            m_Picture.Show(pDC,rect); // Change Original Dimentions 
     
            return FALSE;
        } 
    	return CFormView::OnEraseBkgnd(pDC);
    }

  9. #9
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    re,

    ben c'etait une super idée!
    seulement, j'ai jamais pu compiler!!!!!
    si si...
    MulDiv n'est pas supporté sur Windows CE! ( cf msdn VC++ 6)...

    donc, je peux pas implémenter ta solution sur le erasebkng...
    et la mienne marche pas dans cet evenement!

    a suivre...

  10. #10
    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
    tu n'est pas obligé d'utiliser la classe Picture ,
    tu peux faire ça avec un bitmap.
    le principe reste le meme...


  11. #11
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    re,

    excuse moi, mais je suis minimum novice en la matiere, et quand j'essaye de mettre une image en fond, il continue a ne pas redessiner en dessous des controles.
    il dessine meme plus rien du tout....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	CRect rect;
     
    	GetClientRect(&rect);
     
    	bm.SetBitmapDimension(rect.right-rect.left, rect.bottom-rect.top );
     
    	pDC->SelectObject(bm);
     
    	return false;
    je fais surement une bétise quelque part!

Discussions similaires

  1. [PHP-JS] controler la nom selection de 2 check box
    Par amarcil dans le forum Langage
    Réponses: 10
    Dernier message: 07/04/2006, 20h27
  2. check box pour afficher autre chose
    Par vincent1412 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/02/2006, 17h47
  3. [Javascript] probleme de check box
    Par stomerfull dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/02/2006, 07h09
  4. cocher tout les check box
    Par Flob dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 17/02/2005, 10h29
  5. [FLASH 5] check box sous Flash 5
    Par Flash5man dans le forum Flash
    Réponses: 7
    Dernier message: 01/09/2004, 08h48

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