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

Problema API ListBox

  1. #1
    L'avatar di marco86188
    marco86188 non è in linea Scolaretto
    Post
    75
    Like Inviati  
    0
    Like Ricevuti  
    0
    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:

    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:

    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:

    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:

    // 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
    Like Inviati  
    0
    Like Ricevuti  
    0
    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
    ℹ️ Leggi di più su bottomap ...

  3. #3
    L'avatar di marco86188
    marco86188 non è in linea Scolaretto
    Post
    75
    Like Inviati  
    0
    Like Ricevuti  
    0
    Grazie mille bottomap...

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

    ciao ciao e grazie ancora...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Problema Filtro ListBox
    Da Eusty nel forum Microsoft Excel
    Risposte: 10
    Ultimo Post: 06-11-2014, 19:20
  2. Problema ListBox
    Da tnnmaster nel forum Visual Basic .Net
    Risposte: 1
    Ultimo Post: 26-02-2014, 11:45
  3. Problema LoadPicture in listbox
    Da Cis nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 31-08-2009, 09:16
  4. Problema LISTBOX
    Da Cis nel forum Visual Basic 6
    Risposte: 4
    Ultimo Post: 27-10-2008, 23:01
  5. Problema ListBox
    Da Cis nel forum Visual Basic 6
    Risposte: 43
    Ultimo Post: 04-03-2007, 21:26