Einen Eintrag in der ListBox um eine Position nach oben bzw. nach unten verschieben?
-
Hallo
Ich habe eine ListBox, welche bereits mit verschiedenen Einträgen gefüllt ist. Nun möchte ich einen markierten Eintrag, ausgelöst durch einen Button-Klick, um jeweils eine Position nach oben bzw. unten in der Liste verschieben.
Hier meine bisherige Realisierung:
... LRESULT CALLBACK WndProc(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam) { ... case ID_MOVEUPBUTTON: { LPCSTR szItem1[URL_BUF]; // lokale Hilfsvariable LPCSTR szItem2[URL_BUF]; // lokale Hilfsvariable int CurrentItemPos; // speichert die Position des aktuell markierten Listen-Eintrags /* aktuell ausgewählten Listen-Eintrag um eine Position nach oben schieben */ CurrentItemPos = SendMessage(hListBox, LB_GETCURSEL, 0, 0); // liefert die Position des ausgewählten Listen-Eintrags if (CurrentItemPos > 0) // wenn der Eintrag nicht der oberste in der Liste ist { SendMessage(hListBox, LB_GETTEXT, CurrentItemPos, (LPARAM)szItem1); SendMessage(hListBox, LB_GETTEXT, CurrentItemPos - 1, (LPARAM)szItem2); SendMessage(hListBox, LB_DELETESTRING, CurrentItemPos, 0); SendMessage(hListBox, LB_DELETESTRING, CurrentItemPos - 1, 0); SendMessage(hListBox, LB_INSERTSTRING, CurrentItemPos - 1, (LPARAM)szItem1); SendMessage(hListBox, LB_INSERTSTRING, CurrentItemPos, (LPARAM)szItem2); } break; } case ID_MOVEDOWNBUTTON: { LPCSTR szItem1[URL_BUF]; // lokale Hilfsvariable LPCSTR szItem2[URL_BUF]; // lokale Hilfsvariable int CurrentItemPos; // speichert die Position des aktuell markierten Listen-Eintrags int ItemCount; // speichert die Anzahl der Listen-Einträge /* aktuell ausgewählten Listen-Eintrag um eine Position nach unten schieben */ CurrentItemPos = SendMessage(hListBox, LB_GETCURSEL, 0, 0); // liefert die Position des ausgewählten Listen-Eintrags ItemCount = SendMessage(hListBox, LB_GETCOUNT, 0, 0); // liefert die Position des letzten Listen-Eintrags if (CurrentItemPos < ItemCount - 1) // wenn es nicht der letzte Eintrag der Liste ist { SendMessage(hListBox, LB_GETTEXT, CurrentItemPos, (LPARAM)szItem1); SendMessage(hListBox, LB_GETTEXT, CurrentItemPos + 1, (LPARAM)szItem2); SendMessage(hListBox, LB_DELETESTRING, CurrentItemPos + 1, 0); SendMessage(hListBox, LB_DELETESTRING, CurrentItemPos, 0); SendMessage(hListBox, LB_INSERTSTRING, CurrentItemPos, (LPARAM)szItem2); SendMessage(hListBox, LB_INSERTSTRING, CurrentItemPos + 1, (LPARAM)szItem1); } break; } ... }Das Prinzip:
1. Auslesen der beiden zuvertauschenden Listen-Einträge in Hilfsvariablen.
2. Löschen der beiden Listen-Einträge
3. Zwei neue Listeneinträge von den Hilfsvariablen erstellenDas Ganze ist ziemlich umständlich und unübersichtlich wie ich finde. Also da gibt es doch sicherlich etwas vorgefertigtes bzw. eleganteres?
Gibt es nicht wenigstens eine LB_*-Nachricht um einen Eintrag umzubennen, statt ihn zu löschen und neu zu erstellen?
Danke im voraus
-
BarneyGumble schrieb:
Das Ganze ist ziemlich umständlich und unübersichtlich wie ich finde. Also da gibt es doch sicherlich etwas vorgefertigtes bzw. eleganteres?
Gibt es nicht wenigstens eine LB_*-Nachricht um einen Eintrag umzubennen, statt ihn zu löschen und neu zu erstellen?
Das Ganze ist in der Tat umständlich und unübersichtlich, aber etwas vorgefertigtes bzw. eleganteres gibt es (leider) nicht.
Nach einer LB_*-Nachricht, die einen Eintrag umbenennt, wirst du vergeblich suchen.
-
Du solltest Dir diese Funktionalität evtl in einer Funktion kapseln, dann bleibt es im Hauptprogramm übersichtlich
. Denn, wie schon gesagt, sowas gibts nicht (IMHO).
-
Danke für eure Antworten
In der Tat, ich habe in der MSDN Library vergeblich nach einer solchen Funktionalität gesucht.
Okay, ich werde das Ganze noch in eine Funktion packen und die Sache ist gegessen.
