IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

SDL et API Windows (GetOpenFileName)


Sujet :

C

  1. #21
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Maintenant, avec vos derniers conseils, j'obtiens le bon HWND mais je n'ai pas encore résolu le problème.
    C'est-à-dire en récupérant le handle à l'aide de SDL_GetWMInfo ?

    Le code n'apparait pas dans mon 2eme post du 26/08 ? !
    Désolé, je cherchais dans les premiers posts. Et le code dont tu parles était tout barré alors ...

    Je testerai dès que j'aurai le temps.

  2. #22
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    En fait je récupère le même HWND avec SDL_GetWMInfo ou GetActiveWindow.
    C'est juste que "ShowWindow(WDH, SW_RESTORE);" ne change rien sur une fenêtre non minimisée.

    Pour le programme de test il est tout à fait représentatif mais je suis aperçu que j'avais un break en trop ligne 57 (on ne passe pas dans le clic droit !)
    Cela ne change rien puisque on ne fait rien dans le clic droit mais attention si on y rajoute des lignes pour essayer une correction.

  3. #23
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut
    Alors on ne joue plus dans la même cour: SDL_GetWMInfo est inconnu chez moi (je compile avec la version 1.2.14 de sdl)
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  4. #24
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    J'ai la même version de SDL et j'ai rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <SDL\SDL_syswm.h>
    #include <SDL\SDL_version.h>
    Par contre avec l'API j'ai du "bricoler" pour GetConsoleWindow (voir mon post du 16/08).

    Et je n'arrive pas à compiler la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AllowSetForegroundWindow(ASFW_ANY);

  5. #25
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut
    J'ai pris ton code, l'ai compilé et exécuté (en ajoutant *filePath=0)

    J'ai juste modifié une ligne dans la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toGetFileName.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER;
    car, comme il n'y avait aucun des fichiers spécifiés dans lpstrFilter, je ne pouvais pas en choisir...

    Pas de plantage après 35 clic gauche...

    Et je n'arrive pas à compiler la ligne suivante :
    AllowSetForegroundWindow(ASFW_ANY);
    Aucun souci en ajouant cette ligne de code, mais je ne pense pas qu'elle change quoi que ce soit.

    Le code que j'ai compilé/exécuté (je suis toujours en C89):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL\SDL.h>
    #include <windows.h>
     
    //Variables globales
    static SDL_Surface* ecran = NULL;
    static SDL_Event event;
    static HWND WDH;
     
    char path[MAX_PATH];
    char* chemin = &path[0];
     
    // Prototypes
    int getAudioPath (HWND parentWindow, char* chemin); // Sélection et retour du chemin d'un fichier audio
     
    // Fonction main
    int main ( int argc, char** argv )
    {
        int quitter = 0;
        // initialize SDL video
        if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            printf( "Unable to init SDL\n" );
            return 1;
        }
     
        // create a new window
        ecran = SDL_SetVideoMode(1280, 680, 32,SDL_HWSURFACE|SDL_DOUBLEBUF);
        // clear screen
        SDL_FillRect(ecran, 0, SDL_MapRGB(ecran->format, 0, 0, 0)); // fond noir
        WDH = GetActiveWindow();
     AllowSetForegroundWindow(ASFW_ANY);
        // program main loop
        while (quitter== 0)
        {
            // message processing loop
            while (SDL_PollEvent(&event))
            {
                // check for messages
                switch (event.type)
                {
                    // exit if the window is closed
                case SDL_QUIT:
                    quitter = 1;
                    break;
                    // clic
                case SDL_MOUSEBUTTONDOWN:
                    if (event.button.button==SDL_BUTTON_LEFT)  // Clic de souris (gauche) 
                    {
     
                        int res = getAudioPath (WDH , chemin);  // Sélection du fichier
                        fprintf(stderr,"res %i, chemin=%s \n", res,chemin);
     
                    } // fin clic gauche
                    break;
                    if (event.button.button==SDL_BUTTON_RIGHT)  // Clic de souris (droit)
                    {
                        // juste pour tester le problème  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        // désactive les boutons !
                    } // fin clic droit
                    break;
     
                    // check for keypresses
                case SDL_KEYDOWN:
                    {
                        // exit if ESCAPE is pressed
                        if (event.key.keysym.sym == SDLK_ESCAPE) quitter = 1;
                    }
                } // end switch
     
            } // end of message processing
     
            // DRAWING STARTS HERE
     
            // clear screen
            SDL_FillRect(ecran, 0, SDL_MapRGB(ecran->format, 0, 0, 0));
     
            // finally, update the screen :)
            SDL_Flip(ecran);
     
        } // end main loop
     
        // all is well ;)
        printf("Exited cleanly\n");
        return 0;
    }
     
     
    // Fonctions
     
    int getAudioPath (HWND parentWindow, char* chemin) // Sélection et retour du chemin d'un fichier audio
    {
        //Structure nécessaire à la boîte de dialogue d'ouverture
        OPENFILENAME toGetFileName;
        //Variable qui va recevoir le chemin de la musique
        char filePath[MAX_PATH];
    *filePath=0;
        //Remplissage de la structure
        ZeroMemory(&toGetFileName, sizeof(toGetFileName));
        toGetFileName.lStructSize = sizeof(toGetFileName);
        toGetFileName.hwndOwner = parentWindow;
        toGetFileName.hInstance = NULL;
        toGetFileName.lpstrFile = filePath;
        toGetFileName.nMaxFile = MAX_PATH;
        toGetFileName.lpstrInitialDir = "D:\\mp3";
        //Avec un filtre de fichiers audio
        toGetFileName.lpstrFilter = "Audio File\0*.mp3;*.wav;*.ogg;*.wma\0\0";
        toGetFileName.nFilterIndex = 1;
    //    toGetFileName.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;
        toGetFileName.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER;
     
        //Si l'utilisateur clique sur "Ouvrir"
        if(GetOpenFileName(&toGetFileName) == TRUE)
        {
            strcpy(chemin, filePath );
            return 1;
        }
     
        else
        {
            return 0;
        }
     
    }
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  6. #26
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Merci d'avoir pris le temps de tester, edgarjacobs.

    Je viens de faire un essai avec exactement le code que tu as posté (sauf que je suis obligé de mettre AllowSetForegroundWindow(ASFW_ANY); en commentaire).

    Pas de plantage après 35 clic gauche...
    Chez moi non plus il n'y a pas de "plantage" mais les boutons sont systématiquement désactivés après le premier clic droit consécutif à une sélection de fichier.
    Comme je l'ai déjà dit cela ne se produit pas forcement sur d'autres configurations (je ne sais pas si c'est une bonne ou une mauvaise nouvelle ).

    A quel point de la configuration (machine, 32 bits/64 bits, windows ...) cela pourrait-il être lié ?

  7. #27
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut
    Well, et si tu remplaçais SDL_PollEvent par SDL_WaitEvent?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		SDL_WaitEvent(&event);
     
    //        while (SDL_PollEvent(&event))
    //        {
                // check for messages
                switch (event.type)
                {
                       ......
    //      } // end of message processing
    Juste une idée en passant, SDL_PollEvent n'ayant pas vraiment de raison d'être dans ce cas-ci.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  8. #28
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    C'est la même chose avec :
    Je cherche maintenant à rétablir les boutons avec les fonctions de l'API.
    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowWindow(WDH, SW_RESTORE);
    seule ne suffit pas ( cela marche si je fais avant "ShowWindow(WDH, SW_MINIMIZE);" ).


    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AllowSetForegroundWindow(ASFW_ANY);
    SetForegroundWindow(WDH);
    ne compile pas (la première ligne) !

  9. #29
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut
    Bon, oublie ces fonctions de l'api windows:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AllowSetForegroundWindow(ASFW_ANY);
    SetForegroundWindow(WDH);
    Elles ne t'aideront pas, sdl ayant son propore système puisque multi-plateforme.

    Si tu essayes ce code, stderr contient-il les lignes à chaque fois que tu as fait un clic droit? (poste le contenu de stderr.txt éventuellement)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    // Fonction main
    int main ( int argc, char** argv )
    {
        int quitter = 0;
     
    	int right=0;
     
        // initialize SDL video
        if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            printf( "Unable to init SDL\n" );
            return 1;
        }
     
        // create a new window
        ecran = SDL_SetVideoMode(1280, 680, 32,SDL_HWSURFACE|SDL_DOUBLEBUF);
        // clear screen
        SDL_FillRect(ecran, 0, SDL_MapRGB(ecran->format, 0, 0, 0)); // fond noir
        WDH = GetActiveWindow();
        // program main loop
        while (quitter== 0)
        {
            // message processing loop
    		SDL_WaitEvent(&event);
     
    //        while (SDL_PollEvent(&event))
    //        {
                // check for messages
                switch (event.type)
                {
                    // exit if the window is closed
                case SDL_QUIT:
                    quitter = 1;
                    break;
                    // clic
                case SDL_MOUSEBUTTONDOWN:
                    if (event.button.button==SDL_BUTTON_LEFT)  // Clic de souris (gauche) 
                    {
     
                        int res = getAudioPath (WDH , chemin);  // Sélection du fichier
                        fprintf(stderr,"res %i, chemin=%s \n", res,chemin);
     
                    } // fin clic gauche
    //                break;
                    if (event.button.button==SDL_BUTTON_RIGHT)  // Clic de souris (droit)
                    {
    					fprintf(stderr,"Click right=%d\n",++right);
                        // juste pour tester le problème  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        // désactive les boutons !
                    } // fin clic droit
                    break;
     
                    // check for keypresses
                case SDL_KEYDOWN:
                    {
                        // exit if ESCAPE is pressed
                        if (event.key.keysym.sym == SDLK_ESCAPE) quitter = 1;
                    }
                } // end switch
     
    //      } // end of message processing
     
            // DRAWING STARTS HERE
     
            // clear screen
            SDL_FillRect(ecran, 0, SDL_MapRGB(ecran->format, 0, 0, 0));
     
            // finally, update the screen :)
            SDL_Flip(ecran);
     
        } // end main loop
     
        // all is well ;)
        printf("Exited cleanly\n");
        return 0;
    }
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  10. #30
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Contenu de stderr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    res 1, chemin=C:\Users\Public\Music\Sample Music\Kalimba.mp3 
    Click right=1
    res 0, chemin=C:\Users\Public\Music\Sample Music\Kalimba.mp3
    obtenu avec la séquence suivante :

    - clic gauche => boîte de sélection
    - sélection fichier + "OK"
    - clic droit => bouton croix désactivé
    - clic gauche sur la croix => boite de sélection !
    - clic gauche sur "Annuler"
    - clic gauche sur la croix => fermeture et fin programme

    C'est le fonctionnement que j'ai toujours eu (un appel à la fonction réactive les boutons que l'on sélectionne un fichier ou non).

  11. #31
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut
    Bon, après quelques tâtonnements, j'ai fini par comprendre: SDL n'aime pas qu'on appelle des fonctions de l'api qui utilisent des clics de souris (oui, bon, il n'y a pas des masses d'autres clics ). Je pense que SDL les conserve dans sa "queue" d'event, les considérant comme non-utilisés (et dans le chef de SDL, c'est avec raison!)

    La solution à ton problème est sans doute ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
        while (quitter== 0)
        {
            // message processing loop
    		SDL_WaitEvent(&event);
    		
    //        while (SDL_PollEvent(&event))
    //        {
                // check for messages
                switch (event.type)
                {
                    // exit if the window is closed
                case SDL_QUIT:
                    quitter = 1;
                    break;
                    // clic
    //            case SDL_MOUSEBUTTONDOWN:
                case SDL_MOUSEBUTTONUP:
                    if (event.button.button==SDL_BUTTON_LEFT)  // Clic de souris (gauche) 
                    {
     
                        int res = getAudioPath (WDH , chemin);  // Sélection du fichier
                        fprintf(stderr,"res %i, chemin=%s \n", res,chemin);
     
                    } // fin clic gauche
    //                break;
                    if (event.button.button==SDL_BUTTON_RIGHT)  // Clic de souris (droit)
                    {
    					fprintf(stderr,"Click right=%d\n",++right);
                        // juste pour tester le problème  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        // désactive les boutons !
                    } // fin clic droit
                    break;
     
                    // check for keypresses
                case SDL_KEYDOWN:
                    {
                        // exit if ESCAPE is pressed
                        if (event.key.keysym.sym == SDLK_ESCAPE) quitter = 1;
                    }
                } // end switch
     
    //      } // end of message processing
     
            // DRAWING STARTS HERE
     
            // clear screen
            SDL_FillRect(ecran, 0, SDL_MapRGB(ecran->format, 0, 0, 0));
     
            // finally, update the screen :)
            SDL_Flip(ecran);
    	while(SDL_PollEvent(&event)); // Elimine les events qui restent "queued"
     
        }
    Edgar.

    Edit: PS: depuis le début je pense à l'écrire mais j'oublie: il y a un forum dédié aux problèmes SDL
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  12. #32
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Merci Edgar et Bravo !

    Cela fonctionne

    Sur mon application complète je ne voudrais pas que la boucle d’événements soit bloquante. Sur ton test j'ai remplacé WaitEvent par PollEvent et cela fonctionne aussi, mais pas sur mon application.

    Je marque quand même ce sujet en résolu car mainteant je sais d'où cela vient.
    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 29
    Dernier message: 14/01/2013, 10h40
  2. SDL & API windows
    Par christolb29 dans le forum C
    Réponses: 2
    Dernier message: 24/02/2010, 21h50
  3. tutoriel : La programmation de l'API Windows en C++ par Bob
    Par Aurelien.Regat-Barrel dans le forum Windows
    Réponses: 19
    Dernier message: 21/06/2008, 14h34
  4. Réponses: 2
    Dernier message: 18/04/2007, 21h32
  5. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo