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 :

ajouter item à une combobox


Sujet :

C

  1. #1
    Invité de passage
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2023
    Messages : 5
    Par défaut ajouter item à une combobox
    Bonjour j'utilise visual studio 2022,

    j'ai un problème avec l'ajout d'éléments à une combobox après sa création : si je tape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        TCHAR Planets[10] = L"Mercury";
        // Add string to combobox.
        SendMessage(hwnd_correct_shape_combobox, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)Planets);
    dans la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int WINAPI WinMain (HINSTANCE hinstance,
                        HINSTANCE hPrevInstance,
                        LPSTR     lpCmdLine, 
                        int       nCmdShow)
    {
        HWND hwnd_correct_shape_combobox = CreateWindow(WC_COMBOBOX, TEXT(""),
            CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
            xpos, ypos, nwidth, nheight, hwndParent, NULL, hinstance,
            NULL);
        TCHAR Planets[10] = L"Mercury";
        // Add string to combobox.
        SendMessage(hwnd_correct_shape_combobox, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)Planets);
    }
    la combobox ajoute bien le texte "Mercury",
    mais si je tape le même code avec bien sur "hwnd_correct_shape_combobox" en variable globale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        TCHAR Planets[10] = L"Mercury";
        // Add string to combobox.
        SendMessage(hwnd_correct_shape_combobox, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)Planets);
    en dehors de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int WINAPI WinMain (HINSTANCE hinstance,
                        HINSTANCE hPrevInstance,
                        LPSTR     lpCmdLine, 
                        int       nCmdShow)
    la combobox reste vide....
    Et j'aurais besoin que la combobox ajoute ce texte en dehors de WinMain

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 165
    Billets dans le blog
    4
    Par défaut
    T'es sûr que hwnd_correct_shape_combobox est initialisée quand tu l'utilises ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Invité de passage
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2023
    Messages : 5
    Par défaut
    oui je fait appel à sendmessage après la fonction winmain et createwindow aient été appelé

    je l'utilise dans une
    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
    LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        HDC hdc;
        PAINTSTRUCT ps;
     
        switch (uMsg)
        {
        case WM_CREATE:
            Presenter_Create ();
            return 0;
     
        case WM_COMMAND:
            // Si le bouton "créer la forme" est pressé
            if (LOWORD(wParam) == IDC_Create_Shape_Button) 
            {
                Presenter_On_Create_Shape_Button (hwnd_create_shape_edit, hwnd_recognized_shape, hwnd_correct_shape_combobox);
            }
            break;
     
        case WM_PAINT:
            {
                // Ecrit les différents labels de la fenêtre principale
                hdc = BeginPaint(hwnd, &ps);
                TextOut(hdc, 12, 5, L"Drawn shape", 11);
                TextOut(hdc, 402, 5, L"Recognized shape", 16);
                TextOut(hdc, 230, 25, L"Shape name to create :", 22);
                TextOut(hdc, 230, 130, L"Shape name to correct :", 24);
                EndPaint(hwnd, &ps);
            }
    		return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
     
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
    qui appele la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Presenter_On_Create_Shape_Button (hwnd_create_shape_edit, hwnd_recognized_shape, hwnd_correct_shape_combobox);
    qui a son tour :
    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
    void 
    Presenter_On_Create_Shape_Button (HWND Hwnd_Create_Shape_Button, HWND Hwnd_Recognized_Shape_Canvas, HWND hwnd_correct_shape_combobox_2)
    {
    	int Shape_Entries_Exist = 0;
    	char Shape_Name_To_Create[20] = "";
     
    	// On récupère le nom de la forme à créer
    	GetWindowText (Hwnd_Create_Shape_Button, &Shape_Name_To_Create, 20);
     
    	// Verifie si "l'Edit Text" n'est pas vide
    	if (strcmp(Shape_Name_To_Create, "") != 0)
    	{
    		// Verifie si le nom donné à la forme existe déjà
    		if (Model_Does_Shape_Name_Exist(Shape_Name_To_Create) == false)
    		{
    			// Verifie si la forme dessinée existe déjà et si le canvas n'est pas vide
    			Shape_Entries_Exist = Model_Does_Shape_Entries_Exist ();
     
    			if (Shape_Entries_Exist == SHAPE_DRAWN_DOESNT_EXIST)
    			{
    				Model_Create_Shape (Shape_Name_To_Create);
    				View_Add_Shape_Name_To_Combobox(hwnd_correct_shape_combobox_2, Shape_Name_To_Create);
    				Presenter_Draw_Recognized_Neuron(Hwnd_Recognized_Shape_Canvas);
    			}
    			else
    			{
    				if (Shape_Entries_Exist == SHAPE_DRAWN_EXIST)
    				{
    					MessageBox(NULL, L"La forme dessinée existe déjà", L"Erreur", MB_OK);
    				}
    				else
    				{
    					MessageBox(NULL, L"Dessinez une forme", L"Erreur", MB_OK);
    				}
    			}
    		}
    		else
    		{
    			MessageBox(NULL, L"Le nom de la forme existe deja", L"Erreur", MB_OK);
    		}
    	}
    	else
    	{
    		MessageBox(NULL, L"Entrez un nom de forme", L"Erreur", MB_OK);
    	}
    }
    et pour finir c'est la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void
    View_Add_Shape_Name_To_Combobox(HWND hwnd_correct_shape_combobox_2, wchar_t Shape_Name_To_Create[20])
    {
        TCHAR Planets[10] = L"Salut";
        // Add string to combobox.
        SendMessage(hwnd_correct_shape_combobox_2, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)Planets);
    }
    et la combobox ne se remplit pas

  4. #4
    Membre chevronné
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 216
    Par défaut
    si la Combobox ne se remplit pas, cela signifie que hwnd_correct_shape_combobox est différent de hwnd_correct_shape_combobox_2 dans ta fonction View_Add_Shape_Name_To_Comboboxtu peux vérifier dans View_Add_Shape_Name_To_Combobox en mettant (pour débugger)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if  (hwnd_correct_shape_combobox != hwnd_correct_shape_combobox_2) MessageBox (NULL, "erreur", "erreur", MB_OK);

    d'ailleurs pourquoi passer hwnd_correct_shape_combobox en paramètre, si tu l'as défini en variable globale ? (sauf si tu appelles la méthode avec d'autres combobox)

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 604
    Par défaut
    Quand tu écris
    Citation Envoyé par ciddu42 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        TCHAR Planets[10] = L"Mercury";
        // Add string to combobox.
        SendMessage(hwnd_correct_shape_combobox, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)Planets);
    tu transmets la valeur Planets qui est un pointeur sur une variable locale. Si la combo n'est pas créée avec le style CBS_HASSTRINGS, elle mémorise le pointeur pas la chaîne, la variable ayant disparue entre temps cela ne marche pas.

    Un moyen rapide pour vérifier, utilise une chaîne littérale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        const TCHAR* Planets = L"Mercury";
        // Add string to combobox.
        SendMessage(hwnd_correct_shape_combobox, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)Planets);

  6. #6
    Invité de passage
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2023
    Messages : 5
    Par défaut
    j'ai essayé d'utiliser la chaine littérale comme vous m'avez dit en l'appelant depuis la fonction :
    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
     
    {
     HWND hwnd_correct_shape_combobox = CreateWindow(WC_COMBOBOX, TEXT(""),
            CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
            xpos, ypos, nwidth, nheight, hwndParent, NULL, hinstance,
            NULL);
    View_Add_Shape_Name_To_Combobox(hwnd_correct_shape_combobox, "hey");
    }
     
    View_Add_Shape_Name_To_Combobox(HWND hwnd_correct_shape_combobox_2, wchar_t Shape_Name_To_Create[20])
    {
        const TCHAR* Planets = L"Mercury";
        // Add string to combobox.
        SendMessage(hwnd_correct_shape_combobox, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)Planets);
    }
    ce qui ne fonctionne pas...., alors que si je colle l'intérieur de la fonction View_Add_Shape_Name_To_Combobox après la création de la combobox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        HWND hwnd_correct_shape_combobox = CreateWindow(WC_COMBOBOX, TEXT(""),
            CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
            xpos, ypos, nwidth, nheight, hwndParent, NULL, hinstance,
            NULL);
     
        const TCHAR* Planets = L"Mercury";
        // Add string to combobox.
        SendMessage(hwnd_correct_shape_combobox, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)Planets);
    là ça fonctionne, il y a juste un appelle de fonction qui différencie les deux codes .... et le soucis c'est que j'ai besoin de l'appelle à la fonction View_Add_Shape_Name_To_Combobox pour faire un design pattern en modele-view-presenter.....

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 466
    Par défaut
    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
     
    HWND Combo1;
    //--------------------
    HWND CreateComboBox(HINSTANCE Instance, HWND AOwner, int X, int Y)
    {
    HWND combo = CreateWindow("COMBOBOX", "", 
                    CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE, 
                    X, 
                    Y, 
                    100, 
                    200, // pour dérouler par défaut plusieurs items
                    AOwner, NULL, Instance, NULL); 
    return combo;
    }
    //--------------------
    void AddString(HWND ACombo, const char *AString)
    {
    SendMessage(ACombo, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR) AString);
    }
    Dans la WinMain après avoir la création de la fenêtre principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Combo1 = CreateComboBox(hInstance, hwnd, 10, 10);
    if(Combo1 != NULL)
    	{
    	AddString(Combo1, "Hello !");
    	AddString(Combo1, "Item2 !");
    	AddString(Combo1, "What for ?");
    	AddString(Combo1, "It works !");
    	}
    Ca fonctionne !

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 466
    Par défaut
    Pour donner vie, j'ai rajouté dans la WinProc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    case WM_LBUTTONDOWN:
    	AddString(Combo1, "Ajouter A");
    	break;
    case WM_RBUTTONDOWN:
    	AddString(Combo1, "Ajouter B");
    	break;
    Donc en cliquant dans la zone client de la fenêtre principale, les deux chaines sont bien rajoutées à Combo1.

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 604
    Par défaut
    Il y a quelque chose qui me perturbe dans le code.
    Les fenêtres s'attendent à recevoir un texte qui peut être ou pas UNICODE (à définir dans le projet).
    La chaîne de caractère à passer est un const wchar_t* ou un const char*. Il faut utiliser le bon type.
    Normalement le type TCHAR est justement fait pour s'adapter à chaque cas, et ne semble pas être char!

    Mais il semble que la fonction marche avec const char*, à voir si c'est le type de la chaîne qui pose un problème.

  10. #10
    Invité de passage
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2023
    Messages : 5
    Par défaut
    Merci pour vos réponses !

    la solution de henderson ne fonctionnait pas et ne créait pas de combobox du tout, il fallait faire 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
    15
    16
    17
    18
    HWND Combo1;
    //--------------------
    HWND CreateComboBox(HINSTANCE Instance, HWND AOwner, int X, int Y)
    {
    HWND combo = CreateWindow(L"COMBOBOX", L"", 
                    CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE, 
                    X, 
                    Y, 
                    100, 
                    200, // pour dérouler par défaut plusieurs items
                    AOwner, NULL, Instance, NULL); 
    return combo;
    }
    //--------------------
    void AddString(HWND ACombo, const char *AString)
    {
    SendMessage(ACombo, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR) AString);
    }
    et celà pour avoir un texte correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Combo1 = CreateComboBox(hInstance, hwnd, 10, 10);
    if(Combo1 != NULL)
    	{
    	AddString(Combo1, L"Hello !");
    	AddString(Combo1, L"Item2 !");
    	AddString(Combo1, L"What for ?");
    	AddString(Combo1, L"It works !");
    	}
    Mais je te remercie Henderson grâce à toi j'ai pu identifier le problème !

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 466
    Par défaut
    En fait, je développe avec DEV cpp donc au plus près de WINDOWS, et en 32Bits donc ... Ok!
    Par contre, j'ai fini par développer mes propres classes d'objets graphiques pour éviter tout le code événementiel ... mais ça, c'est une autre histoire !

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

Discussions similaires

  1. [Débutant] Charger une bdd externe au lancement puis l'ajouter dans une combobox
    Par BeatiPauperesSpiritu dans le forum Visual Studio
    Réponses: 0
    Dernier message: 08/02/2016, 17h11
  2. Ajouter plusieurs items à une Combobox
    Par ShortcutZ dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 16/10/2006, 10h14
  3. Réponses: 20
    Dernier message: 04/10/2006, 16h48
  4. [VB.NET2005]PropertyGrid : utiliser un item d'une combobox
    Par NicolasJolet dans le forum Windows Forms
    Réponses: 1
    Dernier message: 30/03/2006, 16h51
  5. ajouter une valeur dans une combobox
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 17/10/2005, 11h58

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