Controles transparents ? [Résolu]

Signaler
Messages postés
56
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
5 décembre 2005
-
Messages postés
140
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
30 septembre 2009
-
Bonjour,

Qqun saurait-il s'il est possible de rendre un controle transparent et si oui comment ?

Merci d'avance pour votre aide,

Cako19

6 réponses

Messages postés
56
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
5 décembre 2005

Bonjour,

Oui c'est encore moi !

Pensez vous que le code ci-dessus marche réellement avec des controles ?
En effet, j'ai vu dans msdn que la fonction essentielle utilisée dans le code : SetLayeredWindowAttributes ne fonctionnait pas avec les enfants d'une fenêtre et donc sûrement pas avec les contrôles non ?
Je cite :"Note that WS_EX_LAYERED cannot be used for child windows."
Qu'en pensez vous ?

Merci pour votre aide,

Cako19
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Yep,
Il est tout a fait possible de le faire a condition que tu sois sous Windows 2000 minimum.
Voila un bout de code qui rend une fenetre transparente.
Tu n'as cas changer le handle passé en parametre a la fonction MySetLayeredWindowAttributes pour que la transparence s'applique a ton control.


#include <windows.h>


#define WS_EX_LAYERED 0x00080000


#define LWA_COLORKEY 0x00000001


#define LWA_ALPHA 0x00000002


BYTE bAlpha=255,Anim=1;


typedef BOOL (WINAPI *SLWA_FUNC)(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);


BOOL MakeAlpha(HWND hwnd,BYTE alpha)


{



// Récupération ddu handle de User32.dll, puis de l'adresse de



// la fonction SetLayeredWindowAttributes dans cette Dll.


SLWA_FUNC MySetLayeredWindowAttributes;


HMODULE hUser32 = GetModuleHandle("USER32.DLL");



if (!hUser32)
return FALSE;


MySetLayeredWindowAttributes = (SLWA_FUNC)GetProcAddress(hUser32,"SetLayeredWindowAttributes");



if (MySetLayeredWindowAttributes)


{



// Application du paramètre alpha sur la fenêtre


MySetLayeredWindowAttributes(hwnd,NULL,alpha,LWA_ALPHA);



// il est également possible de combiner le mode "Alpha" avec



// le mode transparent LWA_COLORKEY. Dans ce cas, toutes les parties



// de la fenêtre qui seront de la couleur 'crKey' seront transparentes.



// Il sera donc possible de cliquer à travers la fenêtre



//



// Exemples :



// MySetLayeredWindowAttributes(hwnd,0x00000000,alpha,LWA_ALPHA | LWA_COLORKEY);



// => Toutes les parties noires de la fenêtre seront transparentes



// Le reste aura un paramètre alpha



// MySetLayeredWindowAttributes(hwnd,0x00FFFFFF,NULL,LWA_COLORKEY);



// => toutes les parties blanches seront transparentes



// Le reste sera normal



return TRUE;


}
else {



// Si pas Windows 2000 ou Windows XP, la fonction SetLayeredWindowAttributes



// n'existe pas, il est donc impossible d'appliquer le paramètre.


MessageBox(hwnd,"Impossible de passer la fenêtre en WS_EX_LAYERED","Erreur",MB_ICONERROR);



return FALSE;


}


}


LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)


{



long result = 0;





switch(message)


{



case WM_DESTROY:


PostQuitMessage(0);



break;



case WM_CREATE:



if (MakeAlpha(hwnd,bAlpha))


SetTimer(hwnd,11111,10,NULL);



else


PostQuitMessage(0);



break;



case WM_CLOSE:


PostQuitMessage(0);



break;



case WM_TIMER:


MakeAlpha(hwnd,bAlpha);



if (Anim==0)


{


bAlpha+=1;



if (bAlpha>=255) Anim=1;


}
else {


bAlpha-=1;



if (bAlpha<=0) Anim=0;


}



break;



case WM_PAINT:


PAINTSTRUCT ps;


HDC hdc;


RECT rect;


BeginPaint(hwnd,&ps);


hdc = GetDC(hwnd);


GetClientRect(hwnd,&rect);


DrawText(hdc,"C'est t'y pas beau ça ?",23,&rect,DT_CENTER);


ReleaseDC(hwnd,hdc);


EndPaint(hwnd,&ps);



break;



default:


result = DefWindowProc(hwnd, message, wParam, lParam);



break;


}



return result;


}


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,
int nCmdShow)


{


WNDCLASSEX MyWC={
sizeof(WNDCLASSEX),CS_HREDRAW|CS_VREDRAW,MainWndProc,0L,0L,


hInstance, LoadIcon(NULL,IDI_APPLICATION),


LoadCursor(NULL, IDC_ARROW),


(HBRUSH) (COLOR_BTNFACE+1),


NULL,"MyWndClassEx",LoadIcon(NULL,IDI_APPLICATION)};



if(!RegisterClassEx(&MyWC))
return 0;




HWND hWndMain = CreateWindowEx(WS_EX_LAYERED,"MyWndClassEx","Fenêtre transparente", WS_OVERLAPPEDWINDOW,


CW_USEDEFAULT,CW_USEDEFAULT,400,300, NULL,NULL,hInstance,NULL);




ShowWindow(hWndMain,nCmdShow);


UpdateWindow(hWndMain);


MSG msg;



while(GetMessage(&msg, NULL, 0, 0))


{


TranslateMessage(&msg);


DispatchMessage(&msg);


}



return msg.wParam;


}

Shell
Messages postés
56
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
5 décembre 2005

Merci beaucoup !!

En fait, si j'ai bien compris c'est la fonction MakeAlpha qui doit être appelée avec le handle de mon contrôle pour le rendre transparent. C'est ça ?
Donc si je veux faire une dll pour l'utiliser dans un autre environnement, je dois juste exporter cette fonction ?
Messages postés
56
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
5 décembre 2005

En exportant MakeAlpha, mon controle n'est pas transparent :(
Messages postés
56
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
5 décembre 2005

J'arrive à rendre transparente ma fenêtre en exportant MainWinProc mais je n'arrive pas à récupérer le handle de mes contrôles. Qqun saurait-il comment il faut faire svp ?

Merci d'avance,

Cako19
Messages postés
140
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
30 septembre 2009
2
salut a tous,

je cherche à rendre une image (voire n'importe quel controle : bouton, static,...) non transparente qui serait dans une fenetre transparente. Est-ce possible ? Comment faire ?