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

Résolu
djin94 Messages postés 10 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 30 juillet 2007 - 6 juin 2007 à 17:09
djin94 Messages postés 10 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 30 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

   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

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

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

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

Encore merci pour ton aide.
0