Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C++ Win32] Popolare una combo box

    Salve,

    vorrei popolare una COMBOBOX per un'applicazione Win32. L'oggetto è definito per adesso in un file risorse (ma potrei includerlo nel progetto tramite la CreateWindowEx)

    codice:
    COMBOBOX IDC_COMBO1, 26, 56, 206, 30, CBS_DROPDOWNLIST | CBS_HASSTRINGS
    Vorrei popolarlo ad esempio con il contenuto di:

    codice:
    const char items[] = {"Gen","Feb","Mar","Apr"}
    Inoltre, come faccio a capire quale elemento viene selezionato nella combobox?

    grazie
    Alla batteria dai retta ballA

  2. #2
    ho trovato, ma molto macchinoso!

    Codice PHP:
    //---------------------------------------------------------------------------
    LRESULT CALLBACK DlgProc(HWND hWndDlgUINT MsgWPARAM wParamLPARAM lParam)
    {
        const 
    char *ComboBoxItems[] = { "Sri Lanka""El Salvador""Botswana",
                                        
    "France""Cuba" };
            switch(
    Msg)
            {
            case 
    WM_INITDIALOG:
                
    hWndComboBox CreateWindow("COMBOBOX",
                                            
    NULL,
                                            
    WS_CHILD WS_VISIBLE,
                                            
    606213660,
                                            
    hWndDlg,
                                            
    NULL,
                                            
    hInst,
                                            
    NULL);

                if( !
    hWndComboBox )
                {
                    
    MessageBox(hWndDlg,
                               
    "Could not create the combo box",
                               
    "Failed Control Creation",
                               
    MB_OK);
                    return 
    FALSE;
                }

                
    SendMessage(hWndComboBox,
                            
    CB_ADDSTRING,
                            
    0,
                            
    reinterpret_cast<LPARAM>((LPCTSTR)ComboBoxItems[0]));
                
    SendMessage(hWndComboBox,
                            
    CB_ADDSTRING,
                            
    0,
                            
    reinterpret_cast<LPARAM>((LPCTSTR)ComboBoxItems[1]));
                
    SendMessage(hWndComboBox,
                            
    CB_ADDSTRING,
                            
    0,
                            
    reinterpret_cast<LPARAM>((LPCTSTR)ComboBoxItems[2]));
                
    SendMessage(hWndComboBox,
                            
    CB_ADDSTRING,
                            
    0,
                            
    reinterpret_cast<LPARAM>((LPCTSTR)ComboBoxItems[3]));
                
    SendMessage(hWndComboBox,
                            
    CB_ADDSTRING,
                            
    0,
                            
    reinterpret_cast<LPARAM>((LPCTSTR)ComboBoxItems[4]));


                return 
    TRUE;

            case 
    WM_COMMAND:
                    switch(
    wParam)
                    {
                    case 
    IDCANCEL:
                            
    EndDialog(hWndDlg0);
                            return 
    TRUE;
                    }
                    break;
            }

            return 
    FALSE;
    }
    //--------------------------------------------------------------------------- 
    Alla batteria dai retta ballA

  3. #3
    Il for, questo sconosciuto.

    Tra parentesi, se scrivi applicazioni grafiche direttamente con le API Win32 ti consiglio di iniziare ad usare fin da subito le macro di windowsx.h, ne giova molto la pulizia del codice.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da MItaly
    Il for, questo sconosciuto.
    ComboBoxItems[0]
    ComboBoxItems[1]
    ComboBoxItems[2]
    ComboBoxItems[3]
    ComboBoxItems[4]


    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    ok, ma le macro sarebbero qualcosa che definisco io in una #define? se si come posso traformare questa in una macro?

    codice:
    hvComboBox1 = CreateWindow(TEXT("COMBOBOX"),
    NULL,
    WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST | CBS_HASSTRINGS,
    60, 62, 250, 60,hWnd,NULL,hInst, NULL);
    o magari mi conviene fare una semplice funzione C++?
    Alla batteria dai retta ballA

  6. #6
    ad esempio questa è una parte del codice inclusa nella window callback:

    codice:
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	int wmId, wmEvent;
    	PAINTSTRUCT ps;
    	HDC hdc;
    	HWND hvComboBox;
    	HFONT hfont0;
    
    	switch (message)
    	{
    	case WM_CREATE:
    
    		hfont0 = CreateFont(-11, 0, 0, 0, 0, FALSE, FALSE, FALSE, 1, 0, 0, 0, 0, TEXT("Ms Shell Dlg 2"));
    
    		hvComboBox = CreateWindow(TEXT("COMBOBOX"),NULL,WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL,60, 62, 250, 80,hWnd,NULL,hInst,NULL);
    
    		SendMessage( hvComboBox, WM_SETFONT, (WPARAM)hfont0, FALSE );
    		SendMessage( hvComboBox,CB_ADDSTRING,0,(LPARAM)TEXT("Hello World!") );
    		SendMessage( hvComboBox,CB_ADDSTRING,0,(LPARAM)TEXT("gooooollllll") );
    		SendMessage( hvComboBox,CB_ADDSTRING,0,(LPARAM)TEXT("oooooooooo!") );
    		SendMessage( hvComboBox,CB_ADDSTRING,0,(LPARAM)TEXT("dajeeeeeeee!") );
    
    
    		break;
    	case WM_COMMAND:
    		wmId    = LOWORD(wParam);
    		wmEvent = HIWORD(wParam);
    		// Parse the menu selections:
    		switch (wmId)
    		{
    		case IDM_ABOUT:
    			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    			break;
    		case IDM_EXIT:
    			DestroyWindow(hWnd);
    			break;
    		default:
    			return DefWindowProc(hWnd, message, wParam, lParam);
    		}
    		break;
    	case WM_PAINT:
    		hdc = BeginPaint(hWnd, &ps);
    		// TODO: Add any drawing code here...
    		EndPaint(hWnd, &ps);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProc(hWnd, message, wParam, lParam);
    	}
    	return 0;
    }
    dove creo una combobox setto il font e la riempo...come si potrebbe semplificare il tutto, calcolando che cmq dovrò tenere tutti gli handle globali per mandare dei messagii
    Alla batteria dai retta ballA

  7. #7
    beh, diciamo che questa pagina ha svelato molto: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
    Alla batteria dai retta ballA

  8. #8
    Allora usando le macro di windows e il message cracker, la struttura del programma diventa ovviamente più semplice (e leggibile)

    codice:
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	__try
    	{
    		switch (message)
    		{
    			HANDLE_MSG (hWnd, WM_CREATE, Cls_OnCreate);
    			HANDLE_MSG (hWnd, WM_COMMAND, Cls_OnCommand);
    			HANDLE_MSG (hWnd, WM_DESTROY, Cls_OnDestroy);
    		}
    	}
    
    	__except(EXCEPTION_EXECUTE_HANDLER) { }
    
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
    void Cls_OnDestroy(HWND hwnd)
    {
    	PostQuitMessage(0);
    }
    
    void Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
    {
    	int k = 0;
    	switch (id)
    	{
    		case IDM_GETS:
    			// k = (int)SendMessage(hwndCtl, CB_GETCURSEL, NULL,NULL);
    			// MACRO
    			k = ComboBox_GetCurSel(hwndCtl);
    			break;
    
    		case IDM_ABOUT:
    			break;
    
    		case IDM_EXIT:
    			DestroyWindow(hwnd);
    			break;
    	}
    }
    
    BOOL Cls_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
    {		
    	HFONT hfont0 = CreateFont(-11, 0, 0, 0, 0, FALSE, FALSE, FALSE, 1, 0, 0, 0, 0, TEXT("Ms Shell Dlg 2"));
    	HWND hvComboBox = CreateWindow(TEXT("COMBOBOX"),NULL,WS_TABSTOP | WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | CBS_SORT,60, 62, 250, 100,hwnd,NULL,hInst,NULL);
    
    	// SendMessage( hvComboBox, WM_SETFONT, (WPARAM)hfont0, FALSE );
    	// MACRO
    	SetWindowFont( hvComboBox, hfont0, TRUE );
    
    	// SendMessage( hvComboBox,CB_ADDSTRING,0,(LPARAM)TEXT("dajeeeeeeee!") );
    	// MACRO
    	ComboBox_AddString(hvComboBox, TEXT("using macros...1"));
    	ComboBox_AddString(hvComboBox, TEXT("using macros...2"));
    	ComboBox_AddString(hvComboBox, TEXT("using macros...3"));
    	ComboBox_AddString(hvComboBox, TEXT("using macros...4"));
    	ComboBox_AddString(hvComboBox, TEXT("using macros...5"));
    
    	// SendMessage( hvComboBox, CB_SETCURSEL, 3, 0 ); // Show third element in combo box
    	// MACRO
    	ComboBox_SetCurSel(hvComboBox, 3);
    
    	return true;
    }
    Avevo due domande data questa nuova struttura:

    1) Posso continuare sempre più a ritroso l'uso di HANDLE_MSG() ad esempio in Cls_OnCommand ho alcuni id che mi ritornano dopo aver cliccato sul menu. (anche se cmq il prototipo di Cls_OnCommand() veniva "consigliato" in windowsx.h, ora invece dovrei inventarmene uno io)

    2) Quando creo dei COMBOBOX devo cmq tenere i loro handle globali per poter puntare aloro...vero?

    grazie
    Alla batteria dai retta ballA

  9. #9
    1) Non ho capito.
    2) Di solito quando si crea un controllo con CreateWindow si passa un ID di controllo (univoco nell'ambito della finestra) al parametro HMENU, che, per i controlli, non serve per specificare il menu della finestra ma appunto il control ID (che solitamente si definiscono tutti insieme come macro in un file .h). Quindi, quando serve un handle al controllo, basta chiamare GetDlgItem passandogli l'handle della finestra padre e l'ID del controllo. Questo lavoro è reso ancora più semplice se, invece di creare manualmente i controlli, usi le risorse dialog.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    ah, ok. Infatti prima facevo:

    codice:
    #include <windowsx.h>
    HWND hvComboBox = NULL;
    (...)
    
    void Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
    {
    	int k = 0;
    	switch (id)
    	{
    		case IDM_GETS:
    			k = (int)ComboBox_GetCurSel(hvComboBox);
    	(...)
    }
    
    BOOL Cls_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
    {		
    
    	hvComboBox = CreateWindow(TEXT("COMBOBOX"),NULL,WS_CHILD,
    60, 62,250,100,hwnd,NULL,hInst,NULL);
    
    	ComboBox_AddString(hvComboBox, TEXT("using macros...1"));
    	return true;
    }
    tu invece dici di definire una costante e passarla tramite HMENU alla CrateWindowEx() e poi andare a ripescare l'handle del combobox con GetDlgItem()...ok

    Naturalmente se potessi usare le risorse dialog lo farei, ma ho letto che è buona prassi creare la finestra principale (overlapped window) con la CreateWindowEx(), quindi non credo che poi posso caricare combobox che stanno in un file di risorse...ma posso solo aggiungerle manualmente
    Alla batteria dai retta ballA

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.