djin94
Messages postés10Date d'inscriptionvendredi 23 mars 2007StatutMembreDernière intervention30 juillet 2007
-
6 juin 2007 à 17:09
djin94
Messages postés10Date d'inscriptionvendredi 23 mars 2007StatutMembreDernière intervention30 juillet 2007
-
8 juin 2007 à 11:20
Bonjour à tous.
Je butte actuellement sur un problème. Je souhaite en fait ajouter une
fenetre transparente avec CreateWindowEx( ) pour créer une OSD (On
Screen Display) par dessus une vidéo affiché via DirectShow.
Bien que je fasse bien attention de passer le bon handle de fenetre
dans chacune de mes fonctions , je rencontre un problème lorsque
j'initialise mes fenetres avec le code ci-dessous.
En effet, lorsque j'arrete et je remet en lecture la vidéo, la vidéo est affiché dans la fenetre osd et non plus hWnd.
J'ai remarqué que cela se produisait seulement lorsque la fenetre osd était affiché en meme temps que hWnd.
Pourriez vous me guider sur la méthode d'ajout d'une seconde fenetre dans mon programme en win32?
Je vous en remercie d'avance.
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Stocke le handle d'instance dans la variable globale
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 7 juin 2007 à 18:06
L'exécution de MyRegisterClass() s'arrête à la ligne en rouge à cause du return:
// Enregistrement de deux structures WNDCLASSEX différentes
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
return RegisterClassEx(&wcosd);
}
On voit donc que ta deuxième classe de fenêtre ne sera jamais enregistrée. Tu peux diviser cette fonction en deux fonctions: une pour ta fenêtre principale et l'autre pour la fenêtre OSD et que tu pourras nommer MyRegisterClassOSD().
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 6 juin 2007 à 19:45
Salut,
Une solution consiste à utiliser deux WNDPROCs différentes. Une pour ta fenêtre principle et l'autre pour ta fenêtre OSD. Tu devras donc initialiser deux structures WNDCLASS puis enregistrer les deux classes des fenêtres avant de les créer.
Dans ton code, les deux fenêtres sont de la même classe et partagent donc la même WNDPROC. Cette dernière recevra ainsi les messages destinés à chacune des fenêtres. Il est bien sûr possible d'utiliser cette seule et même WNDPROC pour les deux fenêtres mais ça nécessitera l'ajout de code permettant de différencier les deux. Cela risque d'être une source de problèmes dans certains cas.
djin94
Messages postés10Date d'inscriptionvendredi 23 mars 2007StatutMembreDernière intervention30 juillet 2007 7 juin 2007 à 10:14
Salut,
Merci pour ta réponse!
J'ai tenté d'implémenter un second WndProc mais maintenant je n'ai plus la seconde fenetre transparente?
Aurais- tu un exemple de code à me donner pour implémenter un second WndProc ?
Je t'en remercie d'avance.
Voici ce que j'ai fait, si quelqu'un peut me dire si je me suis totalement planté :
//Déclarations des WndProcs
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProcOsd(HWND , UINT , WPARAM , LPARAM );
// Enregistrement de deux structures WNDCLASSEX différentes
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
djin94
Messages postés10Date d'inscriptionvendredi 23 mars 2007StatutMembreDernière intervention30 juillet 2007 8 juin 2007 à 11:20
Ok merci beaucoup maintenant ca marche impeccablement.
Petite question supplémentaire, comment fait on pour définir les ressources pour chaque fenetre. En effet, je voudrais avoir une allocation de ressources plus importante pour ma fenetre vidéo que celle de la fenetre menu.