Thread: Drop-down box

  1. #1
    Reverse Engineer maxorator's Avatar
    Join Date
    Aug 2005
    Location
    Estonia
    Posts
    2,318

    Drop-down box

    How can I make a drop-down box like in browsers? I know, how to make listboxes...

  2. #2
    Reverse Engineer maxorator's Avatar
    Join Date
    Aug 2005
    Location
    Estonia
    Posts
    2,318
    Damn, I always ask 1 minute before I find the answer by myself. I didn't know they are called "combo boxes"...
    But still, it works only when I use it with some listbox styles:
    Code:
    f1=CreateWindowEx(0,"Combobox","The first one",WS_BORDER|WS_VISIBLE|WS_CHILD|LBS_STANDARD|LBS_USETABSTOPS,10,10,100,200,hwnd,(HMENU)25554,GetModuleHandle(NULL),NULL);
    Without LBS_STANDARD it won't display correctly...
    Last edited by maxorator; 10-15-2005 at 06:17 AM.

  3. #3
    Reverse Engineer maxorator's Avatar
    Join Date
    Aug 2005
    Location
    Estonia
    Posts
    2,318
    How can I get the data of the currently selected string?
    Code:
    MessageBox(hwnd,(char*)SendMessage(f1,CB_GETITEMDATA,SendMessage(f1,CB_GETCURSEL,0,0),0),TEXT("hello"),MB_OK);
    Doesn't seem to work...
    Tried this too:
    Code:
    char* happy;
    happy=(char*)SendMessage(f1,CB_GETCURSEL,0,0);
    SendMessage(f1,CB_GETLBTEXT,(WPARAM)happy,(LPARAM)happy);
    MessageBox(hwnd,happy,TEXT("hello"),MB_OK);
    But this crashes my program...
    Ok tested a bit and found a working way:
    Code:
    int tap;
    char hello[256];
    tap=(int)SendMessage(f1,CB_GETCURSEL,0,0);
    SendMessage(f1,CB_GETLBTEXT,(WPARAM)tap,(LPARAM)happy);
    MessageBox(hwnd,happy,TEXT("hello"),MB_OK);
    Last edited by maxorator; 10-15-2005 at 06:51 AM.

  4. #4
    Registered User Queatrix's Avatar
    Join Date
    Apr 2005
    Posts
    1,342
    GetWindowText() will work fine with combo boxes.

  5. #5
    VA National Guard The Brain's Avatar
    Join Date
    May 2004
    Location
    Manassas, VA USA
    Posts
    903
    good call on that GetWindowText( ) function.. was just having the same problem.. but now I can easily extract selected text from my combo box

    Code:
    #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;
    }
    Last edited by The Brain; 10-28-2005 at 10:44 PM.
    • "Problem Solving C++, The Object of Programming" -Walter Savitch
    • "Data Structures and Other Objects using C++" -Walter Savitch
    • "Assembly Language for Intel-Based Computers" -Kip Irvine
    • "Programming Windows, 5th edition" -Charles Petzold
    • "Visual C++ MFC Programming by Example" -John E. Swanke
    • "Network Programming Windows" -Jones/Ohlund
    • "Sams Teach Yourself Game Programming in 24 Hours" -Michael Morrison
    • "Mathmatics for 3D Game Programming & Computer Graphics" -Eric Lengyel

  6. #6
    Reverse Engineer maxorator's Avatar
    Join Date
    Aug 2005
    Location
    Estonia
    Posts
    2,318
    Well, I used this method to set a default selection:
    Code:
    SendMessage(hwndCombobox,CB_SETCURSEL,0,0);

  7. #7
    Registered User
    Join Date
    Jan 2005
    Posts
    19
    Hi, as that topic was on the front page and the author siemed to have found the solution I didn't want to creater a new topic, with almost the same point...How can I import text file contents, as and example:

    Cat
    Dog
    Cow

    To combo box?
    This is porbably a rather stupid question, but I'd still be happy, if somebody would take his or her time to answer it...
    Best regards,
    dogbert234.

  8. #8
    Registered User
    Join Date
    Sep 2004
    Posts
    57
    Quote Originally Posted by The Brain
    Code:
     ...
    To "The Brain", thanks for posting that code. It helped me by clearing up some confusion I had.

  9. #9
    Registered User
    Join Date
    Sep 2004
    Posts
    57
    Quote Originally Posted by dogbert234
    How can I import text file contents, as an example:

    Cat
    Dog
    Cow

    To combo box?
    dogbert, good question. If you can read in those words from a file, then you should be able to take "The Brain"'s example code to do it.

    Can you write a program to simply read in those words?

    If you need more help, I will be glad to help.

    (Big hint: read and understand the function "FillListBox()")

  10. #10
    Reverse Engineer maxorator's Avatar
    Join Date
    Aug 2005
    Location
    Estonia
    Posts
    2,318
    Dogbert, I am pretty sure, that you want it to take the whole line from the file so this is the code:
    Code:
    #include <windows.h>
    #include <stdio.h>
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    HWND combo;
    FILE * pFile;
    char run[256];
    char szClassName[ ] = "WindowsApp";
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {
        HWND hwnd;
        MSG messages;
        WNDCLASSEX wincl;
    
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;
        wincl.style = CS_DBLCLKS;
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;
        wincl.cbClsExtra = 0;
        wincl.cbWndExtra = 0;
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
        if (!RegisterClassEx (&wincl))
            return 0;
    
        hwnd = CreateWindowEx (
               0,
               szClassName,
               "Windows App",
               WS_OVERLAPPEDWINDOW,
               CW_USEDEFAULT,
               CW_USEDEFAULT,
               544,
               375,
               HWND_DESKTOP,
               NULL,
               hThisInstance,
               NULL
               );
    
        ShowWindow (hwnd, nFunsterStil);
    
        while (GetMessage (&messages, NULL, 0, 0))
        {
            TranslateMessage(&messages);
            DispatchMessage(&messages);
        }
        return messages.wParam;
    }
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
            case WM_CREATE:
                combo=CreateWindowEx(0,"Combobox","",
                WS_BORDER|WS_VISIBLE|WS_CHILD|LBS_STANDARD|LBS_USETABSTOPS|CBS_AUTOHSCROLL,
                10,10,200,200,hwnd,
                (HMENU)25554,GetModuleHandle(NULL),NULL);
                pFile = fopen ("text.txt" , "r");
                if(pFile==NULL){
                MessageBox(hwnd,"Could not open file","Problem",MB_OK);
                }
                else{
                while(fgets(run,100,pFile)){
                if(run[strlen(run)-1]=='\n'){
                run[strlen(run)-1]='\0';
                }
                SendMessage(combo,CB_ADDSTRING,0,(LPARAM)run);
                }
                SendMessage(combo,CB_SETCURSEL,0,0);
                }
                break;
            case WM_DESTROY:
                PostQuitMessage (0);
                break;
            default:
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    Last edited by maxorator; 10-31-2005 at 06:30 AM.

  11. #11
    Registered User
    Join Date
    Sep 2004
    Posts
    57
    maxorator,

    Excellent.

    I had a problem with "LBS_USE TABSTOPS", which should be "LBS_USETABSTOPS".

  12. #12
    Reverse Engineer maxorator's Avatar
    Join Date
    Aug 2005
    Location
    Estonia
    Posts
    2,318
    Theres a wierd thing about these spaces. When I copy it to this textbox it is ok, but when I post the code, some spaces appear...
    I've seen it in many posts in this forum.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Replies: 9
    Last Post: 02-13-2008, 02:59 PM
  2. Drop down list (combo box) limits
    By biosninja in forum Tech Board
    Replies: 10
    Last Post: 05-20-2005, 06:13 AM
  3. How to program a "back" button with MFC
    By 99atlantic in forum Windows Programming
    Replies: 3
    Last Post: 04-26-2005, 08:34 PM
  4. New Theme
    By XSquared in forum A Brief History of Cprogramming.com
    Replies: 160
    Last Post: 04-01-2004, 08:00 PM
  5. Tab Controls - API
    By -KEN- in forum Windows Programming
    Replies: 7
    Last Post: 06-02-2002, 09:44 AM