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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 167
    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 167
    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 !

+ 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