begin process at 2008 07 06 15:49:41
1 205 630 membres
198 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Superposition de texte pour STATIC transparente [ Windows / GUI ] (Daniel13)

Superposition de texte pour STATIC transparente le 14/03/2008 17:27:10

Daniel13
Bonjour,

J'ai un soucis de superposition de texte avec mes composants static dans une appli win32 (non-mfc) skinnée
Mon but est de les rendre transparent.

Je sais que le sujet a été abordé des tas de fois, j'ai d'ailleurs parcouru 109 fois le forum, code guru, google, etc... et tout le monde semble être d'accord sur la même procédure.
J'ai regardé la source de BruNews "Texte sur Image" =>  http://www.cppfrance.com/codes/TEXTE-SUR-IMAGE-WIN32-NON-MFC_9674.aspx ,
et celle de racpp "COULEURS ET TRANSPARENCE DES CONTROLES (API)" =>
http://www.cppfrance.com/codes/COULEURS-TRANSPARENCE-CONTROLES-API_27889.aspx

Et bien chez moi cela ne marche pas :-)

En effet le fond du static devient bien transparent, mais le texte se superpose à la derniere entrée.
Quand j'ALT-TAB (i.e que je provoque un repaint) ça rentre dans l'ordre.
Donc je me suis dit que j'allais faire un InvalidateRect(m_hWnd, 0, 0); et un UpdateWindow(m_hWnd); à chaque fois que je change le texte des statics.
Bon, ça fonctionne, mais c'est pas la solution car cela veut dire que le vrai problème n'est pas résolu.
De plus, j'utilise par la suite une trackbar dont à chaque WM_HSCROLL je met à jour une static avec TBM_GETPOS, le soucis c'est qu'avec cette méthode (invalidate + updatewindow) on voit énormément le repaint, c'est pas beau du tout.
Donc j'aimerais bien avoir une solution propre.

Voila les messages que je traite :
 
        case WM_PAINT:
            Skin();
            break;    

        case WM_CTLCOLORSTATIC:
                SetTextColor((HDC)wParam, RGB(0, 0, 255));
                SetBkMode((HDC)wParam, TRANSPARENT);
                return (BOOL)GetStockObject(NULL_BRUSH);
            break;
                
        case WM_HSCROLL:
            if ((HWND)lParam==m_hTrackBar)
            {
                char buffer[20];
                _trackBarCurrentPosition = SendMessage(m_hTrackBar, TBM_GETPOS, 0, 0);    
                sprintf(buffer,"%d",_trackBarCurrentPosition);
                SetWindowText(m_hTrackBarStaticFrameNumber, buffer);    
                InvalidateRect(m_hWnd,0,0);
                UpdateWindow(m_hWnd);
            }
            break;

bool Skin()
{
    PAINTSTRUCT ps;
    BeginPaint(m_hWnd,&ps);
    HDC dcSkin = CreateCompatibleDC(0);
    HBITMAP hOldBmp = (HBITMAP)SelectObject(dcSkin, _hSkinBmp);
    BitBlt(ps.hdc, 0,0,m_pRect->right-m_pRect->left,m_pRect->bottom-m_pRect->top, dcSkin, 0,0, SRCCOPY);
    ReleaseDC(m_hWnd,dcSkin);
    DeleteDC(dcSkin);
    DeleteObject(hOldBmp);
    EndPaint(m_hWnd,&ps);
    return true;
}

Merci par avance pour votre aide.


Re : Superposition de texte pour STATIC transparente le 14/03/2008 23:37:49

racpp
(Admin CS)
Réponse acceptée !
Salut,
C'est normal car ton static est transparent et tout ce qui était écrit avant reste. La solution consiste donc à l'effacer avant chaque écriture. Pour cela, et puisque tu utilises un fond bitmap, tu devras faire un BitBlt() de la portion du bitmap correspondant à la zone occupée par le static sur la fenêtre. Le code traitement de WM_HSCROLL pourrait être comme ceci:
             case WM_HSCROLL:
            if ((HWND)lParam==m_hTrackBar)
            {
                char buffer[20];
                _trackBarCurrentPosition = SendMessage(m_hTrackBar, TBM_GETPOS, 0, 0);   
                sprintf(buffer,"%d",_trackBarCurrentPosition);

                HDC staticDC=GetDC(m_hTrackBarStaticFrameNumber);
                HDC memDC=CreateCompatibleDC(0);
                SelectObject(memDC,_hSkinBmp);
                RECT rect;
                GetWindowRect(m_hTrackBarStaticFrameNumber,&rect);
                POINT pt;
                pt.x=rect.left;
                pt.y=rect.top;
                ScreenToClient(m_hWnd,&pt);
                BitBlt(staticDC,0,0,rect.right-rect.left,rect.bottom-rect.top, memDC,pt.x,pt.y,SRCCOPY);
                ReleaseDC(m_hTrackBarStaticFrameNumber,staticDC);
                DeleteDC(memDC);

                SetWindowText(m_hTrackBarStaticFrameNumber, buffer);   
            }
            break;

Pour optimiser un peu, memDC pourrait être déclaré en global et crée pendant WM_CREATE ou WM_INITDIALOG. Je n'ai pas testé le code mais normalement ça devrait marcher. L'effacement du static serait pratiquement invisible. Pas besoin de InvalidateRect() ni de UpdateWindow().


Re : Superposition de texte pour STATIC transparente le 15/03/2008 00:18:52

Daniel13
Je te remercie beaucoup, ca m'a bien dépanné (je commençais à avoir une migraine d'enfer avec ça )

Bonne continuation,
A+.


Classé sous : texte, static, wm, hwnd, dcskin

Participer à cet échange

Pub



Appels d'offres

WEB DESIGN
Budget : 1 000€
Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS