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 10
9 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.aspxEt 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.