| Autor |
Nachricht |
c_flo
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
|
c_flo Mitglied
19:23:53 20.01.2012 Titel: |
c winapi ListBox MultiSelect |
Zitieren |
Hallo,
ich schreibe c programme mit hilfe der winapi.
Meine Hilfe ist dieses tutorial:
http://www.pronix.de/pronix-1024.html
ich habe eine listbox mit MultiSelect erstellt, ABER ich schaffe es nicht das ergebniss auszulesen.
BITTE um HILFE.
DANKE.... |
|
|
|
 |
C++ Forumbot
Forumbot
Benutzerprofil
Anmeldungsdatum: 29.02.2004
Beiträge: 16160
|
C++ Forumbot Forumbot
19:26:12 20.01.2012 Titel: |
|
Zitieren |
|
 |
c_flo
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
|
c_flo Mitglied
19:31:58 20.01.2012 Titel: |
|
Zitieren |
DANKE
stimmt muss in das WinAPI Forum
|
|
|
|
 |
Thorgrim
Unregistrierter
|
Thorgrim Unregistrierter
20:01:08 20.01.2012 Titel: |
|
Zitieren |
Schau dir mal die Nachrichten LB_GETSELCOUNT und LB_GETSELITEMS an.
Mit Ersterer erhältst du die Anzahl der ausgewählten Einträge, mit der anderen die Indizes. Und da du in C++ programmierst, nimmst du am besten einen std::vector zur Bereitstellung des notwendigen Speichers. |
|
|
|
 |
c_flo
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
|
c_flo Mitglied
20:57:18 20.01.2012 Titel: |
|
Zitieren |
Danke
Ich bin hier im Forum darauf gestoßen:
LB_GETSELITEMS:
- wParam: Maximale Anzahl, die das Array aufnehmen kann
- lParam: Pointer auf ein INT-Array, in dem die Indexnummer der selektierten Einträge gespeichert werden.
Beispiel:| C/C++ Code: | #define MAXNUM 20
int iIndices[MAXNUM];
SendMessage(hwndList,LB_GETSELITEMS,MAXNUM,(LPARAM)iIndices); | |
| C/C++ Code: | #define MAXNUM 20
int iIndices[MAXNUM];
SendMessage(hwndList,LB_GETSELITEMS,MAXNUM,(LPARAM)iIndices); | |
| C/C++ Code: | #define MAXNUM 20
int iIndices[MAXNUM];
SendMessage(hwndList,LB_GETSELITEMS,MAXNUM,(LPARAM)iIndices); | |
ok verstehe ich ABER:
wo kann ich denn den Array angeben?
(ich will das Ergebniss ja nicht in die wüste schicken ) |
_________________ ...
|
|
 |
Thorgrim
Unregistrierter
|
Thorgrim Unregistrierter
21:11:51 20.01.2012 Titel: |
|
Zitieren |
| c_flo schrieb: | wo kann ich denn den Array angeben?  |
Ich verstehe gerade nicht was du meinst, mit
| C/C++ Code: | | SendMessage(hwndList,LB_GETSELITEMS,MAXNUM,(LPARAM)iIndices); | |
| C/C++ Code: | | SendMessage(hwndList,LB_GETSELITEMS,MAXNUM,(LPARAM)iIndices); | |
| C/C++ Code: | | SendMessage(hwndList,LB_GETSELITEMS,MAXNUM,(LPARAM)iIndices); | |
Übergibst du doch die Adresse, wo die Daten landen sollen.
Und mit einem std::vector und der Überprüfung der Anzahl bist du besser beraten, die Anzahl der selektierten Einträge kann auch größer als MAXNUM sein.
Ich hätte eher so etwas gedacht (ungetestet und zu langer Funktionsname)
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 | 1 2 3 4 5 6 7 8 9 10 | bool GetMultiSelectionListboxItemIndices(HWND listview, std::vector<int>& items)
{
LRESULT count = SendMessage(listview, LB_GETSELCOUNT, 0, 0);
if(count==0 || count==LB_ERR)
return false;
items.resize(count);
LRESULT res = SendMessage(listview, LB_GETSELITEMS, items.size(), reinterpret_cast<LPARAM>(&items[0]));
return res!=LB_ERR;
}
| |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 | bool GetMultiSelectionListboxItemIndices(HWND listview, std::vector<int>& items)
{
LRESULT count = SendMessage(listview, LB_GETSELCOUNT, 0, 0);
if(count==0 || count==LB_ERR)
return false;
items.resize(count);
LRESULT res = SendMessage(listview, LB_GETSELITEMS, items.size(), reinterpret_cast<LPARAM>(&items[0]));
return res!=LB_ERR;
}
| |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 | bool GetMultiSelectionListboxItemIndices(HWND listview, std::vector<int>& items)
{
LRESULT count = SendMessage(listview, LB_GETSELCOUNT, 0, 0);
if(count==0 || count==LB_ERR)
return false;
items.resize(count);
LRESULT res = SendMessage(listview, LB_GETSELITEMS, items.size(), reinterpret_cast<LPARAM>(&items[0]));
return res!=LB_ERR;
}
| |
|
|
|
|
 |
Hi
Unregistrierter
|
Hi Unregistrierter
21:12:44 20.01.2012 Titel: |
|
Zitieren |
| c_flo schrieb: | wo kann ich denn den Array angeben? ) |
Hast du doch im Beispiel, als letzter Parameter |
|
|
|
 |
c_flo
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
|
c_flo Mitglied
23:17:34 20.01.2012 Titel: |
|
Zitieren |
eigendlich programmiere ich c nicht c++
ich verstehe das Beispiel von Thorgrim desswegen nicht ganz.
LB_GETSELITEMS gibt aber noch kein text aus oder??? |
_________________ ...
Zuletzt bearbeitet von c_flo am 15:28:24 21.01.2012, insgesamt 2-mal bearbeitet |
|
 |
c_flo
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
|
c_flo Mitglied
23:50:14 20.01.2012 Titel: |
|
Zitieren |
an "hi" :
das letzte parameter ist doch ein integer:
| C/C++ Code: | #define MAXNUM 20
int iIndices[MAXNUM];
SendMessage(hwndList,LB_GETSELITEMS,MAXNUM,(LPARAM)iIndices); | |
| C/C++ Code: | #define MAXNUM 20
int iIndices[MAXNUM];
SendMessage(hwndList,LB_GETSELITEMS,MAXNUM,(LPARAM)iIndices); | |
| C/C++ Code: | #define MAXNUM 20
int iIndices[MAXNUM];
SendMessage(hwndList,LB_GETSELITEMS,MAXNUM,(LPARAM)iIndices); | |
oder muss ich danach anders aus der zahl den text auslesen.... |
_________________ ...
Zuletzt bearbeitet von c_flo am 23:51:17 20.01.2012, insgesamt 1-mal bearbeitet |
|
 |
c_flo
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
|
c_flo Mitglied
23:58:33 20.01.2012 Titel: |
|
Zitieren |
übrigens weiß ich in meinem programm wie viele einträge insgesamt in der listbox sind und müsste dies nicht nochmal auslesen.wie viele selektiert sind weiß ich natürlich nicht... |
_________________ ...
Zuletzt bearbeitet von c_flo am 14:29:19 21.01.2012, insgesamt 1-mal bearbeitet |
|
 |
c_flo
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
|
c_flo Mitglied
18:57:53 28.01.2012 Titel: |
|
Zitieren |
kann niemand helfen??
|
_________________ ...
|
|
 |
@rT!f@Ct
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.04.2007
Beiträge: 451
|
@rT!f@Ct Mitglied
20:07:17 28.01.2012 Titel: |
|
Zitieren |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 | 1 2 3 4 5 6 7 8 9 10 | bool GetMultiSelectionListboxItemIndices(HWND listview, std::vector<int>& items)
{
LRESULT count = SendMessage(listview, LB_GETSELCOUNT, 0, 0);
if(count==0 || count==LB_ERR)
return false;
items.resize(count);
LRESULT res = SendMessage(listview, LB_GETSELITEMS, items.size(), reinterpret_cast<LPARAM>(&items[0]));
return res!=LB_ERR;
} | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 | bool GetMultiSelectionListboxItemIndices(HWND listview, std::vector<int>& items)
{
LRESULT count = SendMessage(listview, LB_GETSELCOUNT, 0, 0);
if(count==0 || count==LB_ERR)
return false;
items.resize(count);
LRESULT res = SendMessage(listview, LB_GETSELITEMS, items.size(), reinterpret_cast<LPARAM>(&items[0]));
return res!=LB_ERR;
} | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 | bool GetMultiSelectionListboxItemIndices(HWND listview, std::vector<int>& items)
{
LRESULT count = SendMessage(listview, LB_GETSELCOUNT, 0, 0);
if(count==0 || count==LB_ERR)
return false;
items.resize(count);
LRESULT res = SendMessage(listview, LB_GETSELITEMS, items.size(), reinterpret_cast<LPARAM>(&items[0]));
return res!=LB_ERR;
} | |
in zeile 3 wird dir die anzahl der markierten elemente zurückgegeben
in zeile 4 wird abgefragt ob überhaupt elemenet markiert sind oder ob die listbox nicht eine single-selection list box ist, dann gibt sie nämlich LB_ERR zurück
in zeile 6 wird die größe des bereiches festgelegt der später die markierten (nr) der listbox enthält.
in zeile 7 wird dir der bereich gefüllt, mit den nr der elemente die in der listbox markiert sind.
was dir letzten endes in der funktion GetMultiSelectionListboxItemIndices(..., std::vector<int>& items) zurückgegeben wird.
die nr die jetzt in items stehn, kannst du dazu verwenden abzufragen welchen text das jeweils markierte element hat...
noch fragen? |
_________________ @rT!f@Ct
|
|
 |
c_flo
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
|
c_flo Mitglied
00:34:54 29.01.2012 Titel: |
|
Zitieren |
danke das hat mir geholfen
noch eine frage:
welche bibliotheken muss ich einbinden (lässt sich nicht kompilieren...)
und in zeile 7 verstehe ich das letzte parameter nicht:
| C/C++ Code: | | reinterpret_cast<LPARAM>(&items[0]) | |
| C/C++ Code: | | reinterpret_cast<LPARAM>(&items[0]) | |
| C/C++ Code: | | reinterpret_cast<LPARAM>(&items[0]) | |
reinterpret_cast?? |
_________________ ...
Zuletzt bearbeitet von c_flo am 00:50:59 29.01.2012, insgesamt 1-mal bearbeitet |
|
 |
Thorgrim
Unregistrierter
|
Thorgrim Unregistrierter
11:31:51 29.01.2012 Titel: |
|
Zitieren |
|
 |
c_flo
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
|
c_flo Mitglied
17:41:33 03.02.2012 Titel: |
|
Zitieren |
reinterpret_cast ist doch ein c++ befehl
ich programmiere aber c
desswegen auch die frage mit der bibliothek
kann ich eine listbox mit MultiSelectauch auch in c auslesen?
|
_________________ ...
|
|
 |