Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: WinAPI ::  c winapi ListBox MultiSelect     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
c_flo
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
Beitrag 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
Beitrag C++ Forumbot Forumbot 19:26:12 20.01.2012   Titel:              Zitieren

Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x, bzw. C++11) in das Forum WinAPI verschoben.

Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?


Dieses Posting wurde automatisch erzeugt.

_________________
Besuchen Sie unsere Bücherecke.
http://www.c-plusplus.de/bucher.php
Mit jeder Bestellung unterstützen Sie das Forum.
c_flo
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
Beitrag c_flo Mitglied 19:31:58 20.01.2012   Titel:              Zitieren

DANKE
stimmt muss in das WinAPI Forum
:D :)
Thorgrim
Unregistrierter




Beitrag 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
Beitrag 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? :confused:
(ich will das Ergebniss ja nicht in die wüste schicken :D )

_________________
...
Thorgrim
Unregistrierter




Beitrag Thorgrim Unregistrierter 21:11:51 20.01.2012   Titel:              Zitieren

c_flo schrieb:
wo kann ich denn den Array angeben? :confused:


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




Beitrag Hi Unregistrierter 21:12:44 20.01.2012   Titel:              Zitieren

c_flo schrieb:
wo kann ich denn den Array angeben? :confused: )

Hast du doch im Beispiel, als letzter Parameter :confused:
c_flo
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
Beitrag 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
Beitrag 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.... :confused:

_________________
...


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
Beitrag 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
Beitrag c_flo Mitglied 18:57:53 28.01.2012   Titel:              Zitieren

kann niemand helfen??
:( :rolleyes:

_________________
...
@rT!f@Ct
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2007
Beiträge: 451
Beitrag @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
Beitrag 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?? :confused:

_________________
...


Zuletzt bearbeitet von c_flo am 00:50:59 29.01.2012, insgesamt 1-mal bearbeitet
Thorgrim
Unregistrierter




Beitrag Thorgrim Unregistrierter 11:31:51 29.01.2012   Titel:              Zitieren

Möchtest du nun in C oder C++ programmieren? Was auch immer, ein wenig Eigeninitiative ist auf jeden Fall angebracht.

std::vector, reinterpret_cast, LB_GETCOUNT, LB_GETSELITEMS.

Wie aus den ersten google-Treffern ersichtlich wird, bist du auf der Suche nach C++-Themen sehr gut bei cplusplus.com und bei WinAPI-Themen bei MSDN aufgehoben.
c_flo
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.01.2012
Beiträge: 14
Beitrag 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?

:)

_________________
...
C/C++ Forum :: WinAPI ::  c winapi ListBox MultiSelect   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.