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)

vendredi 14 mars 2008 à 17:27:10 | Superposition de texte pour STATIC transparente

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.


vendredi 14 mars 2008 à 23:37:49 | Re : Superposition de texte pour STATIC transparente

racpp

Administrateur CodeS-SourceS
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().


samedi 15 mars 2008 à 00:18:52 | Re : Superposition de texte pour STATIC transparente

Daniel13

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

Bonne continuation,
A+.



Cette discussion est classé dans : texte, static, wm, hwnd, dcskin


Répondre à ce message

Sujets en rapport avec ce message

pb a la fermeture de win [ par stick ] bonjours,alors voilou, je fais une appli en utilisant l'api window, mais si je ferme windows sans quitter le programme auparavant, celui ci plante et Problème de programmation Win32 [ par GUNMAN ] J'ai téléchargé la source d'une des personnes ici, je compile, tout va bien, je construit le .exe et il me met : "Linking...Cpp1.obj : error LNK2001: Screenmate defectueux [ par anthraxx ] Anthrax ignisque -- Le charbon et le feu J'essaye de faire un screenmate (une petite bestiole se promenant sur les fenetres), mais n'etant pas tres ex Dessiner un texte dans un hwnd en mode non erase.. [ par JackosKing ] lo,voilà pour le moment j'utilisai ceci pour dessiner un texte dans un bdg: char buf[10];// SYSTEMTIME CurrentTime; HFONT hFont; hFont=Creat API :: gestion du mulo [ par JackosKing ] LRESULT CALLBACK Twiny::WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ static bool activate = FALSE; switch ( message ) { case WM_MO Colorier un static : HEeeeeeeelp !!! [ par sprintjeffC ] salut @ tousje me mets a la programmation windows en C/C++ (pas VC++ merci ... quitte à faire du microsoft je préfère VB ;-). Je démarrai pas mal et t prob setwindowtext [ par flatou ] Probleme tout con, je veux changer le texte d'un static (ou d'un editbox), pour cela j'utilise SetWindowTest(). Le prob est que le nouveau texte se su Probleme de Timer avec SetCursorPos [ par Maegis ] Voila je fais une appli Win32 qui necesite l'emploi d'un timerLe probleme c'est que je ne recois jamois le message WM_TIMER ,en fait je le recois si j Problème menu [ par LordBob ] Bonjour a tous,voila j'ai ecrit le tout début d'un programme... celui ci pour l'instant, ne fait que se ranger dans la systray... j'ai commencé a fair Couleur de fond d'un control STATIC [ par raidentr ] Salut,J'ai créé dans VC++ 6 un control STATIC de la facon suivante :HWND hwnd;hwnd_lbl = CreateWindowEx(0, "STATIC", "Mon Texte", WS_VISIBLE|WS_CHILD,


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 18,049 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.