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 :

[Debutant/WinAPI] Souci avec boucle While et GetMessage()


Sujet :

Windows

  1. #1
    Membre régulier Avatar de SnowStyle
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2005
    Messages : 73
    Points : 91
    Points
    91
    Par défaut [Debutant/WinAPI] Souci avec boucle While et GetMessage()
    Merci de m'avoir aider j'ai ressolue mon souci de boucle qui bloque la reception des messages (GetMessage)

    J'ai en revanche d'autres problèmes, c'est par ici --> http://www.developpez.net/forums/vie...297342#2297342

    Ou alors c'est juste quelques post plus bas comme vous voulez


    ------------------------------------------------------------


    Bonjour, je suis debutant en C++ et je nage complet, j'arrive a ne pas couler mais bon c'est pas evident je comprend pas tout, alors je bidouille pour essayer de comprendre.

    Mais là je bloque, je vais essayer d'exposé mon probleme

    Tout d'abord precision important, j'utilise Dev-C++

    Le but est simple, je veux faire une fenetre avec une checkbox, quand elle est coché, le programme lance en boucle une fonction (While), une fois decoché, la boucle s'arrete... de plus je donne la possibilité aussi de pouvoir coché/décoché avec un raccourci clavier (F9).

    Jusque là tout va bien, mon probleme est que lorsque je coche ma checkbox, la fonction se lance en boucle, et je n'arrive plus a l'arreter, ma fenetre se fige, la checkbox et le raccourci clavier ne servent plus a rien.

    Alors peut etre que l'utilisation d'une boucle while n'est pas la bonne solution ?

    Je vais essayer de montrer les bouts de code important, ca se divise en trois partie

    Premiere partie, les variables global ainsi que le code de creation de la fenetre par default legerement bidouiller avec une checkbox rajouter
    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
    #include <windows.h>
    #include <iostream.h>
    #define ID_BUTTON 100
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure &#40;HWND, UINT, WPARAM, LPARAM&#41;;
    
    /*  Make the class name into a global variable  */
    char szClassName&#91; &#93; = "WindowsApp";
    int mult &#40;&#41;;
    HWND hwnd;
    MSG messages;
    
    int WINAPI WinMain &#40;HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil&#41;
    
    &#123;
        /*HWND hwnd;                This is the handle for our window */
        
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof &#40;WNDCLASSEX&#41;;
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon &#40;NULL, IDI_APPLICATION&#41;;
        wincl.hIconSm = LoadIcon &#40;NULL, IDI_APPLICATION&#41;;
        wincl.hCursor = LoadCursor &#40;NULL, IDC_ARROW&#41;;
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground = &#40;HBRUSH&#41; COLOR_BACKGROUND;
    
        /* Register the window class, and if it fails quit the program */
        if &#40;!RegisterClassEx &#40;&wincl&#41;&#41;
            return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx &#40;
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Gaia Fishing &#58;&#58; Bot",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               350,                 /* The programs width */
               275,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               &#41;;
    
         HWND cmdhWnd = CreateWindowEx&#40;
         0,
         "BUTTON",
         "",
    WS_VISIBLE|WS_CHILD|BS_CHECKBOX|BS_AUTOCHECKBOX|BS_NOTIFY|BS_TEXT,
         30,
         30,
         150,
         80,
         hwnd,
         &#40;HMENU&#41;ID_BUTTON,
         hThisInstance,
         NULL
         &#41;;
        ShowWindow &#40;hwnd, nFunsterStil&#41;;
        SetWindowText&#40;cmdhWnd, "Checkbox!"&#41;;
        
      //--------------
        
        while &#40;GetMessage &#40;&messages, NULL, 0, 0&#41;&#41;
        &#123;
            TranslateMessage&#40;&messages&#41;;
            DispatchMessage&#40;&messages&#41;;
        &#125;
        return messages.wParam;
    &#125;
    Ensuite une fonction qui apparemment recoit les evenements de la fenetre et permet de les analyses puis d'agir en consequence, ici aussi j'ai bidouille pour essayer seulement de comprendre comment ca marche et voir si j'arrivais a faire un raccourci clavier, ca avait marcher
    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
    LRESULT CALLBACK WindowProcedure &#40;HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam&#41;
    &#123;
        switch &#40;message&#41;                  /* handle the messages */
        &#123;
            case WM_KEYDOWN&#58;
                 switch &#40;wParam&#41; 
                 &#123;
                 case VK_F9&#58;
                  cout<< "Ta toucher au F9 ducon?" << endl;
                  if &#40;IsDlgButtonChecked&#40;hwnd,100&#41;==1&#41; &#123;
                  CheckDlgButton&#40;hwnd,100,BST_UNCHECKED&#41;;
                  &#125;
                  else &#123;
                       CheckDlgButton&#40;hwnd,100,BST_CHECKED&#41;;
                       mult &#40;&#41;;
                       &#125;
                  
                  break;
                 &#125;
            case WM_COMMAND&#58;
                if &#40;IsDlgButtonChecked&#40;hwnd,100&#41;==1&#41;
                &#123;
                cout<< "Checkbox activé" << endl;                                   
                &#125;
                else
                &#123;
                cout<< "Checkbox désactivé" << endl;
                &#125;
                break;
            case WM_DESTROY&#58;
                PostQuitMessage &#40;0&#41;;       /* send a WM_QUIT to the message queue */
                break;
            default&#58;                      /* for messages that we don't deal with */
                return DefWindowProc &#40;hwnd, message, wParam, lParam&#41;;
        &#125;
    
        return 0;
    &#125;
    Et pour finir ma fonction, et je ne voyais pas d'autres endroit pour mettre ma boucle while, pour pouvoir l'appeller en fonction de la checkbox ou du F9
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int mult &#40;&#41;
    &#123;
        while &#40;IsDlgButtonChecked&#40;hwnd,100&#41;==1&#41;
        &#123;
          cout<< "Test de la boucle" << endl;
          Sleep&#40;1000&#41;
        &#125;
    &#125;

    Donc mon souci est qu'une fois la boucle lancer, j'ai l'impression que je n'arrive plus a capter les events sur la fenetre (Checkbox/F9) et que donc je n'arrive plus a l'arreter.

    J'aimerai savoir comment faire pour que dans ma boucle, il puisse analysé les messages recus un peu comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        while &#40;GetMessage &#40;&messages, NULL, 0, 0&#41;&#41;
        &#123;
            TranslateMessage&#40;&messages&#41;;
            DispatchMessage&#40;&messages&#41;;
        &#125;
        return messages.wParam;
    J'ai essayer de l'integrer a ma fonction mult() avec de l'espoir mais ensuite la boucle while ne marche plus, elle marche uniquement pendant le deplacement de la souris ou pendant que j'appuie sur des touches, enfin elle fonctionne uniquement quand il y a un event sur la fenetre sinon elle reste bloqué.

    Si quelqu'un pouvait m'expliquer a peu pres pourquoi ca m'interesserait de comprendre :

    Et ne cherchez pas a comprendre a quoi ca sert pour l'instant ca ne sert a rien j'essaye d'apprendre tout simplement a faire certaines choses.

    Merci d'avance

  2. #2
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    C'est tout à fait normal,

    Ta boucle tourne sans fin, puisque pour décocher la case il faudrait sortir de cette boucle.

    Sous Windows tous les événements doivent être traité en passant par la procédure de fenêtre.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu veux faire un truc en boucle comme ceci, deux façons possibles me viennent à l'esprit:
    1) un message qui est re-posté à chaque fois (attention, il te faudra inclure un UpdateWindow() dans la procédure de traitement, car sinon la fenêtre ne se rédessinera plus)
    2) Un timer : regarde du coté de la fonction SetTimer().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre régulier Avatar de SnowStyle
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2005
    Messages : 73
    Points : 91
    Points
    91
    Par défaut
    Procedure de fenetre ? je suppose que ca correspond a "int WINAPI WinMain" je connais pas trop les termes encore

    Mais quand je met ma boucle while dedans, je n'arrive pas a l'activé ou desactivé.

    ps: merci pour avoir déplacé le sujet

  5. #5
    Membre régulier Avatar de SnowStyle
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2005
    Messages : 73
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par Médinoc
    Si tu veux faire un truc en boucle comme ceci, deux façons possibles me viennent à l'esprit:
    1) un message qui est re-posté à chaque fois (attention, il te faudra inclure un UpdateWindow() dans la procédure de traitement, car sinon la fenêtre ne se rédessinera plus)
    2) Un timer : regarde du coté de la fonction SetTimer().
    Pour le petit 1 je ne comprend pas trop a quoi correspond "un message qui est re-posté à chaque fois", mais ca m'interesserait de savoir.

    Concernant le petit 2, je ne connais pas trop cette fonction en effet, je vais aller me documenter un peu merci pour la suggestion

  6. #6
    Membre régulier Avatar de SnowStyle
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2005
    Messages : 73
    Points : 91
    Points
    91
    Par défaut
    Bon ok apres pas mal de temps de bidouillage intense et de lecture, entre ce site (les timers de bob) et la msdn de microsoft, j'ai fini par comprendre comment faire ça avec un timer

    J'ai plus de fonction "mult()" a appeller et je n'ai plus de boucle while étant donner que le timer remplace la boucle

    j'ai juste rajouter dans la fonction qui recoit les messages (LRESULT) un WM_TIMER qui verifie si la checkbox est coché, si oui elle m'affiche un simple message, sinon elle s'autokill

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    case WM_TIMER&#58;
                 if &#40;IsDlgButtonChecked&#40;hwnd,100&#41;==1&#41;
                 &#123;
          cout<< "Test timer" << endl;               
                 &#125;
                 else
                 &#123;
                             KillTimer&#40;hwnd,10&#41;;                            
                 &#125;
    Puis dans l'handle sur le raccourci clavier je lance le timer quand la touche F9 est utilisé

    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
    case WM_KEYDOWN&#58;
                 switch &#40;wParam&#41; 
                 &#123;
                 case VK_F9&#58;
                  cout<< "Ta toucher au F9 ducon?" << endl;
                  if &#40;IsDlgButtonChecked&#40;hwnd,100&#41;==1&#41; &#123;
                  CheckDlgButton&#40;hwnd,100,BST_UNCHECKED&#41;;
                  &#125;
                  else &#123;
                       CheckDlgButton&#40;hwnd,100,BST_CHECKED&#41;;
                       SetTimer&#40;hwnd,10,500,NULL&#41;;
                       &#125;
                  break;
                 &#125;
    D'ailleurs je pense pouvoir changer ca en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    case WM_KEYDOWN&#58;
                 if &#40;wParam==VK_F9&#41; 
                 &#123;
                  cout<< "Ta toucher au F9 ducon?" << endl;
                  if &#40;IsDlgButtonChecked&#40;hwnd,100&#41;==1&#41; &#123;
                  CheckDlgButton&#40;hwnd,100,BST_UNCHECKED&#41;;
                  &#125;
                  else &#123;
                       CheckDlgButton&#40;hwnd,100,BST_CHECKED&#41;;
                       SetTimer&#40;hwnd,10,500,NULL&#41;;
                       &#125;
                 &#125;
    Je n'ai pas besoin d'un switch pour ca (je crois que je commence a mieux comprendre petit a petit )

    Maintenant mon seul souci avec le timer c'est qu'il sert de boucle mais avec un delai tres precis, soit là j'ai mis 500ms, mais si par exemple au lieu de simplement afficher un message dans une fenetre dos, je voulais faire des calculs ou autres operations complex qui durerait plus de 500ms ? ca ne risque pas de tout faire planter?

    Je devrais peut etre Kill le timer a event "WM_TIMER" detecté et le relancer ensuite une fois mes opérations terminer? et donc reduire le delai de 500ms a 0ms pour que ca devienne une boucle.

    comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    case WM_TIMER&#58;
                 if &#40;IsDlgButtonChecked&#40;hwnd,100&#41;==1&#41;
                 &#123;
          KillTimer&#40;hwnd,10&#41;;
          //---ici toutes mes opérations ultra complex
          cout<< "Test timer" << endl;
          //---
          SetTimer&#40;hwnd,10,0,NULL&#41;;            
                 &#125;
                 else
                 &#123;
                             KillTimer&#40;hwnd,10&#41;;                            
                 &#125;
    Voilà merci de me dire si je fais de grosses erreurs dans ma façon de faire, je n'ai pas trop de méthode pour arriver a ce que je veux faire, j'ai demarrer en C++ depuis peu, je découvre étape par étape en bidouillant maladroitement.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    1°) Procédure de fenêtre n'est pas WinMain(). Généralement, on appelle la procédure de fenêtre WindowProc().

    2°) Si tu fais un calcul de plus de 500ms, les messages WM_TIMER vont juste s'accumuler en file d'attente, et seront tous traités très vite ensuite. Donc, pas vraiment de problème de blocage, juste le temps qui parait un peu moins régulier...
    (par ex, si tu fais un calcul de 6 secondes, tu devrais avoir quelque chose du genresix "Test timer" qui s'affichent d'un coup dès que le calcul est fini, enfin, je pense) (je n'ai pas testé, mais il me semble bien que c'est comme ça)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Et CreateThread() ? Tu as essayé CreateThread() ?
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  9. #9
    Membre régulier Avatar de SnowStyle
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2005
    Messages : 73
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par David.Schris
    Et CreateThread() ? Tu as essayé CreateThread() ?
    Je ne connais pas non cette fonction, je vais me documenter et etudier ca

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Euh... C'est pas conseillé pour ce que tu cherches à faire là...
    à ton niveau, ça risque de poser plus de problèmes que ça n'en résout...

    (problèmes de synchonisation, nécessité de changer certaines options du projet si tu es sous Visual (Régler "C-Runtime library" sur "multithreaded"), etc.)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre régulier Avatar de SnowStyle
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2005
    Messages : 73
    Points : 91
    Points
    91
    Par défaut
    D'accord, toute façon j'ai rien compris sur CreateThread(), ça doit pas être pour les petits débutant comme moi

    Merci pour l'aide en tout cas, grace aux Timer j'ai pu resoudre ces quelques soucis et j'en ai appris d'avantage.

    Mais de nouveaux sont apparus (soucis), et d'anciens persiste, je vais rester sur mon topic etant donner que le code est présent.

    Souci n°1 :

    En faite tout marche comme je le voulais, mais j'ai une fenetre en trop qui s'ouvre a chaque fois, de type Dos, j'ai retirer l'utilisation d'iostream de ma source, mais la fenetre est toujours presente, j'ai compare mon code WinMain par rapport a ceux sur la MSDN et sur ce site (Bob tutoriel), et j'ai meme telecharger l'exemple de Bob, il m'ouvre aussi cette mysterieuse fenetre, je ne comprend pas trop d'ou elle sort et comment la retirer.

    Je précise à nouveau que j'utilise Dev C++.

    Souci n°2 :

    Ensuite, plus difficile pour moi a expliquer, j'ai rencontrer un autre problème, j'aurai voulu afficher deux objets int dans une meme editbox, mais rien a faire, au debut j'arrivais meme pas a en afficher un seul
    mais après lecture finalement avec la fonction SetDlgItemInt() ca a marcher, mais pas possible d'en mettre deux cote a cote dans une meme editbox.

    Enfin j'ai essayé diverse choses comme SetDlgItemInt(hwnd, 102, i ' ' j, FALSE), SetDlgItemInt(hwnd, 102, i " " j, FALSE), SetDlgItemInt(hwnd, 102, i x032 j, FALSE), SetDlgItemInt(hwnd, 102, i /032 j, FALSE) ... enfin bon des tentatives de bidouilleur qui comprend rien
    J'aurai voulu reunir deux int dans une variable, de façon a utiliser SetDlgItemText().

    J'ai une serieuse lacune concernant les variables genre char, const char, int, ect.. j'ai pas trop compris comment ca fonctionne.

    J'ai par exemple, int i=5 et int j=6, et je voudrais les reunir dans une variable texte de façon a ce que ça puisse return 5x6 dans une editbox.

    j'ai bien tenter de faire des trucs comme, char x = i"x"j; ou plein de choses en partant de cette idée.

    Je n'ai pas compris comment ca fonctionne, dans certains language de script le simple fait de faire x = i & "+" & j ca fonctionne et x return 5+6.

    Si quelqu'un qui comprend ce que je veux dire pourrait me donner un exemple ca m'aiderait beaucoup, ou alors qui connait un tutoriel concernant ce genre de manipulation ca m'interesse car j'en ai pas trouver, ou toutes formes d'aide j'apprecierais, enfin a part me conseiller de laisser tomber

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    La fenêtre de "type DOS" qui s'affiche : dans les propriétés du projet, changer le type de projet (là tu as choisi un truc du genre "Win32 console").

    Pour "ajouter" deux entiers et obtenir une chaine, cela dépend du langage : C ou C++ ?
    Je suppose qu'il s'agit de C++ puisque tu parlais d'iostream.
    Pour ça : http://c.developpez.com/cours/#cpp (commence par les bases).

    En C c'est un peu moins évident puisqu'il n'y a pas de type "chaine de caractères" en C.
    Il faut donc déclarer un pointeur sur un chaine ou un tableau de caractères (ce qui revient presque au même), puis utiliser une fonction du style sprintf() pour écrire les nombres sous forme de chaine dans le buffer/tableau. ca donne un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char chaine&#91;256&#93;;
    int i=27;
    int j=965;
    sprintf&#40;chaine,"%i %i",i,j&#41;;
    Je dis "du genre" car il faut aussi s'assurer que la zone mémoire qui va accueillir la chaine sera assez grande pour ne pas écrire où il ne faut pas, etc...

    En C++, il y a plus simple (tu verras ça en allant à l'adresse citée plus haut entre autres ou ).

    [Edition : ajout de l'URL vers la FAQ C++ sur les chaînes de caractères]
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

Discussions similaires

  1. JButton avec boucle while contenant thread.sleep(1000)
    Par v4np13 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 17/10/2007, 20h31
  2. [MySQL] Probleme UPDATE avec boucle WHILE
    Par iverson_mac dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/06/2007, 17h07
  3. Réponses: 2
    Dernier message: 19/11/2006, 10h54
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52

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