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

SDL Discussion :

Problème SDL et MessageBox


Sujet :

SDL

  1. #1
    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 562
    Points
    1 562
    Par défaut Problème SDL et MessageBox
    Bien le bonjour à toi qui lit ceci,

    J'ai un programme écrit avec SDL, en mode SDL_FULLSCREEN

    Mon programme fonctionne parfaitement bien (c'est pas tous les jours un jour de pluie), mais il me reste un petit problème d'affichage.

    Pour signaler une erreur d'allocation mémoire ou un fichier absent, j'utilise MessageBox(). Celle-ci prend comme premier paramètre l'instance de la fenêtre appelante, mais comme je ne la connais pas, je mets NULL.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox(NULL,"Texte","Titre",MB_OK);
    Le soucis, si cela fonctionne bien en mode non fullscreen, en fullscreen cela ouvre une autre fenêtre pour afficher le message. La faute, je pense, à NULL
    D'où ma question: quelqu'un sait-il quel valeur fournir à MessageBox() ?

    Merci d'avance pour le coup de pouce,

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  2. #2
    Invité
    Invité(e)
    Par défaut
    MessageBox vient de l'API Win32 si je ne m'abuse. C'est donc indépendant de la SDL.

    Néanmoins, en consultant divers sites internet (http://www.gd-experience.eu/index.php?viewPost=42 entre autre) on peut voir qu'ils mettent 0 à la place de NULL.

  3. #3
    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 562
    Points
    1 562
    Par défaut
    Slash, bonjour.

    Oui, on peut mettre 0 ou NULL, ça ne change rien. Dans windef.h, on trouve
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef NULL
    #ifdef __cplusplus
    #define NULL    0
    #else
    #define NULL    ((void *)0)
    #endif
    #endif
    NULL est juste plus clair à mes yeux que 0 quand on parle d'adresse.

    Merci à toi.

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Slash, bonjour.

    Oui, on peut mettre 0 ou NULL, ça ne change rien. Dans windef.h, on trouve
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef NULL
    #ifdef __cplusplus
    #define NULL    0
    #else
    #define NULL    ((void *)0)
    #endif
    #endif
    NULL est juste plus clair à mes yeux que 0 quand on parle d'adresse.

    Merci à toi.

    Edgar.
    Au temps pour moi je ne code pas avec l'API Win. Il faut sans doute voir dans le forum windows pour ta question.

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Si je puis donner mon avis, je n'aime pas que l'on utilise une fonction de la WinAPI, car on va perdre la compatibilité multi-plateforme. Après, peut être que c'est loin d'être votre soucis

    Sinon, on doit pouvoir y arriver avec un getenv().
    Je me base sur cet article car ils sont capable d'intégrer une fenêtre SDL dans Qt (soit, en passant l'ID de la fenêtre Qt à SDL). Il le fait avec putenv(), donc, getenv, à un certain moment (après le SDL_Init() ou le SDL_SetVideoMode) doit donner l'ID de la SDL.
    Sinon, faudra regarder dans les sources de la SDL.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    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 562
    Points
    1 562
    Par défaut
    Bonsoir LittleWhite,

    Merci pour ta réponse. Je ne suis pas chez moi actuellement, mais je teste ça dès que je rentres (2 jours, 3 maxi).

    Je te tiens au courant.

    Encore merci,

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  7. #7
    Membre averti Avatar de hariman
    Homme Profil pro
    Développeur Java, Android
    Inscrit en
    Janvier 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Développeur Java, Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 200
    Points : 413
    Points
    413
    Par défaut
    Bonjour,

    La fonction GetActiveWindow() du WinAPI permet d'obtenir l'instance de la fenêtre active, dans ton cas, la fenêtre SDL.

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HWND handle = GetActiveWindow();
    MessageBox(handle,"Texte","Titre",MB_OK);
    Les boutons et adorent être cliqués, donc ne les oubliez pas

  8. #8
    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 562
    Points
    1 562
    Par défaut
    Bonjour LittleWhite,
    Bonjour Hariman,

    J'ai consulté avec attention les informations que vous m'avez fournies (je ne connais que très peu WinAPI). Il en ressort que ça doit être faisable.
    J'ai effectué différents tests, petit code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    putenv("SDL_VIDEO_WINDOW_POS=center");
    sdlHwnd=GetActiveWindow();
    sprintf(windowid,"SDL_WINDOWID=0x%lx",(long)sdlHwnd);
    SDL_putenv(windowid);
    system("set >set.txt");
    if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER)) {
    	MessageBox(NULL,"Initialisation vidéo impossible","",MB_OK);
    	exit(1);
    	}
    Au premier essai, mon programme m'a gentiment ouvert la fenêtre me disant "Initialisation vidéo impossible", et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    c:>type set.txt
    .
    .
    SDL_VIDEO_WINDOW_POS=center
    SDL_WINDOWID=0x0
    .
    .
    Ne sachant pas exactement quel format mettre à sprintf, j'ai essayé diverses variations sur le type long, ainsi que casté sdlHwnd en long*, qui se sont soldées par la même réponse.
    J'ai alors fait un essai 'relativement' débile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    long l=15;
    
    putenv("SDL_VIDEO_WINDOW_POS=center");
    sdlHwnd=(void*)&l; //GetActiveWindow();
    sprintf(windowid,"SDL_WINDOWID=0x%lx",(long)sdlHwnd);
    SDL_putenv(windowid);
    system("set >set.txt");
    if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER)) {
    	MessageBox(NULL,"Initialisation vidéo impossible","",MB_OK);
    	exit(1);
    	}
    Me croirez-vous si je vous dis que ça donne un 'résultat'? (chance, sans doute, quoi que... )
    Dans ce programme, je joue de la musique avec FMOD. Mon écran d'appel (dos ou bureau windows) n'a pas changé (juste un rapide flip), mais j'entends la musique s'égrener. Bien que prévu pour être arrêté par escape, rien ne se passe, le programme ne répond pas au clavier et je le tue via le gestionnaire des tâches. Sans plantage, rien.
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    c:>type set.txt
    .
    .
    SDL_VIDEO_WINDOW_POS=center
    SDL_WINDOWID=0x12fef0
    .
    .
    Deux idées me viennent à l'esprit: GetActiveWindow renvoit-il autre chose que zéro, ou me plante-je dans le sprintf?
    Car, manifestement, ajouter cette variable à l'environnement change la manière de réagir de SDL_Init().

    Si vous avez des suggestions, je suis évidemment preneur, et quoi qu'il en soit, merci à vous deux.

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  9. #9
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Euh, je n'avais pas du tout penser à faire comme cela.

    retourne un truc invalide avant le SDL_SetVideoMode(), car c'est cette dernière fonction qui ouvre la fenêtre.
    En fait, je pensais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER);
    SDL_SetVideoMode();
    SDL_getenv();
    MessageBox(le_resultat_de_getenv);
    Dans cet ordre.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  10. #10
    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 562
    Points
    1 562
    Par défaut
    Re LittleWhite,

    En fait, je pensais faire :
    Code :Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER);
    SDL_SetVideoMode();
    SDL_getenv();
    MessageBox(le_resultat_de_getenv);
    Dans cet ordre.
    Moi aussi !

    Je l'ai testé, mais il n'y a rien dans le string d'environnement venant de la sdl suite à la création de la fenêtre par SetVideoMode().
    Et en faisant après SetVideoMode() un MessageBox(GetActiveWindow(),"","",int) cela ne fonctionne pas non plus. Enfin si, mais si le programme est appelé depuis le bureau (par exemple), il affiche MessageBox() sur le bureau, si il est appelé depuis une fenêtre DOS, cela affiche MessageBox() dans la fenêtre DOS. Dans les deux cas, le programme se retrouve réduit dans la barre des tâches.

    L'article dont tu m'as fourni l'adresse est explicite à ce sujet:

    char windowid[64];
    #ifdef Q_WS_WIN
    sprintf(windowid, "SDL_WINDOWID=0x%lx", reinterpret_cast<qlonglong>(winId()));
    #elif defined Q_WS_X11
    sprintf(windowid, "SDL_WINDOWID=0x%lx", winId());
    #else
    qFatal("Fatal: cast du winId() inconnu pour votre plate-forme; toute information est la bienvenue!");
    #endif
    SDL_putenv(windowid);
    // Initialisation du système vidéo de SDL
    SDL_Init(SDL_INIT_VIDEO);
    screen = SDL_SetVideoMode(width(), height(), 32, SDL_SWSURFACE);
    Ne le faites pas avant l'initialisation du système vidéo de SDL [et de QWidget, sinon une seconde fenêtre sera créée par et pour SDL.]
    Evidement, la fonction winId() vient de Qt, et les Q_WS_xx aussi.

    Et retour à la case départ

    Merci de toujours t'interesser à ce problème.

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Je pensais, avez déjà vous vu un jeu plein écran affichant une message box au dessus du jeu ? Souvent ça ne marche pas.
    Sinon, je commence à être à court d'idée. Peut être en regardant le code de la SDL, sinon, je ne vois pas.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #12
    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 562
    Points
    1 562
    Par défaut
    Hello,

    D'abord, merci aux participants.

    Ensuite, je re-retourné le net à la recherche d'une solution ou ne fut-ce que l'ombre d'une piste, et... nada! ou alors, j'ai vraiment très mal cherché, ce qui est possible.

    Enfin, je n'ai pas envie de m'appuyer l'anlayse des sources de la sdl.

    Conclusion: je vais écrire ma fonction MessageBox(). Elle ne sera sans doute pas aussi présentable que celle de windows, mais, après tout, pour un message d'erreur qui dans bien des cas signalera l'impossibilité de continuer l'exécution du programme, ON S'EN TAPE! (en majuscules et en rouge, ça montre à quel point j'en ai ras le bol de chercher pour ce détail, vu que le programme, lui, fonctionne nickel-chrome-vanadium).

    Encore merci à tous.

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème SDL avec CodeBlock
    Par dr_nietzsche dans le forum Windows
    Réponses: 1
    Dernier message: 11/12/2008, 21h09
  2. Probléme SDL et CodeBlocks
    Par belha00 dans le forum SDL
    Réponses: 1
    Dernier message: 03/08/2008, 19h59
  3. Problème de focus MessageBox
    Par DarkBear dans le forum C#
    Réponses: 1
    Dernier message: 17/07/2007, 15h10
  4. Problème affichage avec MessageBox
    Par farfadet dans le forum C++
    Réponses: 5
    Dernier message: 02/07/2007, 13h10
  5. problème sdl blitter une image.!
    Par mitherkiller dans le forum SDL
    Réponses: 6
    Dernier message: 15/04/2007, 01h10

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