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 :

comment faire des Cstatic transparents sur un background?


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Par défaut comment faire des Cstatic transparents sur un background?
    Bonjour,

    je souhaite creer des CStatic transparents du genre TextEditor sur un background, c'est a dire faire apparaitre du texte sans le cadre gris standard.

    pour cela je surcharge OnEraseBkgnd et je dessine le background dans cette fonction :
    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
     
    BOOL CTestDlg::OnEraseBkgnd(CDC* pDC)
    {
    	CBitmap *ptrBmpOld;
    	CDC dcMemory;
    	BITMAP bm;
    	CRect rect;
     
    	Background.GetBitmap(&bm);
    	GetClientRect(rect);
    	int nHor = rect.Width()/bm.bmWidth+1;
    	int nVer = rect.Height()/bm.bmHeight+1;
    	dcMemory.CreateCompatibleDC(pDC);
    	ptrBmpOld=dcMemory.SelectObject(&Background);
     
    	// Draw it 
    	for (int i=0;i<nHor;i++)
    		for (int j=0;j<nVer;j++)
    			  pDC->BitBlt(i*bm.bmWidth,j*bm.bmHeight,   bm.bmWidth,      bm.bmHeight,&dcMemory,0,0,    SRCCOPY);
     
    	dcMemory.SelectObject(ptrBmpOld);
    	return TRUE;
     
    }
    puis je dessine le background transparent du control :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
     
        { 
            pDC->SetBkMode(TRANSPARENT); 
            hbr = (HBRUSH) GetStockObject(NULL_BRUSH); 
        } 
     
    	return hbr;
    }
    Le probleme c'est que le background du control n'est pas le bon, en effet c'est celui de l'ecran precedent le lancement de mon application. (etrange?)

    JE precise que je developpe sur windows mobile 6 et que tous les exemples que j'ai trouvé sont sur win32. Est ce l'explication, ou y'a t-il une autre astuce?

    J'espere que vous pourrez m'aider.

    PS : j'ai essayé une autre solution qui consiste a definir le background comme un static picture editor, puis de le dessiner en premier et ensuite le reste des controls transparents. Le probleme c'est que les controls ne s'affichent pas, y'a juste le background. Meme lmes controls statics ne s'affichent pas.

    A bientot j'espere

  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
    Par défaut
    salut,
    ça m'a rappelé un post sur a peu prés le même sujet:
    je pencherai plutôt pour une classe héritée de CStatic:
    http://www.developpez.net/forums/d70...te/#post473963

  3. #3
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Par défaut
    j'ai exactement le meme probleme. Sauf qu'au final il n'a pas été resolu!

  4. #4
    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
    Par défaut
    tu as essayé la solution que j'ai proposée ?

  5. #5
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Par défaut
    je suis en train de tester ca marche en fait! j'ai fait quelques mini reglages pour l'adapter juste a l'editeur de texte. Ce qui me donne :

    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
    60
    61
    62
     
     
    void CTransparentStatic::OnPaint()
    {
    	CPaintDC dc(this); // device context for painting
     
    	dc.SetBkMode(TRANSPARENT);
     
    	CRect rcClient;
    	GetClientRect(&rcClient);
     
    	// seletionne un bitmap sur le DC en memoire
    	CBitmap bitmap;
    	bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );
    	dc.SelectObject( &bitmap );
     
        CRect rc;
        GetWindowRect(&rc);
        ScreenToClient(&rc);
     
    	CClientDC clientDC(GetParent());
     
    	// recopie du fond.
    	dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &clientDC, rc.left, rc.top, SRCCOPY);
     
        DWORD dwStyle = GetStyle();
     
        int nDTFlags = 0;
     
        if((dwStyle & SS_NOPREFIX) != 0)
        {
            nDTFlags |= DT_NOPREFIX;
        }
     
        if((dwStyle & SS_CENTER) != 0)
        {
            nDTFlags |= DT_CENTER;
        }
        else if((dwStyle & SS_RIGHT) != 0)
        {
            nDTFlags |= DT_RIGHT;
        }
        else
        {
            nDTFlags |= DT_LEFT;
        }
     
        if((dwStyle & SS_LEFTNOWORDWRAP) != 0)
        {
            nDTFlags |= DT_SINGLELINE;
        }
        else
        {
            nDTFlags |= DT_WORDBREAK;
        }
     
    	CString strText;
        GetWindowText(strText);
        dc.DrawText(strText, -1, &rc, nDTFlags);
     
     
    }
    Merci beaucoup pour ton aide, au depart j'y croyais pas en voyant que le post n'etait pas resolu.. mais finalement ca marche!

    merci a toi pour ta memoire et ton efficacité

  6. #6
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Par défaut
    il n'est pas tout a fait resolu car si j'agrandis ma fenetre de texte alors le fond copié n'est pas bon partout. En effet le fond copié a certains endroits n'est pas le fond de la zone de dessin, mais une zone un peu plus au dessus.

    je mettrai en resolu des que ce sera OK pas de pb

  7. #7
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Par défaut
    Finalement ca ne marche pas!

    le code que j'ai mis utilise la zone située dans l'angle en haut a gauche comme background pour le text.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &clientDC, rc.left, rc.top, SRCCOPY);
    Evidemment j'ai pris un background uni donc au depart je pensais que ca marchait!


    si maintenant je prends la zone ou se situe le texte comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dc.BitBlt(temp1, temp2, rcClient.Width(), rcClient.Height(), &clientDC, rc.left, rc.top, SRCCOPY);
    --> le background dessiné est celui de la fenetre avant le lancement de l'application et on retrouve le meme probleme que dans le post precedent, a savoir que le background n'est jamais dessiné sous les controls.

  8. #8
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Par défaut
    salut,

    alors pour ceux que ca interesse j'ai trouvé comment faire :

    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
     
     
    HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
     
    	UINT nID = ::GetDlgCtrlID( pWnd->m_hWnd );
     
    	pDC->SetBkMode(TRANSPARENT );
     
    	switch( nID )
    	{
     
    	case IDC_TIME_INFO_DISPLAY:		return m_hBrCtl[0];
    	default			   :	return m_hBrCtl[0];
     
    	}
     
    	return 0;
    }
     
     
    BOOL CTestDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	// Définir l'icône de cette boîte de dialogue. L'infrastructure effectue cela automatiquement
    	//  lorsque la fenêtre principale de l'application n'est pas une boîte de dialogue
    	SetIcon(m_hIcon, TRUE);			// Définir une grande icône
    	SetIcon(m_hIcon, FALSE);		// Définir une petite icône
     
    	// TODO*: ajoutez ici une initialisation supplémentaire
     
    	m_hBmBkgnd = ::LoadBitmap( AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BG) );
     
    	if( m_hBmBkgnd )
    	{
    		m_hBrCtl[0] = GetBkBrush( GetSafeHwnd(), IDC_TIME_INFO_DISPLAY, m_hBmBkgnd );
    	}
     
    	return TRUE;  // retourne TRUE, sauf si vous avez défini le focus sur un contrôle
    }
     
     
    void CTestDlg::OnDestroy()
    {
    ::DeleteObject( m_hBrCtl[0] );
    }
    En fait je me suis appuyé sur ce lien :

    http://www.codeproject.com/KB/mobile..._controls.aspx

    Bonne journée

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/08/2008, 19h07
  2. Comment faire des zones de texte sur image
    Par Myogtha dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 12/03/2007, 15h27
  3. Réponses: 1
    Dernier message: 09/06/2006, 10h42
  4. Réponses: 4
    Dernier message: 10/05/2006, 17h19
  5. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31

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