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 :

[Débutant]Quelques questions de principe sur l'API win32


Sujet :

Windows

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 10
    Points : 12
    Points
    12
    Par défaut [Débutant]Quelques questions de principe sur l'API win32
    Hello,

    Je suis débutant au niveau programmation de l'API Win32. Je programme en C, et après avoir lu plusieurs tutorials je me pose quelques questions.

    La fonction MessageBox m'intrigue sur trois points :
    -Quelle est la différence entre MessageBox et MessageBoxEx ? Idem pour CreateWindow et CreateWindowEx, etc..
    -Le premier argument, que se passe-t-il si il vaut NULL ? J'ai mis le HANDLE de ma fenêtre principale et ça marche aussi bien.
    -Pour le quatrième argument, j'ai vu à la fois MB_OK + MB_ICONINFORMATION (par exemple) et MB_OK | MB_ICONINFORMATION. Pourquoi faire un OU logique ?

    Par ailleurs, je suis forcé d'utiliser dans pas mal de cas la macro TEXT("..."), not. dans la fonction swscanf par exemple. Pourquoi une chaîne de caractères entre doubles guillemets ne fonctionne pas ?

    Pour la fonction WinMain, j'ai vu APIENTRY et WINMAIN pour déclarer la fonction... quelle(s) différence(s) ?

    Je pose vraiment bcp de questions mais j'aime bien comprendre ce que je fais... Merci si vous pouvez me répondre !

    @+ Jonathan

  2. #2
    Membre chevronné
    Avatar de Bidouille
    Inscrit en
    Mars 2003
    Messages
    1 281
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 1 281
    Points : 1 999
    Points
    1 999
    Par défaut Re: [Débutant]Quelques questions de principe sur l'API win32
    Citation Envoyé par silver_dragoon
    -Quelle est la différence entre MessageBox et MessageBoxEx ? Idem pour CreateWindow et CreateWindowEx, etc..
    Il s'agit surtout de l'historique Windows : MessageBoxEx remplace MessageBox avec de nouvelles possibilités.
    Les nouvelles API ...Ex acceptent désormais une structure et non plus une liste d'arguments. Cela permet d'éviter les erreurs.
    Rédacteur PHP / Delphi ADO / Novell / OpenOffice.org

    Inutile de m'envoyer vos questions par MP, je ne réponds que par le forum.

  3. #3
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Certains arguments sont des combinaisons de flags. Conceptuellement, un flag est un bit, que tu peux mettre a 0 ou a 1 pour choisir une option. Tu en trouveras enormement si tu te mets au dev WIN32.

    Les arguments des fonctions representant les flags sont en general des DWORD (32 bits) donc tu peux regrouper 32 flags dans un seul DWORD, pratique non?

    On en vient ensuite a ta question, pourquoi | ou + ??? En fait pour qu'une valeur decimale ne represente qu'un seul bit a 1 en binaire, il faut qu'elle soit puissance de 2:
    ex:
    8 = 00001000
    64 = 0100000
    ...et on voit bien que faire un | ou un + sur des puisances de 2 revient au meme (essaie avec mon exemple).

    Les flags, comme MB_OK ou MB_ICONINFORMATION, sont donc des #define de puissances de 2 et on peut les combiner soit avec des | ou soit avec des + (mais avec des | je pense que c + rapide)

    Bon la je m'emporte un peu mais j'espere avoir ete clair...
    La différence entre la théorie et la pratique, c'est qu'en théorie c'est la même chose mais qu'en pratique ça ne l'est pas.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    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 752
    Points : 10 682
    Points
    10 682
    Billets dans le blog
    3
    Par défaut
    Il s'agit surtout de l'historique Windows : MessageBoxEx remplace MessageBox avec de nouvelles possibilités.
    En C++, on aurait pu surcharger la fonction, en C, on se débrouille comme on peu. Ex = Extended = Etendu => c'est une version étendue de la fonction, qui accepte des parametres supp dont tu n'as pas souvent l'utilité (MessageBoxEx permettait de choisir la langue). On trouve aussi des fonction surchargées via un numéro (en COM généralement : Navigate, Navigate2...)

    Les nouvelles API ...Ex acceptent désormais une structure et non plus une liste d'arguments. Cela permet d'éviter les erreurs.
    Je crois que tu confonds avec Indirect (MessageBoxIndirect).

    Les flags, comme MB_OK ou MB_ICONINFORMATION, sont donc des #define de puissances de 2 et on peut les combiner soit avec des | ou soit avec des + (mais avec des | je pense que c + rapide)
    Attention, y'a une tres grosse différence entre utiliser | ou +.
    Un + effectue une addition, et ça peut créer des surprise. Des fois, des flags sont une combinaison d'autres, genre :
    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
    #define WS_OVERLAPPED       0x00000000L
    #define WS_CAPTION          0x00C00000L     /* WS_BORDER | WS_DLGFRAME  */
    #define WS_BORDER           0x00800000L
    #define WS_DLGFRAME         0x00400000L
    #define WS_SYSMENU          0x00080000L
    #define WS_THICKFRAME       0x00040000L
    #define WS_MINIMIZEBOX      0x00020000L
    #define WS_MAXIMIZEBOX      0x00010000L
    
    #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED     | \
                                 WS_CAPTION        | \
                                 WS_SYSMENU        | \
                                 WS_THICKFRAME     | \
                                 WS_MINIMIZEBOX    | \
                                 WS_MAXIMIZEBOX)
    Si tu ne sait pas que WS_OVERLAPPEDWINDOW inclue déjà le style WS_DLGFRAME (inclu via WS_CAPTION), tu vas donc créer 2 fois le masque WS_DLGFRAME. Si tu utilises |, pas de conséquence car
    01 OR 01 = 01
    Mais avec un +, ça va faire n'importe quoi :
    01 + 01 = 10
    Ca ne revient pas du tout au même.
    Donc, il ne faut pas utiliser +.


    Le premier argument, que se passe-t-il si il vaut NULL ?
    Pour le savoir, se référer à la doc :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/dialogboxes/dialogboxreference/dialogboxfunctions/messagebox.asp
    Handle to the owner window of the message box to be created. If this parameter is NULL, the message box has no owner window.
    Si tu mets le handle de ta fenêtre, c'est elle qui "détiendra" la messagebox (bloquée par elle).

    TEXT permet de transformer les chaines en UNICODE.
    Les chaines acceptées par Windows sont du type LPCTSTR, mais ce type n'existe en fait pas:
    LP = pointeur
    C = constant
    T = ANSI ou UNICODE
    STR = chaine de car
    => pointeur sur une chaine constante ansi ou unicode
    La différence :
    ANSI : CHAR * = char * = 1 octet
    UNICODE : WCHAR * = wchar_t * = 2 octets
    char * toto = "toto";
    wchar_t * toto = L"toto";

    Normalement, un prog Win9X doit être ANSI et WinNT unicode car Win9X est en interne ANSI et WinNT UNICODE en interne. Pour que n'importe quel prog (ansi ou unicode) fonctionne, les API existent (celles concernées) en 2 versions, Ex :
    MessageBoxA : ANSI version
    MessageBoxW : UNICODE version
    MessageBox tout court n'existe pas!

    Récapitulatif:
    on a
    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
    WINUSERAPI
    int
    WINAPI
    MessageBoxA(
        IN HWND hWnd,
        IN LPCSTR lpText,
        IN LPCSTR lpCaption,
        IN UINT uType);
    WINUSERAPI
    int
    WINAPI
    MessageBoxW(
        IN HWND hWnd,
        IN LPCWSTR lpText,
        IN LPCWSTR lpCaption,
        IN UINT uType);
    Si on veut être ansi, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBoxA( 0, "msg", "tittre", 0 );
    si on veut être unicode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBoxW( 0, L"msg", L"tittre", 0 );
    Bref, faut écrire 2 différents programmes si on veut être l'un ou l'autre au choix.
    Astuce utilisée : si rien n'est défini, on est ANSI. Si UNICODE est défini, on est UNICODE:
    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
    // Generic types 
     
    #ifdef UNICODE 
        typedef wchar_t TCHAR; 
    #else 
        typedef unsigned char TCHAR; 
    #endif 
     
    typedef TCHAR * LPTSTR, *LPTCH; 
     
    // 8-bit character specific 
     
    typedef unsigned char CHAR; 
    typedef CHAR *LPSTR, *LPCH; 
     
    // Unicode specific (wide characters) 
     
    typedef unsigned wchar_t WCHAR; 
    typedef WCHAR *LPWSTR, *LPWCH; 
    
    #ifdef UNICODE
    #define MessageBox  MessageBoxW
    #else
    #define MessageBox  MessageBoxA
    #endif // !UNICODE
    voir winuser.h et
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_28c3.asp
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_28c3.asp

    reste plus qu'à convertir les string "toto" en L"toto pour unicode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifdef UNICODE
    #define TEXT(x) L##x
    #else
    #define TEXT(x) x
    #endif
    Et maintenant le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LPCTSTR msg = TEXT( "message" );
    LPCTSTR title = TEXT( "titre" );
    MessageBox( 0, msg, title, 0 );
    compile aussi bien en ANSI qu'en UNICODE

    Pour la fonction WinMain, j'ai vu APIENTRY et WINMAIN pour déclarer la fonction... quelle(s) différence(s) ?
    Tu veux dire WINAPI surement...
    #define APIENTRY WINAPI
    => pas de différence, vis à vis du code.
    C'est une histoire de convention. Je pense que WINAPI est plutot à utiliser pour déclarer des fonction de l'api win32, et APIENTRY pour déclarer des fonctions qui n'en font pas partie. WinMain faisant partie de win32, mieux vaut utiliser WINAPI.
    Pour rajouter à la confusion :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/winmain.asp

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Hello,

    Merci tout le monde not. HW qui fournit vraiment un réponse très complète et très précise. Je n'utiliserai que des | maintenant ! Et je vais aussi regarder MessageBoxEx sur msdn.

    Encore merci !

    @+

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

Discussions similaires

  1. [Débutant] Quelques questions bêtes...
    Par Stomp dans le forum Windows
    Réponses: 2
    Dernier message: 02/08/2019, 11h47
  2. [Débutant] Quelques questions.
    Par Simonake dans le forum Débuter avec Java
    Réponses: 12
    Dernier message: 13/07/2009, 17h14
  3. [Débutant] Quelques questions
    Par SkwiZ dans le forum Flash
    Réponses: 6
    Dernier message: 16/04/2008, 11h12
  4. [Débutant] Quelques questions d'ordre général
    Par salseropom dans le forum Fortran
    Réponses: 3
    Dernier message: 22/10/2007, 15h21
  5. [Winform] Question de principe sur les Winform
    Par Thor Tillas dans le forum C++/CLI
    Réponses: 2
    Dernier message: 13/03/2007, 15h19

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