Listbox problem



  • Hallo!

    Ich habe in einer dialogresource eine Listbox, habe auch das häkchen bei Benachrichtigung gesetzt.
    Aber ich empfange keine Nachrichten, wenn ich die Auswahl bei der Box ändere:

    INT CALLBACK TileDataProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    {
    	char c[64];
    	int i = 0;
    
    	switch(Msg)
    	{
    	case WM_INITDIALOG:
    		if(!MapInit)
    		{
    			MSG_ERROR("Es ist keine Karte geladen!");
    			EndDialog(hWnd, 1);
    			return 0;
    		}
    
    		// Alle Tiles auflisten
    		for(i = 0; i < g_Map->GetNumTiles(0); i++)
    		{
    			sprintf(c, "Tile %d", i);
    			SendDlgItemMessage(hWnd, IDC_TILELIST, LB_ADDSTRING, 0, (long)c);
    		}
    
    		break;
    
    	case WM_COMMAND:
    		switch(LOWORD(wParam))
    		{
    		case IDC_OK:
    			EndDialog(hWnd, 0);
    			break;
    
    		case IDC_CANCEL:
    			EndDialog(hWnd, 1);
    			break;
    
    		case LBN_SELCANCEL:
    		case LBN_DBLCLK:
    		case LBN_SELCHANGE:
    			MSG_INFO("selchange!");  // Weder hier kommt ne MessageBox
    			break;	
    		default:
    
    			return DefWindowProc(hWnd, Msg, wParam, lParam);
    		}
    		break;
    
    	case LBN_SELCANCEL:
    	case LBN_DBLCLK:
    	case LBN_SELCHANGE:
    		MSG_INFO("selchange!");  // noch hier...
    		break;	
    
    	default:
    		return DefWindowProc(hWnd, Msg, wParam, lParam);
    	}
    	return 0;
    }
    


  • Die Message kommt als WM_COMMAND, allerding ist im LOWORD(wParam) der ListBox-Identifier!

    ALso mut Du case IDC_LIST1 (oder wie auch immer Deine Listbox heißt) innerhalb WM_COMMAND abfangen!

    Dann kannst Du per switch(HIWORD(wParam)) die Message abfangen (z. B. LBN_SELCANCEL)...

    Siehe auch MSDN: LBN_SELCANCEL.

    In Deinem Beispiel wäre das also so:

    INT CALLBACK TileDataProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
    { 
        char c[64]; 
        int i = 0; 
    
        switch(Msg) 
        { 
        case WM_INITDIALOG: 
            if(!MapInit) 
            { 
                MSG_ERROR("Es ist keine Karte geladen!"); 
                EndDialog(hWnd, 1); 
                return 0; 
            } 
    
            // Alle Tiles auflisten 
            for(i = 0; i < g_Map->GetNumTiles(0); i++) 
            { 
                sprintf(c, "Tile %d", i); 
                SendDlgItemMessage(hWnd, IDC_TILELIST, LB_ADDSTRING, 0, (long)c); 
            } 
    
            break; 
    
        case WM_COMMAND: 
            switch(LOWORD(wParam)) 
            { 
            case IDC_OK: 
                EndDialog(hWnd, 0); 
                break; 
    
            case IDC_CANCEL: 
                EndDialog(hWnd, 1); 
                break; 
    
            case IDC_LIST1:
                switch(HIWORD(wParam)
                {
                case LBN_SELCANCEL: 
                    MSG_INFO("LBN_SELCANCEL!");
                    break;
    
                case LBN_DBLCLK: 
                    MSG_INFO("LBN_DBLCLK!");
                    break;
    
                case LBN_SELCHANGE: 
                    MSG_INFO("LBN_SELCHANGE!");
                    break;    
                }
                break;
    
            default: 
                return DefWindowProc(hWnd, Msg, wParam, lParam); 
            } 
            break; 
    
        default: 
            return DefWindowProc(hWnd, Msg, wParam, lParam); 
        } 
        return 0; 
    }
    

    Anstatt INT CALLBACK TileDataProc solltest Du lieber beim Standard BOOL CALLBACK TileDataProc bleiben und statt "return 0;" lieber "return TRUE;" zurückgeben, wenn Du die Message bearbeitet hast, ansonsten "return FALSE;"!

    Es kann sonst zu seltsamen Verhalten deines Dialoges führen, da Windows (bzw. der DialogManager) TRUE erwartet, wenn die Nachricht bearbeitet wurde...



  • Schon 4 Jahre ist dass hier her,
    und auch heut fällt ein anfang schwer.

    Hey @ll.

    Ich habe einen Interessanten Fehler.

    Ich habe quasi den von Hepi geposteten Code

    WM_COMMAND->(LOWORD)LISTBOX->(HIGHWORD)LBN_SELCHANGE
    und es Funktioniert nicht.

    Ich bin sehr verwundert...

    hier mein Code:

    #define false 		FALSE
    #define true 		TRUE
    #define bool		BOOL
    #define limFormat 	5
    
    HWND liFormat;
    
    LRESULT CALLBACK WndProc( HWND targetWnd, UINT wndMsg, WPARAM wParam, LPARAM lParam )
    {
        bool visitMsg = false;
        int liSel;
    	switch( wndMsg )
    	{
            case WM_CREATE:
                liFormat = CreateWindow( "LISTBOX", "Formatliste", LBS_NOTIFY | WS_CHILD | WS_DLGFRAME,
                235, 15, 100, 110, targetWnd, (HMENU)limFormat, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
            break;
    		case WM_COMMAND:
    			switch( LOWORD(wParam) )
    			{
    				case limFormat:
    					switch( HIWORD(wParam) )
    					{
    						case LBN_SELCHANGE:
    							printf( "selection: " );
    							liSel = (int)SendMessage( liFormat, LB_GETCURSEL, 0, 0 );
    							printf( "%d\n", liSel );
    							setFormat( liSel );//nebensache( setzt Format von RichEdit)
    						break;
    					}
    					hideAll();  //versteckt dieses Fenster
    				break;
    			}
    		break;
    	}
    	if( !visitMsg )
    		return DefWindowProc( targetWnd, wndMsg, wParam, lParam );
    
    	return 0;
    }
    

    EDIT: einen default unter SELCHANGE würde ich übrigens bekommen.



  • Kann mir da keiner wwas zu sagen?



  • [war Quatsch]



  • Problem hat sich selbst gelöst...

    Fehler unbekannt.

    Habe lediglich die hideAll() funktion in Zeile 29 verschoben....

    Vielleicht liegt es daran das Zeit zum bearbeiten gebraucht wwurde oder so...

    Danke trotzdem... 😉


Anmelden zum Antworten