Beschreibbare listbox



  • Guten,

    ich möchte eine beschreibbare ListBox erstellen. Bzw. eine ListBox in die man zumindest etwas rein kopieren kann. Da ich keine solche Eigenschaft @msdn gefunden habe werde ich mir wohl selber etwas basteln müssen. Meine Idee war also ctrl+v abzufangen dann den Zwischenspeicher auszulesen und (falls der Zwischenspeicher einen String darstellt) das ganze in die ListBox einzufügen.

    Gibt es eine einfachere/bessere Lösung für mein Problem als das oben genannte?

    Falls nicht, wie kann ich dass dann am besten realisieren. (ctrl+v abfangen, auf den Zwischenspeicher zugreifen).

    Links und/oder googlebare Stichwörter würden eventuell schon reichen 😉

    Besten Dank im voraus.



  • Bei Programmen die nur die windows-elemente verwenden würde ich nicht zu winapi greifen. Alternativen gibt es z.B. QT/wxWidget oder C#. Bei allen wird dies wohl leichter möglich sein, aber einfache winapi-Lösungen sind zu dem Thema meiner Meinung nach ungeeigneter. Was du sonst noch machen kannst ist deine eigenen Listbox programmieren 😋 . Die Lösungen sind alle nicht einfach.

    Eine Idee für deine Lösung wäre ein zusätzliches editfeld. Aber darauf bist du sicher schon gekommen.

    Vielleicht hilft dir auch das: http://www.codeproject.com/KB/combobox/CEditableListBox.aspx
    Ich weiß nur nicht ob das MFC oder CLI ist.



  • Naja, wenn ich denn wüsste wie man auf den Zwischenspeicher zugreift wäre ich schon weiter.. aber irgendwie bin ich da gerade echt zu doof um auf die richtige MSDN Seite zu kommen oO

    Edit: Ah, Clipboard, war doch klar dass es so einfach ist 😉

    Naja wage mich denn wohl mal so daran, man will ja noch was lernen 😃



  • Wie der Name listbox sagt, dient dieses Control allein der Auflistung vorhandener Dinge bei dessen Aufruf. Der Benutzer kann daran nichts mehr ändern, nur lesen. Zum Eintragen in die listbox brauchst du dessen HWND-Handle hwndListbox und fügst die Zeilen mit SendMessage(hwndListbox,LBS_ADDSTRING,...) einzeln ein. Direkt reinkopieren von wo auch immer kannst du nichts oder musst dir die Zeilen erst beschaffen. Für mehr lese bitte die WinApi-Doku.



  • Na gut dessen war ich mir jetzt schon bewusst^^
    Die Frage war nur ob ich da was grundlegendes übersehe (was scheinbar ja nicht der Fall ist) und wie man wohl am besten ctrl+v einfängt 😉



  • Diese Funktion ist von Mark Russinovich zum kopieren einer listview spalte in das klippboard:

    /******************************************************************************
    *
    *	FUNCTION:	CopySelection
    *
    *	PURPOSE:	Copies the currently selected line in the output to the clip
    *				board.
    *
    *****************************************************************************//*
    void CopySelection( HWND hWnd )
    {
        LPTSTR  lptstrCopy; 
        HGLOBAL hglbCopy; 
    	size_t	size = 0, newSize;
    	int		currentItem, iColumn;
    	TCHAR	curText[MAXITEMLENGTH];
    	TCHAR	selectedText[NUMCOLUMNS * MAXITEMLENGTH];	
    
    	// Get the currently selected item and construct
    	// the message to go to the clipboard
    	currentItem = ListView_GetNextItem( hWndList, -1, LVNI_SELECTED );
    	if( currentItem == -1 ) {
    
    		return;
    	}
    	selectedText[0] = 0;
    	for( iColumn = 1; iColumn < NUMCOLUMNS; iColumn++ ) {
    
    		curText[0] = 0;
    		ListView_GetItemText( hWndList, currentItem, iColumn, 
    					curText, MAXITEMLENGTH );
    		strcat( selectedText, curText );
    		strcat( selectedText, "\t");
    	}
    	strcat( selectedText, "\r\n");
    
    	// Empty the clipboard
        if (!OpenClipboard( hWnd )) return; 
        EmptyClipboard(); 
    
    	size = strlen( selectedText )+1;
        hglbCopy = GlobalAlloc( GMEM_DDESHARE|GMEM_MOVEABLE, size ); 
        lptstrCopy = GlobalLock(hglbCopy); 
        strcpy(lptstrCopy, selectedText );
        GlobalUnlock(hglbCopy); 
    
    	while( (currentItem = ListView_GetNextItem( hWndList, currentItem, 
    				LVNI_SELECTED )) != -1) {
    		selectedText[0] = 0;
    		for( iColumn = 1; iColumn < NUMCOLUMNS; iColumn++ ) {
    
    			curText[0] = 0;
    			ListView_GetItemText( hWndList, currentItem, iColumn, 
    						curText, MAXITEMLENGTH );
    			strcat( selectedText, curText );
    			strcat( selectedText, "\t");
    		}
    		strcat( selectedText, "\r\n");
    
    		newSize = size + strlen( selectedText );
    		hglbCopy = GlobalReAlloc( hglbCopy, newSize, 0 );
    		lptstrCopy = GlobalLock(hglbCopy); 
    		strcpy( &lptstrCopy[size-1], selectedText );
    		GlobalUnlock(hglbCopy); 
    
    		size = newSize;
    	}
    
    	// Place it in the clipboard
    	SetClipboardData(CF_TEXT, hglbCopy); 
        CloseClipboard(); 	
    }
    


  • @buntehaare: Ich weiss nicht, ob dein vorgestellter Code die zuletzt gestellte Frage beantwortet. Er will doch nichts ins Clipboard übertragen, sondern auf spezielle Eingaben des Anwenders (hier ctrl+v) reagieren. In einer listbox kann der Anwender nichts selektieren, er kann fertige Einträge nur lesen.

    Die Standard-Controls - wie listbox - haben in der WinApi keine benutzerdefinierte CALLBACK-Funktion vorgesehen, in der man reagieren kann. Die WinApi regelt das selbst. Will man bestimmte Dinge anders als standardmässig vorgesehen regeln, bleibt aber der Weg der listbox mit subclassing eine eigene CALLBACK-Funktion zu verpassen. Das ist nun leider nicht auf die Schnelle erklärt oder mit einem simplen Codeschnipsel dargestellt. Ich mache subclassing gerne mit edit-controls, listboxes dürften da nicht anders sein.

    Wenn dies die Zielrichtung des Themas ist teile ich gerne mehr mit.



  • Nein, der Beitrag von Bunteharre passt hier irgendwie gar nicht rein.. 😃

    Momentan habe ich einfach einen button "paste", das ist so eigentlich auch ganz ok. Das Problem würde also eh nicht bei der listbox selbst liegen sondern daran ctrl+v einzufagen. (Was man wahrscheinlich eh über das main-window machen würde?)

    Das werde ich denn mit GetAsyncKeyState machen falls sich da nichts eleganteres findet.



  • berniebutt schrieb:

    In einer listbox kann der Anwender nichts selektieren, er kann fertige Einträge nur lesen.

    Das stimmt aber doch nicht. Man kann Einträge markieren, wenn man nicht gerade LBS_NOSEL als Listbox-Style vergibt. Beim Listbox-Style LBS_MULTIPLESEL kann man sogar mehrere Einträge gleichzeitig auswählen.



  • cooky451 schrieb:

    Momentan habe ich einfach einen button "paste"

    Wo hast du diesen button (in welchem Fenster) und was soll der konkret auslösen? "paste" klingt schon nach Clipboard, aber da muss dann auch was drin sein.

    @Belli: Gut, wenn man mit listbox-styles mehr machen kann, dann helfe weiter. Ich weiss immer noch nicht, wohin die Karre laufen soll.



  • Er will irgendwas, was er wie auch immer in die Zwischenablage bugsiert hat, in seine Listbox einfügen ... nun sucht er nach einem Weg, mitzukriegen, wenn seine Listbox den Fokus hat und STRG V gedrückt wird, um daraufhin die Zwischenablage auszulesen und das Gefundene in der Listbox anzuzeigen ... so hab ich es verstanden.


Anmelden zum Antworten