Resultados 1 al 10 de 10

Duda Combobox y C++

  1. #1 Duda Combobox y C++ 
    Medio
    Fecha de ingreso
    Jan 2003
    Mensajes
    56
    Descargas
    0
    Uploads
    0
    Hola a todos y Feliz año antes de nada,

    Tengo un pequeño problema, y es que estoy haciendo un programa en C++ (en concreto uso Dev-Cpp) y es que quiero añadir una Combobox a un Dialog. El problema es que no soy capaz de que la Combobox me muestre datos. He probado con el mensaje de evento CB_ADDSTRING y SETITEMDATA pero sique sin mostrarme ningun dato y la verdad es que no se por donde seguir.
    Alguien me puede ayudar?

    Gracias a todos de antemano.
    Zenix
    Citar  
     

  2. #2  
    Avanzado
    Fecha de ingreso
    Nov 2002
    Ubicación
    Ciudad de México
    Mensajes
    296
    Descargas
    0
    Uploads
    0
    Bueno, en efecto con el mensaje CB_ADDSTRING agregas una cadena al control. El mensaje CB_SETITEMDATA no sirve para eso, sino para asignarle algun "dato" a un elemento que ya este dentro del combobox.

    ¿Podrías pegar como es que estas mandando llamar a ese mensaje?.

    También intenta con el mensaje CB_INSERTSTRING.
    Scar_T
    Citar  
     

  3. #3  
    Medio
    Fecha de ingreso
    Jan 2003
    Mensajes
    56
    Descargas
    0
    Uploads
    0
    Tambien lo he probado con CB_INSERTSTRING y tampoco me va. El caso es que lo he probado con una ListBox y funciona de maravilla, pero con la combo no hay manera. Aqui te pego el codigo fuente de mi programa.

    //---------------------------------
    HBRUSH g_hbrBackground = NULL;
    WNDCLASSEX AppClass;
    int index;
    char* buf;

    BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
    {
    switch(Message)
    {
    case WM_INITDIALOG:
    g_hbrBackground = CreateSolidBrush(RGB(140, 140, 140));
    SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(AppClass.hInstance, MAKEINTRESOURCE(IDI_MYICON)));
    SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(AppClass.hInstance, MAKEINTRESOURCE(IDI_MYICON)));
    index = SendDlgItemMessage(hwnd, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) "Zenix\0");
    SendDlgItemMessage(hwnd, IDC_COMBO1, CB_SETITEMDATA, (WPARAM) index, (LPARAM) (DWORD) 1);
    break;
    //-----------------------------------
    case WM_CTLCOLORDLG:
    return (LONG)g_hbrBackground;

    case WM_CTLCOLORSTATIC:
    {
    HDC hdcStatic = (HDC)wParam;
    SetTextColor(hdcStatic, RGB(0, 0, 0));
    SetBkMode(hdcStatic, TRANSPARENT);
    return (LONG)g_hbrBackground;
    }
    break;

    case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case IDC_BUTTON1:
    //MessageBox(hwnd,"Hola","Mensaje",MB_OK);
    EndDialog(hwnd, 0);
    break;

    case IDC_BUTTON2:
    SendDlgItemMessage(hwnd, IDC_LIST, LB_RESETCONTENT , 0, 0);
    break;

    case IDC_BUTTON3:
    SendDlgItemMessage(hwnd, IDC_COMBO1, CB_SETDROPPEDWIDTH, 100, 0);
    int len = GetWindowTextLength(GetDlgItem(hwnd, IDC_EDIT2));
    buf = (char*)GlobalAlloc(GPTR, len + 1);
    GetDlgItemText(hwnd, IDC_EDIT2, buf, len + 1);
    GetDlgItemText(hwnd,IDC_EDIT2, buf, 40);
    index = SendDlgItemMessage(hwnd, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM) buf);
    SendDlgItemMessage(hwnd, IDC_LIST, LB_ADDSTRING, 0, (LPARAM) buf);
    SendDlgItemMessage(hwnd, IDC_COMBO1, CB_SETITEMDATA, (WPARAM) index, (LPARAM) (DWORD) 1);
    SetDlgItemInt(hwnd,IDC_EDIT1,index,false);
    GlobalFree(buf);
    break;
    }
    break;
    //-----------------------------------
    case WM_CLOSE:
    EndDialog(hwnd, 0);
    break;
    //-----------------------------------
    case WM_DESTROY:
    DeleteObject(g_hbrBackground);
    break;
    //-----------------------------------
    default:
    return FALSE;
    }
    return TRUE;
    }

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    {
    AppClass.hInstance = hInstance;
    return DialogBox(hInstance, MAKEINTRESOURCE(IDD_FORM), NULL, DlgProc);
    }
    Zenix
    Citar  
     

  4. #4  
    Avanzado
    Fecha de ingreso
    Nov 2002
    Ubicación
    Ciudad de México
    Mensajes
    296
    Descargas
    0
    Uploads
    0
    Pues no veo error en tu código. En la primer cadena que agregas, la de Zenix, en el mensaje WM_INITDIALOG, ¿Ni siquiera esa la agrega?

    En las demás cadenas agregas, las que agregas con el boton IDC_BUTTON3, pues ahí no la estas agregando a una lista, , supongo que por lo que había dicho, que probaste con una lista.

    Yo me hice un pequeño programita, igual al tuyo, inclusive copie y pegue el uso de la función SendDlgItemMessage que haces y me funciono a la perfección.
    Scar_T
    Citar  
     

  5. #5  
    Medio
    Fecha de ingreso
    Jan 2003
    Mensajes
    56
    Descargas
    0
    Uploads
    0
    Hola Scar_T,

    a mi no me funciona ni siquiera usando el mensaje WM_INITDIALOG.
    Lo unico que me queda por pensar es que me digas con que programa lo has compilado el programa y que SO tienes instalado (incluido el Services Pack), solo me queda pensar que el problema o bien dependa de que tengo una version antigua del compilador, cosa que no creo puesto que me he instalado la ultima version del Dev-Cpp (V4.9); o que dependa del Windows por si mismo.

    Muchas Gracias por tu ayuda
    Zenix
    Citar  
     

  6. #6  
    Avanzado
    Fecha de ingreso
    Nov 2002
    Ubicación
    Ciudad de México
    Mensajes
    296
    Descargas
    0
    Uploads
    0
    Pues había usado el Visual Studio .Net, pero me hice una versión para el Dev-Cpp y me funciona también ahi, aqui te pego mi codigo:

    Código:
    #include <windows.h>
    #include <stdio.h>
    #include "resource.h"
    
    char* buf;
    int p=0;
    
    BOOL CALLBACK DlgProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
    	switch(Msg) {
    		case WM_INITDIALOG:			
    			SendDlgItemMessage(hwnd, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) "Zenix\0");
    			return FALSE;
    		case WM_COMMAND:
    			switch(LOWORD(wParam)) {
    				case IDC_BUTTON1:
    					buf = (char*)GlobalAlloc(GPTR, 256);
    					sprintf(buf, "Item_%02d", p++);
    					SendDlgItemMessage(hwnd, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM) buf);
    					GlobalFree(buf);
    			} break;
    		case WM_CLOSE:
    		case WM_QUIT: EndDialog(hwnd, 0);
    	}
    	return FALSE;
    }
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR strCmd, int nCmd) {
    	return DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
    
    	return 0;
    }
    Mi archivo de recursos:
    Código:
    #include <windows.h>
    #include "resource.h"
    
    IDD_DIALOG1 DIALOG 100, 100, 100, 50
    STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
    CAPTION "Diálogo"
    FONT 8, "Helv"
    BEGIN
     CONTROL "Agregar", IDC_BUTTON1, "button", 
        BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 
        25, 30, 50, 14
     CONTROL "ComboBox2", IDC_COMBO1, "COMBOBOX", 
        CBS_DROPDOWN | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 
        10, 10, 80, 300
    END
    Y el header para los defines :
    Código:
    #define IDD_DIALOG1                     101
    #define IDC_COMBO1                      1001
    #define IDC_BUTTON1						2001
    Ah por cierto, no creo que sea por la version del windows ni que service pack tengas instalado, pero de todos modos te los digo , uso windows xp sp2.
    Scar_T
    Citar  
     

  7. #7  
    Medio
    Fecha de ingreso
    Jan 2003
    Mensajes
    56
    Descargas
    0
    Uploads
    0
    Pues tu ejemplo me funciona perfectamente, he probado con tus cambios en mi programa pero me sigue sin funcionar, bueno esto yo creo que ya es cuestion de seguir probando. Tio, te agradezco un monton que te hayas preocupado por mi problema porque es ya estaba desesperado y no sabia que hacer. De verdad, MUCHAS GRACIAS.
    Zenix
    Citar  
     

  8. #8  
    Avanzado
    Fecha de ingreso
    Nov 2002
    Ubicación
    Ciudad de México
    Mensajes
    296
    Descargas
    0
    Uploads
    0
    De nada . Ojala puedas solucionar tu problema, pero si quieres enviame todo tus archivos (el de proyecto, fuentes y de recursos) a mi mail (scarto_at_gmail_dot_com) y lo revisamos juntos a ver que tiene .
    Scar_T
    Citar  
     

  9. #9  
    Medio
    Fecha de ingreso
    Jan 2003
    Mensajes
    56
    Descargas
    0
    Uploads
    0
    Ostia tio, pero que torpe que soy, ya encontre el fallo!!! El fallo estaba en que el el archivo de recursos .rc donde tenia definida mi combo tenia el alto de la combo demasiado pequeño y por eso no lo veia. Al comparar con tu ejemplo, que por cierto me funcionaba a mi tambien de maravilla, vi que tu tenias la combo definida con un alto de celda mayor y por eso la veia bien.

    Yo tenia esto puesto:
    COMBOBOX IDC_COMBO,20,10,129,14,CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_TABSTOP | CBS_SORT

    Y entonces lo cambie por esto:
    COMBOBOX IDC_COMBO,20,10,129,300,CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_TABSTOP | CBS_SORT

    Y problema solucionado. Joder, y pensar que con esto he perdido un dia y medio. Bueno al menos estoy seguro que ya no se me olvidara mas )

    Muchas Gracias por tu ayuda tio.
    Zenix
    Citar  
     

  10. #10  
    Avanzado
    Fecha de ingreso
    Nov 2002
    Ubicación
    Ciudad de México
    Mensajes
    296
    Descargas
    0
    Uploads
    0
    Jejeje, si, esos errores son los peores , bueno al menos ya lo solucionaste.
    Scar_T
    Citar  
     

Temas similares

  1. Cambiar valor de combobox hecho en VB6
    Por HJR en el foro GENERAL
    Respuestas: 2
    Último mensaje: 02-02-2010, 18:17
  2. Una duda
    Por Max_000 en el foro GENERAL
    Respuestas: 2
    Último mensaje: 17-03-2008, 14:33
  3. duda
    Por brucec en el foro DIGITAL+
    Respuestas: 0
    Último mensaje: 28-01-2007, 22:55
  4. Duda-.-
    Por Jesus en el foro OFF-TOPIC
    Respuestas: 0
    Último mensaje: 13-10-2003, 22:45
  5. duda red
    Por smad en el foro HARDWARE
    Respuestas: 9
    Último mensaje: 23-09-2003, 18:02

Marcadores

Marcadores