Ajout d'une fenetre supplémentaire en plus de la fenetre principale dans un prog [Résolu]

Signaler
Messages postés
10
Date d'inscription
vendredi 23 mars 2007
Statut
Membre
Dernière intervention
30 juillet 2007
-
Messages postés
10
Date d'inscription
vendredi 23 mars 2007
Statut
Membre
Dernière intervention
30 juillet 2007
-
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

   hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUP,
      CW_USEDEFAULT, 0, largeur, hauteur, NULL, NULL, hInstance, NULL);

   osd = CreateWindowEx(
       WS_EX_TOPMOST | WS_EX_LAYERED
       | WS_EX_TRANSPARENT,
       szWindowClass,TEXT("On Screen Display IAM"),
       WS_POPUP,0,0,largeur/2,hauteur/2,hWnd,0,hInstance,0);
// Choisir la couleur de fond (blanc) comme couleur transparente:
    SetLayeredWindowAttributes(osd, RGB(255,255,255), 0, LWA_COLORKEY);

    if (!hWnd)
    {
      return FALSE;
    }
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
  

    return TRUE;
}

4 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
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;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_IAMV3));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_IAMV3);
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);

    WNDCLASSEX wcosd;

    wcosd.cbSize = sizeof(WNDCLASSEX);

    wcosd.style            = CS_HREDRAW | CS_VREDRAW;
    wcosd.lpfnWndProc    = WndProcOsd;
    wcosd.cbClsExtra    = 0;
    wcosd.cbWndExtra    = 0;
    wcosd.hInstance        = hInstance;
    wcosd.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_IAMV3));
    wcosd.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcosd.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcosd.lpszMenuName    = MAKEINTRESOURCE(IDC_IAMV3);
    wcosd.lpszClassName    = L"szWindowOsd";
    wcosd.hIconSm        = LoadIcon(wcosd.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    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().
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
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.
Messages postés
10
Date d'inscription
vendredi 23 mars 2007
Statut
Membre
Dernière intervention
30 juillet 2007

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;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_IAMV3));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_IAMV3);
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);

    WNDCLASSEX wcosd;

    wcosd.cbSize = sizeof(WNDCLASSEX);

    wcosd.style            = CS_HREDRAW | CS_VREDRAW;
    wcosd.lpfnWndProc    = WndProcOsd;
    wcosd.cbClsExtra    = 0;
    wcosd.cbWndExtra    = 0;
    wcosd.hInstance        = hInstance;
    wcosd.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_IAMV3));
    wcosd.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcosd.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcosd.lpszMenuName    = MAKEINTRESOURCE(IDC_IAMV3);
    wcosd.lpszClassName    = L"szWindowOsd";
    wcosd.hIconSm        = LoadIcon(wcosd.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcosd);
}

// WndProc numéro 1

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    HDC hdciam;
    PAINTSTRUCT psiam;

    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Analyse les sélections de menu :
        switch (wmId)
        {
       
        case IDM_EXIT:
            DestroyWindow(osd);
            break;
        default:
            return DefWindowProc(osd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(osd, &ps);
       
        // TODO : ajoutez ici le code de dessin...
        EndPaint(osd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(osd, message, wParam, lParam);
    }
    return 0;
}

// WndProc numéro 2
LRESULT CALLBACK WndProcOsd(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    HDC hdciam;
    PAINTSTRUCT psiam;

    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Analyse les sélections de menu :
        switch (wmId)
        {
       
        case IDM_EXIT:
            DestroyWindow(osd);
            break;
        default:
            return DefWindowProc(osd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(osd, &ps);
       
        // TODO : ajoutez ici le code de dessin...
        EndPaint(osd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(osd, message, wParam, lParam);
    }
    return 0;
}
Messages postés
10
Date d'inscription
vendredi 23 mars 2007
Statut
Membre
Dernière intervention
30 juillet 2007

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.

Encore merci pour ton aide.