+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 3 su 3

Discussione: Problema API ListBox

  1. #1
    L'avatar di marco86188
    marco86188 non è in linea Scolaretto
    Luogo
    Sardegna
    Post
    75

    Question Problema API ListBox

    Buongiorno a tutti....

    Sto facendo una DLL in Linguaggio C per mezzo delle API da associare ad una mia applicazione...

    Sto Creando una listbox ma non riesco a gestire bene i messaggi...

    La DLL e composta da tre funzioni:

    la prima crea il form con all'interno una listbox:

    codice:
    int crealistbox()
    { 
     
      WNDCLASS Wc;
      // *****************************
      strcpy(BCX_ClassName,"ListBox1");
      // ***************************************
      // Programmer has selected to use pixels
      // ***************************************
      BCX_ScaleX       = 1;          // for generic scaling
      BCX_ScaleY       = 1;
      BCX_hInstance    = hInst;
      // ******************************************************
      Wc.style         =  CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
      Wc.lpfnWndProc   =  WndProc;
      Wc.cbClsExtra    =  0;
      Wc.cbWndExtra    =  0;
      Wc.hInstance     =  hInst;
      Wc.hIcon         =  LoadIcon(NULL,IDI_WINLOGO);
      Wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
      Wc.hbrBackground =  (HBRUSH)(COLOR_BTNFACE+1);
      Wc.lpszMenuName  =  NULL;
      Wc.lpszClassName =  BCX_ClassName;
      RegisterClass(&Wc);
    
      Style = 0;
      Exstyle = 0;
     
      // assign a default style
      if (!Style)
      {
        Style= WS_MINIMIZEBOX  |
        WS_SIZEBOX      |
        WS_CAPTION      |
        WS_POPUP        |
        WS_SYSMENU;
      }
      Form1 = CreateWindowEx(Exstyle,
        BCX_ClassName,
        "Prova ListBox",
        Style,
        50*BCX_ScaleX,
        50*BCX_ScaleY,
        (4+260)*BCX_ScaleX,
        (12+200)*BCX_ScaleY,
        g_hwnd,
        (HMENU)NULL,
        BCX_hInstance,
        NULL);
      SendMessage(Form1,(UINT)WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),(LPARAM)MAKELPARAM(FALSE,0));
    
      Style=0;
      Exstyle = -1;
      // assign a default style if needed
      if (!Style)
      {
        Style=WS_CHILD | WS_VISIBLE | LBS_SORT | WS_VSCROLL | WS_TABSTOP;
      }
      if (Exstyle == -1)
      {
        Exstyle=WS_EX_CLIENTEDGE;
      }
      List1 = CreateWindowEx(Exstyle,
        "Listbox",
        NULL,
        Style,
        10*BCX_ScaleX,
        15*BCX_ScaleY,
        100*BCX_ScaleX,
        100*BCX_ScaleY,
        Form1,
        (HMENU)1009,
        BCX_hInstance,
        NULL);
      SendMessage(List1,(UINT)WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),(LPARAM)MAKELPARAM(FALSE,0));
      
      Center(Form1,0,0);
      Show(Form1);
     
        return 1;
    }
    La seconda richiamata all'interno di un ciclo for dal mio programma aggiunge gli elementi all'interno della listbox:

    codice:
    int aggiungilistbox(char *elemento)
    { 
    
        SendMessage(List1,(UINT)LB_ADDSTRING,(WPARAM)0,(LPARAM)elemento);
    
        //UpdateWindow(Form1);
    
        return 1;
    }
    la terza quella che mi da problemi dovrebbe aspettare l'evento del click su un elemento della listbox e restituire il contenuto dell'elemento cliccato:

    codice:
    int ottienilistbox (char *passaggio)
    {  
    
    
    while(GetMessage(&Msg,NULL,0,0))
       {
        HWND hActiveWindow = GetActiveWindow();
        if (!IsWindow(hActiveWindow) ||      !IsDialogMessage(hActiveWindow,&Msg))
          {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
          }
        }
    
    
      strcpy(passaggio,text);
    
      return 1;
    }
    questa e la funzione che gestisce i messaggi:

    codice:
    // standard windows message handling
    LRESULT CALLBACK WndProc (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    {
      while(1)
      {
        if (Msg==WM_COMMAND)
        {
          //  list box item clicked (selected) 
          if (LOWORD(wParam)==1009)
          {
     if(HIWORD(wParam)==LBN_SELCHANGE)                                                        //se cambia la riga selezionata nella listbox dovrebbe suonare il beep
            {
              strcpy(text,(char*)getLB(List1));
              //  just for test 
              Beep(400,500);
            }
          }
        }
        break;
      }
      // exit from the window form
      if (Msg==WM_DESTROY)
      {
        UnregisterClass(BCX_ClassName,BCX_hInstance);
        PostQuitMessage(0);
      }
      return DefWindowProc(hWnd,Msg,wParam,lParam);
    }
    quando io clicco negli elementi della listbox dovrebbe suonare il beep ed eseguire la copia del contenuto dell elemento nella variabile text, invece quando clicco sulla listbox non entra nella rispettiva if....non capisco dove ho sbagliato...

    Spero che mi possiate aiutare...
    Grazie a tutti...

  2. #2
    L'avatar di bottomap
    bottomap non è in linea Moderatore Globale
    Post
    4,130
    Ciao,

    Non mi torna molto la while(1) all'interno della WndProc... a cosa dovrebbe servire esattamente?
    Inoltre sei certo che l'id del controllo sia sempre 1009? Il cast (HMENU)1009 mi sembra un po'strano. Nel caso di voci di menù alla WM_COMMAND arriverà 1 come hiword(wparam).

    Ad ogni modo, per essere certo di quello che arriva (un WM_COMMAND dovrebbe arrivare), fatti stampare (a schermo, su un file) il contenuto preciso di wParam ed lParam. In modo da vedere cosa esattamente ti sta arrivando.

    Per far si, inoltre, che la listbox notifichi le operazioni alla sua finestra genitore, dovrà avere lo stile LBS_NOTIFY, che non mi pare tu abbia specificato in fase di creazione del controllo. La WndProc immagino sia quella della finestra contenitore... senza lo stile in questione, la listbox non comunicherà le sue variazioni di stato alla finestra che la contiene.

    Ciaociao


    Venite a farmi un saluto su http://www.bottomap.com/

    - Come porre domande in modo intelligente
    - Hai mai dato un'occhiata al
    Regolamento del Forum? Se la risposta è no, sarebbe proprio l'ora di farlo...
    - Il Crossposting è vietato dalla Netiquette.

    "Solo Puffin ti darà forza e grinta a volontà" - Charlie O'Brian
    "I gatti sono animali verso cui ho il massimo rispetto. I gatti e i non conformisti mi sembrano davvero i soli esseri in questo mondo che abbiano una coscienza pratica e attiva" - Jerome K. Jerome
    "Dun Dun DUNNN!" - Capitan Caos
    (per chiunque se lo fosse mai chiesto, il nick Bottomap è volutamente sgrammaticato)

  3. #3
    L'avatar di marco86188
    marco86188 non è in linea Scolaretto
    Luogo
    Sardegna
    Post
    75

    Smile Problema API ListBox

    Grazie mille bottomap...

    E' come dici tu, infatti ho aggiunto allo style LBS_NOTIFY e funziona perfettamente....!!

    ciao ciao e grazie ancora...

+ Rispondi al Thread

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi