I'm sorry I've been posting so much, I'm still learning. :) My question how do you fill a combo using a varible. for example I want to fill my combo box in Visual C++ with something like this.

char *names[2];
names[0] = "Joe";
names[1] = "Billy";
names[2] = "Bob";

Please note this is an example, I realize that I could just fill it myself w/ this example.
Thanx again,
Atrus

Recommended Answers

All 9 Replies

Got anything a little easier? :)

Got anything a little easier? :)

How about this:

#include <windows.h>

#define ID_LIST 1
#define ID_TEXT 2

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "ComboBox App";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    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 (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    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 = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "ComboBox App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* 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 */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


//User Defined Function(s)

//Compare the efficiency of my C++ function vs. Charles Petzold's C function  
//Page #407
void FillListBox(HWND hwndList)
{
     TCHAR *pVarName[] = {"Item1", "Item2", "Item3", "Item4", "Item5"};
     
     for(int i=0; i<5; i++)
  
             SendMessage(hwndList, CB_ADDSTRING, 0, (LPARAM)pVarName[i]);
     
}
             



/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndList, hwndText;
    int iIndex, iLength, cxChar, cyChar;
    TCHAR pVarName[30];
        
     
        
    switch (message)                  /* handle the messages */
    {
    
        case WM_CREATE:
             
             cxChar = LOWORD(GetDialogBaseUnits());
             cyChar = HIWORD(GetDialogBaseUnits());
             
           //Create Display Window
           hwndText = CreateWindow(TEXT("static"),NULL, WS_CHILD | WS_VISIBLE |
                                   SS_LEFT, cxChar, cyChar, 
                                   GetSystemMetrics(SM_CXSCREEN), cyChar, 
                                   hwnd, (HMENU)ID_TEXT, 
                                   (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 
                                   NULL);
             
           //Create ComboBox
           hwndList =  CreateWindow(TEXT("Combobox"), NULL, WS_CHILD | WS_VISIBLE |
                                   LBS_STANDARD, cxChar, cyChar*3, 
                                   cxChar*16 + GetSystemMetrics(SM_CXVSCROLL), 
                                   cyChar*5, hwnd, (HMENU)ID_LIST, 
                                   (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
                                   NULL);
                                       
             //Populate ComboBox
             FillListBox(hwndList);
             
             //Set a Default Selection
             SendMessage(hwndList, CB_SETCURSEL, 0, 0);
             GetWindowText(hwndList, pVarName, 30);
             SetWindowText(hwndText, pVarName);
             
             return 0;
             
        case WM_COMMAND:
             
             if( LOWORD(wParam)==ID_LIST && HIWORD(wParam)==CBN_SELCHANGE)
             {
                 //Get Selection from Combo Box                 
                 GetWindowText(hwndList, pVarName, 30);      
                 
                 //Show Text in Display Window
                 SetWindowText(hwndText, pVarName);
             }
                 
             return 0;    
           
        case WM_DESTROY:
             
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        
        default: 
                                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

I was hopeing for something simpler. For example a x = y type answer. I tried setting a control varible (called m_cPeople) to my list. For example:

char *names[2];
names[0] = "Joe";
names[1] = "Billy";
names[2] = "Bob";
m_cPeople = names;

However at this point I get a "CComboBox : 'operator =' is unavailble"

*names[2] will only have two elements..


*names[0] and *names[1] ;)

nothing in MS-Windows programming is "simple". If you want "simple" then stay with console programs. The function FillListBox() that was previously posted looks simple to me -- only 3 program lines. The rest of that post is common code that is required by all MS-Windows program using win32 api functions.

After much searching, I found my answer. Turns out I was on the right track. I set a the Combo Box to have a varible in the Control category (of type CComboBox) called it m_cPeople. Assuming to previos code I put in, I filled it like so.

for (int i = 0, i <= 2, i++)
     m_cPeople.AddString( (LPCTSTR)names[i]);

Simple, and effective. Thak you for helping me get on the right track guys. :)

Again, be careful with array sizes.

for (int i = 0, i <= 2, i++)
     m_cPeople.AddString( (LPCTSTR)names[i]);

This loop executes 3 times and tries to write from three strings.

Ack, sorry, was a typo. And sorry for not mentioning it was a MFC application.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.