Anthrax ignisque -- Le charbon et le feu

C la seconde foi ke je poste sur ce sujet, mais j'ai un autre probleme.
En gros: j'ai une fenetre transparente (creee avec WS_EX_TRANSPARENT) que je dessine (BitBlt) en reponse aux WM_PAINT, et que je deplace sur l'ecran (SetWindowPos) en reponse à WM_TIMER.
Le but est de faire une ebauche de screen mate. (un ver en l'ocurence, d'ou les noms de fonction en "Worm" pour qui n'aurait pas compris)
Malheureusement, la fenetre, qui est au premier plan (HWND_TOPMOST):
-si elle a le focus, est invisible (bien qu'elle se deplace quand meme)
-si elle perd le focus, elle se deplace et est animee à peu pres correctement (à part un clignotement de temps en temps)
Je trouve ce comportement pour le moins etrange...
Aidez-moi svp!
Des extraits du code:
// Lors de l'enregisterment de la classe, entre autres parametres:wcex.style=CS_DBLCLKS|CS_OWNDC|CS_SAVEBITS;
wcex.hbrBackground = (HBRUSH)(GetStockObject(HOLLOW_BRUSH));
// Lors de la creation de la fenetre:
// parametres: WS_VISIBLE|WS_POPUP
// parametres etendus: WS_EX_TOOLWINDOW|WS_EX_TRANSPARENT
// Dans WndProc:case WM_CREATE:
hdc=GetDC(hwnd);
SetWormImage();
// charge un bitmap par defaut InvalidateRect(hwnd,NULL,TRUE);
// et demande de redessiner la fenetre ReleaseDC(hwnd,hdc);
SetTimer(hwnd,1,100,NULL);
break;
case WM_TIMER:
hdc=GetDC(hwnd);
UpdateWorm(hwnd,hdc);
// deplace la fenetre, change l'animation, et fait redessiner ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
hdc=BeginPaint(hwnd, &ps);
DrawWorm(hwnd,hdc);
// redessine le bitmap sur la fenetre EndPaint(hwnd, &ps);
break;
// ...void UpdateWorm(HWND hwnd, HDC hdc)
{
// ... ici du code qui fait des trucs de base:
// ... verifie que la fenetre est toujours dans l'ecran, met à jour wWorm.frame...
// wWorm.frame c'est l'ID du bitmap qui est sensé être chargé
// wWorm.actualframe c'eset l'ID du bitmap chargé en ce momentif (wWorm.actualframe!=wWorm.frame) SetWormImage();
SetWindowPos(hwnd,HWND_TOPMOST,wWorm.x,wWorm.y,wWorm.width,wWorm.height, SWP_NOACTIVATE|SWP_NOREPOSITION);
// deplace la fenetreInvalidateRect(hwnd,NULL,TRUE);
// declenche WM_PAINT
// à la limite on pourrait s'en passer puisque SetWindowPos declenche WM_PAINT aussi
// mais j'ai essayé, et ça ne resoud pas le probleme}
void SetWormImage( void )
{
DeleteObject(hWormBmp);
// supprime l'ancien bitmap hWormBmp=LoadBitmap(hInst,MAKEINTRESOURCE(wWorm.frame));
// et charge le nouveau BITMAP bm;
GetObject(hWormBmp,sizeof(bm),&bm);
// il nous faut obtenir les dimensions de l'image wWorm.width=bm.bmWidth;
wWorm.height=bm.bmHeight;
wWorm.actualframe=wWorm.frame;
}