begin process at 2012 05 28 12:21:18
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

DirectX

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mercredi 6 juin 2007 à 17:09:38 | Ajout d'une fenetre supplémentaire en plus de la fenetre principale dans un programme en win32

djin94

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;
}
mercredi 6 juin 2007 à 19:45:06 | Re : Ajout d'une fenetre supplémentaire en plus de la fenetre principale dans un programme en win32

racpp

Administrateur CodeS-SourceS
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.

jeudi 7 juin 2007 à 10:14:29 | Re : Ajout d'une fenetre supplémentaire en plus de la fenetre principale dans un programme en win32

djin94

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;
}
jeudi 7 juin 2007 à 18:06:33 | Re : Ajout d'une fenetre supplémentaire en plus de la fenetre principale dans un programme en win32

racpp

Administrateur CodeS-SourceS
Réponse acceptée !
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().
vendredi 8 juin 2007 à 11:20:10 | Re : Ajout d'une fenetre supplémentaire en plus de la fenetre principale dans un programme en win32

djin94

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.


Cette discussion est classée dans : fenetre, hwnd, ws, hinstance, osd


Répondre à ce message

Sujets en rapport avec ce message

Trouver le hWnd d'une fenetre avec un hInstance [ par PinkRabbit84 ] Comme puis-je faire pour avoir le HWND de la fenetre principale avec le HINSTANCE de l'appMerci d'avancePinkRabbit84 Probleme : error LNK2001: unresolved external symbol... [ par Mr.X ] Tous d'abor bonjour, quand je compile mon programme (visual c++ 6.0), il m'affiche cette erreur, ece que quelqu'un pourrais l'aider ? :Main.obj : erro Comment créer un Bouton [ par new0staff ] Bonjour!Le programme ci-dessous crée et affiche une fenêtre simple. Ce que je souhaite faire, c'est rajouter un Bouton à cette fenêtre.Ce qui ne joue rafraichissement fenetre, ou creation de fenetre dans fenetre [ par kuruma ] Bonjour qq'un pourrait il m'indiquer comment créer une fenetre dans une autre fenetre, ou alors comment allouer une zone de ma fenetre principale, en Application MDI [ par LordBob ] Bonjour a tous,voila j'essaie de créé ma première application MDI, mais j'ai beaucoup de mal, surtout que je n'ai pas trouvé de tutorial sur le net, e Fenetre fille [ par mogwai93 ] Bonjour, je cherche à inserer dans une zone d'une fenetre, une autre fenetre avec scrollbar. sauf que, j'ai des resultats bizarres : --------- LRESU Fenêtre CHILD [ par yserver ] BonjourUne petite question. J'ai une fenêtre avec des contrôles definie à l'interieur comme suit:hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLA TRANSPARENTE [ par kiki67100 ] Salut voila jai trouver un code mais une fenetre TRANSPARENTE http://files.codes-sources.com/fichier.aspx?id=9615&f=Main.cpp  mais le probleme se que Tabulation dans les champs d'une fenetre [ par billy5938 ] Bonjour,Je veux pouvoir parcourir les champs d'édition (ou même des checkBox) d'une fenetre. En utilisant la methode IsDialogMessage dans la boucle de Opacité d'une EditBox [ par Parmesan ] Bonjour,Voila j'ai un petit problème que je n'arrive pas à résoudre.Je travaille sur Dev c++ en Windows Applications, en utlisant les api win32Je poss


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,228 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales