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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    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
    Par défaut SDL et API Windows (GetOpenFileName)
    Bonjour,

    Dans un programme où la fenêtre principale (non redimensionnable) est une fenêtre SDL, je fais des appels à la fonction GetOpenFileName (le hwndOwner de la structure OPENFILENAME est celui de cette fenêtre principale).

    Après un ou 2 appels de sélection de fichier et juste après un clic dans la fenêtre principale les boutons "icon" et "quit" (coin supérieur droit) deviennent inactifs !
    Il n'y a plus de surbrillance lorsque la souris passe dessus et il n'est plus possible d'iconifier ni de fermer la fenêtre.
    La situation redevient normale après action (mise en icône puis rétablissement) sur l’icône du programme dans la barre des tâches.

    Je travaille sous Windows 7 Pro, pouvez-vous me donner des pistes sur l'origine et la résolution de ce problème ?

    D'avance merci

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    À mon avis, ca vient plus de la manière d'ouvrir le sélecteur de fichier, de l'afficher, de le masquer, et surtout, de désactiver l'autre fenêtre pendant ce temps.

    Cela dit, ca fait un moment que j'ai plus fait d'interfaces graphiques, et je ne suis pas un spécialiste de SDL.

  3. #3
    Membre expérimenté
    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
    Par défaut
    ca vient plus de la manière d'ouvrir le sélecteur de fichier, de l'afficher, de le masquer, et surtout, de désactiver l'autre fenêtre pendant ce temps
    Pour faire pour cela j'ai une fonction classique qui déclare la structure OPENFILENAME et appelle GetOpenFileName c'est tout.

    Y a t-il des inits (instance, fenêtre ...) ou des précautions à prévoir lorsque l'on utilise l'API Windows avec un template (issu de Code::Blocks) SDL ?

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    attention... win api permet d'afficher, SDL aussi.

    Il est probable que SDL sur windows fasse appel à des initialisations de la winapi.
    Mais je n'ai jamais fais de SDL pour windows, donc je reste dans le conditionnel.

  5. #5
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 781
    Par défaut
    Hello,

    J'ai déjà utilisé GetOpenFileName() dans un projet sdl, sans problème. Mais pour hwndOwner, je faisais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    OPENFILENAME ofn;
     
    ofn.hwndOwner=GetConsoleWindow();
    Mais quelle version de sdl utilises-tu?

  6. #6
    Membre expérimenté
    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
    Par défaut
    Hello,

    J'utilise ofn.hwndOwner= GetActiveWindow();

    Je vais essayer avec ofn.hwndOwner=GetConsoleWindow();
    mais quel include faut-il ?
    (si je remplace brutalement j'ai une "undefined reference" )

    La version SDL: 1.2.14

  7. #7
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    Salut
    Citation Envoyé par nanosoft Voir le message
    Y a t-il des inits (instance, fenêtre ...) ou des précautions à prévoir lorsque l'on utilise l'API Windows avec un template (issu de Code::Blocks) SDL ?
    l'architecture d'un programme SDL et un programme Windows avec API c'est 2 choses différentes.
    Dans un programme avec API Windows il y a un WinMain() ,initialisation de la fenêtre et la gestion de la boucle de message avec PeekMessage(),TranslateMessage()..
    tu fais ce que tu veux pour gérer les fenêtres le revers de la médaille c'est que c'est plus lourd pour tout gérer.

    Sous SDL tout cela est masqué évidemment on n'a pas à gérer les API plus bas-niveau.
    Seulement l'inconvénient c'est que tu risques d'être bancal, à porte-à-faux entre SDL et les API Windows

    Voilà pourquoi je déconseille radicalement de mixer les 2


    Citation Envoyé par nanosoft Voir le message
    Actuellement j'essaie de remettre "l'activité des boutons" avec les fonctions ShowWindow mais j'ai constaté que c'était inefficace car je n'arrive pas à récupérer le bon HWND lorsque la fenêtre est "inactive" (après un clic droit dans le test).
    Je creuse du côté du "Z-order".
    si tu appelles une API Windows tu risques d'être bancal avec la logique interne de SDL..
    tu peux obtenir un handle de Windows mais ton HWND risque d'être invalide parce qu'il y a la cuisine interne de SDL à laquelle tu as difficilement accès sauf de cuisiner le code source de SDL.
    C'est ça le gros inconvénient des classes toute-faites censées masquer le "bas-niveau"
    Et puis dans la philosophie SDL tu n'as pas à appeler des API win32 vu que SDL doit être générique et multiplateformes

  8. #8
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      WDH = GetActiveWindow();
    tu obtiens vraisemblablement un mauvais HWND.
    La solution ce serait de faire une énumération de fenêtres et avec l'API FindWindow tu regardes si le HWND de fenêtre que tu obtiens correspond au nom de ton programme.
    Ou pour faire plus simple il faut essayer d'obtenir le HWND en fonction du nom de ton programme ou fenêtre affichée

  9. #9
    Expert confirmé
    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 : 39
    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
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      WDH = GetActiveWindow();
    tu obtiens vraisemblablement un mauvais HWND.
    La solution ce serait de faire une énumération de fenêtres et avec l'API FindWindow tu regardes si le HWND de fenêtre que tu obtiens correspond au nom de ton programme.
    Ou pour faire plus simple il faut essayer d'obtenir le HWND en fonction du nom de ton programme ou fenêtre affichée
    Il y a mieux : SDL_GetWMInfo.

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

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