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

Windows Discussion :

Prob. pour creer un MessageBox ou autre


Sujet :

Windows

  1. #1
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut Prob. pour creer un MessageBox ou autre
    Bonjour,

    je développe un DLL, non MFC, sous WinCE PocketPC.
    j'aurai voulu savoir comment creer une boite de dialogue vide (ou une image) par dessus les autres fenetres.
    Je compte mettre un message d'information dedans.

    J'ai fais cela:
    HWND hPopup = CreateWindow( _T("En attente..."), _T("En attente..."),
    WS_POPUP | WS_VISIBLE, 10, 10, 100, 100, GetDesktopWindow(), NULL, NULL, NULL );

    J'ai pu récupèrer le handle de la fenetre du dessus (celle qui à charger la dll), et j'ai remplacé GetDesktopWindow() par ce handle, mais cela ne change rien...
    Je n'ai pas réussi à récupèrer l'instance de la fenetre...

    Donc, j'ai 2 solution, soit je mets une boite de dialogue par dessus tout le monde, sans me soucier de ce qu'il y a dessous,
    soit je pose une image dans la fenetre du dessus

    Quelqu'un a une solution à mon problème ?

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Le premier argument de CreateWindow est le nom d'une classe de fenêtre, ce qui n'a rien à voir avec le titre de la fenêtre. BUTTON, EDIT, etc... sont des exemples de classes de fenêtres.
    Pourquoi ne pas utiliser MessageBox ?

  3. #3
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    ok, donc avec CreateWindow, on ne peut créer que des contrôles ?
    ou on peut créer aussi un boite de dialogue avec ?

    un MessageBox, pourquoi pas...
    mais j'aurai voulu qu'elle ne soit pas bloquante... en clair voilà ce que fait le prog.

    une fonction de la DLL creer un thread, puis boucle sur GetMessage (en attente d'un evenement X). Dans le thread, affichage d'un message d'attente, puis un Sleep qui sert de timer, puis envoi d'un message TimeOut.

    Donc la MessageBox ne doit pas être bloquante, avec un bouton annuler (qui pourrait être trapper par le GetMessage, en connaissant la taille et position du bouton...)

    Quelqu'un a une idée ?

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par dug
    ok, donc avec CreateWindow, on ne peut créer que des contrôles ?
    ou on peut créer aussi un boite de dialogue avec ?
    une boite de dialogue est un contrôle... tout est fenêtre sous Windows (tiens donc). Une dialogue est normalement définie dans une resource et créée via DialoBox (modal) ou CreateDialog (modeless).

    Citation Envoyé par dug
    un MessageBox, pourquoi pas...
    mais j'aurai voulu qu'elle ne soit pas bloquante... en clair voilà ce que fait le prog.

    une fonction de la DLL creer un thread, puis boucle sur GetMessage (en attente d'un evenement X). Dans le thread, affichage d'un message d'attente, puis un Sleep qui sert de timer, puis envoi d'un message TimeOut.

    Donc la MessageBox ne doit pas être bloquante, avec un bouton annuler (qui pourrait être trapper par le GetMessage, en connaissant la taille et position du bouton...)

    Quelqu'un a une idée ?
    Alors oui tu peux créer ta propre dialogue qui à son init démarre un timer et s'auto-ferme une fois qu'il y a time-out. Mais on peut aussi arriver à ce résultat avec MessageBox, en bidouillant, via un timer justement.
    http://support.microsoft.com/kb/181934/en-us
    http://blogs.msdn.com/oldnewthing/archive/2005/03/04/385100.aspx

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    Ce qui me parait bizarre, là-dedans, c'est que ça contredit un passage de MSDN sur les boites de dialogue:

    Citation Envoyé par MSDN
    To process messages for the modal dialog box, the system starts its own message loop, taking temporary control of the message queue for the entire application. When the system retrieves a message that is not explicitly for the dialog box, it dispatches the message to the appropriate window. If it retrieves a WM_QUIT message, it posts the message back to the application message queue so that the application's main message loop can eventually retrieve the message.
    À moins bien sûr que ceci ne doit valable que pour les DialogBox() et pas pour les MessageBox()...

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    MessageBox est une dialogue normale.
    C'est juste que WM_QUIT est supprimé avant de rendre la main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE);

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    En fait, j'ai du mal comprendre: Je croyais que ça voulait dire que la boite de dialogue ne quittait pas en recevant WM_QUIT, et le repostait jusqu'à ce qu'on l'ait fermée...

    Mais en effet c'est stupide, puisqu'elle aurait consommé 100% du proc et n'aurait plus jamais été redessinée...

  8. #8
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    ok, merci beaucoup de vos réponses.

    j'ai regardé les exemples, c'est très intéressant, et plus simple que je ne l'aurai fait.

    Par contre, si je veux faire un Message Box un peu plus évoluer... c'est à dire sans passer pas MessageBox.

    Comment je fais si je n'ai pas de ressource, et que je ne suis pas en MFC ?
    ( Et je n'ai pas d'instance de la fenetre parent... )

    J'aurai voulu creer manuellement la fenetre, puis les controles dedans...
    Qu'elle fonction dois-je utilisé ? :

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 31
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par dug
    J'aurai voulu creer manuellement la fenetre, puis les controles dedans...
    Qu'elle fonction dois-je utilisé ? :
    regarde dans la msdn
    createwindow et createwindowex
    les parametres definissent les styles et les objets

  10. #10
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    ok, j'avais regardé ces 2 fonctions...

    mais je ne trouve pas de class name qui corresponde à mon pb...
    je dois utilisé "MDICLIENT" ? je trouve cela bizarre, ça n'a rien à voir avec du MDI... et je ne trouve pas d'autre class name pour créer simplement une popup...

    je me trompe ?

  11. #11
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    bon, effectivement, les exemples ne font pas ce que j'aurai souhaité...

    La MessageBox est bloquant, même avec un timer derrière pour la débloquer automatiquement...

    en gros, je souhaite une popup contenant un message d'attente (attendant un évènement X), avec un bouton annuler, et un timeout qui ferme automatiquement la popup...

    vous voyez de quoi je parle ?

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par dug
    mais je ne trouve pas de class name qui corresponde à mon pb...
    parce que c'est à toi de créer ta propre classe (RegisterClass) qui fait exactement ce que tu veux.
    http://chgi.developpez.com/windows/winmain/
    MessageBox seul est bloquant. Je t'ai donné des liens pour créer une version avec timer qui la débloque au bout de X secondes.

  13. #13
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    ouaip, je viens de comprendre, et j'étais entrain de regardé tuto...

    j'ai regardé les liens que tu m'as donné plus haut, mais même avec un timer pour débloquer le MessageBox, cela ne peut pas marché.
    Le MessageBox sert juste à informer l'utilisateur qu'il doit scanner (évènement hardware), donc le MessageBox ne doit pas être bloquant, et ma boucle pour GetMessage pourra récupèrer l'évènement...

    Ce que je ne comprends pas, c'est que je n'ai pas de HINSTANCE à utiliser dans CreateWindow ? c'est grave docteur ? je ne pas bien compris à quoi cela sert (c'est pour les multi execution ?)
    Comment je fais sans ?

  14. #14
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    En fait il faut que tu précises ce que t'apelles bloquer, si c'est figer l'interface mère ou bloquer l'appli si personne ne clic (timeout).
    Tu reçois le HISNTANCE dans WinMain/DllMain. Si c'est un exe, tu peux le récupérer à nouveau via GetModuleHandle( NULL ). Si c'est une dll...

  15. #15
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    désolé de m'avoir mal exprimé...

    l'interface mère appelle une fonction de la dll.

    cette fonction créée un thread, puis boucle sur GetMessage, en recherchant le message hardware attendu (ou le message du timeout).

    Dans ce thread, je souhaite avoir globalement:
    - création d'une fenetre avec un texte pour prévenir l'utilisateur qu'il a X seconde pour générer l'évènement hardware attendu.
    - sleep de X seconde (donc le message doit être non bloquant)
    - envoi du message timeout
    fin du thread

    le texte pour l'utilisateur, peut etre basique juste un static, ou plutard un compteur représentant le timer, avec un bouton annuler, par ex...

    c'est plus clair là ?

  16. #16
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    Merci beaucoup pour le temps que tu passes avec moi Aurélien en tout cas !!

  17. #17
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Est-ce que l'interface du logiciel qui appelle ta dll (s'il y en a une) dois être bloquée pendant que la dialogue est active ?
    -> quand on quite notepad sans avoir enregistré, on est obligé de répondre à la boite "voulez-vous gnagna" : c'est une boite modale
    -> quanf on fait une recherche de texte dans notepad, on peut continuer à utiliser notepad alors que la boite de recherche est visible : modeless

    Pour ton problème, si le message hardware peut être reçu par une fenêtre mère, y'a beaucoup plus simple que ce que tu es en train de faire:
    une simple dialogue avec le texte que comme tu veux, et dans sa dialogue proc:
    WM_INITDIALOG : crée un timer
    WM_TIMER : met à jour le temps restant / ferme le dialogue
    WM_DESTROY : détruit le timer
    WM_XXX : le message "hardware" à traiter : fermer le dialogue

  18. #18
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    d'accord,
    oui, elle est bloqué, sinon c'est galère pour revoir le message sous pocketpc
    effectivement, si elle garde le focus, elle recevoir les évènements voulu, donc normalement, cela devrait marché...
    Je vais testé cela,

    merci beaucoup de ton aide, je comprends mieux maintenant...

Discussions similaires

  1. macro pour creer un graphe mais affiche un autre avant
    Par totau dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/08/2011, 13h07
  2. Réponses: 1
    Dernier message: 01/04/2005, 09h39
  3. Mkisofs - problème pour créer une image
    Par tomnie dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 04/08/2004, 11h44
  4. [PowerAMC] Comment s'en servir pour creer une base?
    Par Elmilouse dans le forum Access
    Réponses: 2
    Dernier message: 27/07/2004, 09h53
  5. [Kylix] MessageBox et autre
    Par glub dans le forum EDI
    Réponses: 4
    Dernier message: 13/02/2004, 02h34

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