cs_Daniel13
Messages postés7Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention 3 novembre 2008
-
14 mars 2008 à 17:27
cs_Daniel13
Messages postés7Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention 3 novembre 2008
-
15 mars 2008 à 00:18
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.
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.
racpp
Messages postés1910Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201416 14 mars 2008 à 23:37
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);
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().