Listboxen - synchron scrollbar ?
-
Rhombicosidodecahedron schrieb:
Ich meine ja nur, dass man flexibel sein sollte (vor allem beim Lösen von Problemen) und nicht bis "Teufel-komm-raus" einen für einem zu schwierigen Problem sitzt und nicht weiterkommt.
hast schon recht... ich hätte Mr Evil mal am Anfang fragen sollen was er genau vor hat ( so wie ich es sonst eigentlich immer mache ). Ich "denke" aber er kennt das CListCtrl ( hoffentlich ) !!!
Rhombicosidodecahedron schrieb:
Mit freundlichen Grüßen und hoffend veganza nicht weiter zu verärgern
Rhombicosidodecahedrondu hast mich nicht verärgert... und sorry wenn es so rübergekommen ist... war nicht meine Absicht

cu veganza
-
also um es mal ein bissl zu verdeutlichen
ich benutz die listboxen um den inhalt eines vectors aufzulisten, dieser ist ein CString vector und pro zeile steht ein text, diesen muss ich einzeln handeln koennen und auhc in der listbox anklicken sodass ich diesen angeklickenten holen kann
zugriffe hab ich solche:
void CFileRenamerDlg::SetListBevoreItems() { int iPos = m_ListBevore.GetCurSel(); m_ListBevore.ResetContent(); CString csTemp = _T(""); for(size_t i=0; i<m_vcsListComplete.size(); i++){ if(m_CBPath.GetCheck() == TRUE) csTemp += m_vcsListPath[i]; csTemp += m_vcsListFile[i]; if(m_CBExtension.GetCheck() == TRUE) csTemp += m_vcsListExtension[i]; m_ListBevore.AddString(csTemp); csTemp = _T(""); } m_ListBevore.SetCurSel(iPos); SetListBevoreScrollBar(); }desweiteren hier und da noch ein paar get item usw
CListCtrl war auch mein erster gedanke, nur da find ich kein addstring oder sonstiges
ich hab mal mein testpeoject wegen den synchronen scrollen hochgeladen, das sind meine bisherigen versuche mit dem ueberschriebenen OnVScroll
Klick
Klick
das zweite, da hatte ich vor die erste ebenfals abhaengig vom zweiten zu machenbtw: das eigentliche problem hatte ich ja schon geloest mit einer zusaetzlichen scrollbar siehe seite 1 - nur das ich das mitlerweile alles auf dieses SetTopIndex geaendert hab
{vielen dank auch dafuer an den ideen-schubser} {=ich hab kein abgabetermin usw, darum kann ich mir zeit lassen und an diesem problem rumprobieren
diese anderen ideen, zb zwei reihen geht nicht, da die listen fast immer unterschiedlichen inhalt haben werden, und auch horizontal scrollbar {einzeln} sein muessen
-
Ehm, kein AddString in einem CListCtrl und du gibst schon auf? ^^
Hier mal ein kleines Beispiel wie man ein CListCtrl füllen kann:CListCtrl* pMyListCtrl; // Dein ListCtrl, welches auch auf etwas zeigen sollte :D // Zuerst mal, falls schon was drin wäre, leeren wir das CListCtrl komplett, samt den Kolonnen // Zuerst alle Items raus. pMyListCtrl->DeleteAllItems(); // Danach alle Kolonnen. while(pMyListCtrl->GetHeaderCtrl()->GetItemCount() > 0) { pMyListCtrl->DeleteColumn(0); } // Wir fügen nun 3 Kolonnen ein. pMyListCtrl->InsertColumn(0, _T("Kolonne 1"), LVCFMT_LEFT, 100); pMyListCtrl->InsertColumn(1, _T("Kolonne 2"), LVCFMT_LEFT, 110); pMyListCtrl->InsertColumn(2, _T("Kolonne 3"), LVCFMT_LEFT, 50); // Wir haben nun ein Array arObject. Jedes Objekt hat 3 CStrings: strA, strB, strC for(int i = 0; i < nCount; ++i) { pMyListCtrl->InsertItem(i, arObject[i].strA); pMyListCtrl->SetItemText(i, 1, arObject[i].strB); pMyListCtrl->SetItemText(i, 2, arObject[i].strC); }Ich hoffe das hilft dir beim Verständnis des CListCtrls und hilft dir bei der Lösung deines Problems.
Edit: Das CListCtrl sollte natürlich dann im Report Style sein! ^^Referenzen
CListCtrl Overview
CListCtrl::DeleteAllItems
CListCtrl::GetHeaderCtrl
CListCtrl::DeleteColumn
CListCtrl::InsertColumn
CListCtrl::InsertItem
CListCtrl::SetItemText
CHeaderCtrl Overview
CHeaderCtrl::GetItemCountGrüssli
-
ich hab grad nochmal geschaut und dann ists mir wieder eingefallen
CListCtrl hab ich bereits versucht und befuellt gehabt, dort war mein problem das er die items sobald es in der hoehe voll war in einer zweiten reihe angefangen hat und nur horizontal scrollen liess {hattes auf list gestellt}
es muss aber alles nur untereinander - direkt wie in einer listbox, und das egal wieviele items {koennen bis ueber 10000 gehen}
//dazuedit - ausserdem hat die funktion ebenfals kein OnVScroll welches ich direkt in der dialog klasse ueberschreiben kann
{editbox hat des}
-
Mr Evil schrieb:
CListCtrl hab ich bereits versucht und befuellt gehabt, dort war mein problem das er die items sobald es in der hoehe voll war in einer zweiten reihe angefangen hat und nur horizontal scrollen liess {hattes auf list gestellt}
es muss aber alles nur untereinander - direkt wie in einer listbox, und das egal wieviele items {koennen bis ueber 10000 gehen}
Du musst den Style auf LVS_REPORT setzen. Dann ist es so, wie in einem Windows-Ordner, welcher in der Ansicht auf Details gesetzt wurde. Da kannst du zig Millionen untereinander auflisten

Mr Evil schrieb:
//dazuedit - ausserdem hat die funktion ebenfals kein OnVScroll welches ich direkt in der dialog klasse ueberschreiben kann
{editbox hat des}CListCtrl hat aber die Nachricht WM_VSCROLL und WM_HSCROLL, welche man abfangen kann und dann hast du deine Funktionen OnVScroll und OnHScroll. Allerdings ist dann die Frage, ob du dies noch brauchst, wenn du ja in einem ListCtrl mehrere Kolonnen hast. Die Scrollen ja bereits alle zusammen

Grüssli
-
Dravere schrieb:
Du musst den Style auf LVS_REPORT setzen. Dann ist es so, wie in einem Windows-Ordner, welcher in der Ansicht auf Details gesetzt wurde. Da kannst du zig Millionen untereinander auflisten

das is bloed, dann hab ich ja oben diese leiste, die brauch ich gar nicht
Dravere schrieb:
CListCtrl hat aber die Nachricht WM_VSCROLL und WM_HSCROLL, welche man abfangen kann und dann hast du deine Funktionen OnVScroll und OnHScroll. Allerdings ist dann die Frage, ob du dies noch brauchst, wenn du ja in einem ListCtrl mehrere Kolonnen hast. Die Scrollen ja bereits alle zusammen

Grüssli
das ist ganz und gar ausgeschlossen das ich beide listen zu einer fasse, es muessen definitiv zwei getrennte listen bleiben, kolonnen sind hier voellig fehl am platz
WM_VSCROLL und HSCROLL, kann ich die direkt in der dialog klasse ueberschreiben ? oder muss ich da wieder eine neue klasse erstellen wo ich CListCtrl ableite - das ist dann genau das selbe wie bei den normalen listboxen, und da bekomms ich mit der hilfe hier ja immernoch nicht hin /=
// dazuedit - nope, des ON_WM_VSCROLL in der dialog klasse faengt das dieser liste nicht ab, also im prinzip genau das selbe problem wie bei der normalen listbox, da kann ich gleich lassen was ich hab mit der zusaetzlichen scrollbar
-
Mr Evil schrieb:
das is bloed, dann hab ich ja oben diese leiste, die brauch ich gar nicht
Kannst du abstellen mit dem Style LVS_NOCOLUMNHEADER.
Mr Evil schrieb:
das ist ganz und gar ausgeschlossen das ich beide listen zu einer fasse, es muessen definitiv zwei getrennte listen bleiben, kolonnen sind hier voellig fehl am platz
Sicher? Sicher dass du nicht einfach zu verbohrt auf eine Lösung bist? Es wurde ja schon mal gesagt, dass man vielleicht auch andere Wege in betracht ziehen sollte.
Mr Evil schrieb:
WM_VSCROLL und HSCROLL, kann ich die direkt in der dialog klasse ueberschreiben ? oder muss ich da wieder eine neue klasse erstellen wo ich CListCtrl ableite - das ist dann genau das selbe wie bei den normalen listboxen, und da bekomms ich mit der hilfe hier ja immernoch nicht hin /=
// dazuedit - nope, des ON_WM_VSCROLL in der dialog klasse faengt das dieser liste nicht ab, also im prinzip genau das selbe problem wie bei der normalen listbox, da kann ich gleich lassen was ich hab mit der zusaetzlichen scrollbar
Mr Evil schrieb:
//dazuedit - ausserdem hat die funktion ebenfals kein OnVScroll welches ich direkt in der dialog klasse ueberschreiben kann
{editbox hat des}Klar musst du von CListCtrl eine Klasse ableiten, um auf die entsprechenden Nachrichten reagieren zu können. Allerdings ist das bei einem CEdit nicht anderst. CEdit hat soweit ich weiss keine öffentlichen OnVScroll oder OnHScroll Funktionen.
Hmm willst du vielleicht mal erklären was du machen willst? Also nicht die Lösung, welche du anstrebst, sondern das Problem! Was willst du darstellen, wie und wieso? Würde mich nämlich auch langsam wunder nehmen, wieso es nur diesen Lösungsweg gibt ^^
Grüssli
-
Dravere schrieb:
Kannst du abstellen mit dem Style LVS_NOCOLUMNHEADER.
hab ich auch schon gefunden #gg
Dravere schrieb:
Sicher? Sicher dass du nicht einfach zu verbohrt auf eine Lösung bist? Es wurde ja schon mal gesagt, dass man vielleicht auch andere Wege in betracht ziehen sollte.
hab ich bereits alles durchdacht, die sache ist das man in beiden listen sich frei bewegen kann, und auch aenderungen - sowie horizontales {getrenntes}scrollen
Dravere schrieb:
Klar musst du von CListCtrl eine Klasse ableiten, um auf die entsprechenden Nachrichten reagieren zu können. Allerdings ist das bei einem CEdit nicht anderst. CEdit hat soweit ich weiss keine öffentlichen OnVScroll oder OnHScroll Funktionen.
doch CEdit hat welche, erstelle ein edit in nem dialog projekt und schau selber bei den properties des edit feldes, wenn de da auf OnH bzw OnVScroll gehst, dann wird es direkt in der dialogklasse implementiert
Dravere schrieb:
Würde mich nämlich auch langsam wunder nehmen, wieso es nur diesen Lösungsweg gibt ^^
#gg es gibt keineswegs nur ein loesungsweg, das ist mir schon klar, nur die anderen alternativen zu einer listbox hab ich alles schon durchgespielt, sei es im kopf oder durch ausprobieren
mein loesungsweg den ich bisher am laufen hab ist ja der mit einer zusaetzlichen scrollbar {o; ist auch ein anderer als der der hier bei mir {noch} nicht klappen will {o;
trotzdem danke fuer die geduld {o;
-
Mr Evil schrieb:
hab ich auch schon gefunden #gg
Dann such das nächste Mal besser, bevor du antwortest

Mr Evil schrieb:
doch CEdit hat welche, erstelle ein edit in nem dialog projekt und schau selber bei den properties des edit feldes, wenn de da auf OnH bzw OnVScroll gehst, dann wird es direkt in der dialogklasse implementiert
Achsoooooo, das meinst du. Tja, musst dich halt schon korrekt ausdrücken ^^
Das sind Event Handler. Und die Funktionen heissen nicht OnHScroll oder OnVScroll, sondern OnEnHScroll[DieID] oder OnEnVScroll[DieID]. Und was das wichtigste ist, die Funktionen gehören nicht zu CEdit! Das sind eben Event Handler, Nachrichten, welche von CEdit an das Parentwindow gesendet werden. Im Parentwindow kann man dann die Nachricht eben abfangen und die entsprechende Funktion im Parentwindow aufrufen.Mr Evil schrieb:
#gg es gibt keineswegs nur ein loesungsweg, das ist mir schon klar, nur die anderen alternativen zu einer listbox hab ich alles schon durchgespielt, sei es im kopf oder durch ausprobieren
Und du meinst, dass mit deinem (sorry) beschränktem Wissen über die MFC, an alle Möglichkeiten gedacht hast? Daher würde ich eben vorschlagen, dass du es ein wenig genauer erläuterst, vielleicht kommen plötzlich welche mit Ideen, an welche du gar nicht gedacht hast

Hmmm ... und du hast noch gesagt, dass du es nicht hinbekommen hast, eine eigene Klasse von CListBox abzuleiten und mit dieser dann zu arbeiten? Wo hat es denn gefehlt, bzw. wo gab es Probleme?
class COwnListBox : public CListBox { // ... Konstruktoren und all das Zeugs }Dort gehst du mit dem Zeiger dings bums rein und gehst dann auf Eigenschaften. Irgendwo kannst du jedenfalls hier Windowsnachrichten abfangen und zwar eben die WM_VSCROLL und die WM_HSCROLL. Da werden automatisch die entsprechenden Funktionen hinzugefügt. In der Dialogklasse wechselst du dann bei denen ListBoxen den Controlvariabeltyp von CListBox durch COwnListBox aus.
Das war jetzt sehr kurz gehalten, aber sag wo es Probleme gibt, man wird dir hier helfen. Ausser du verbrauchst zuviel Geduld, dann schickt man dich plötzlich zu einem MFC Tutorial
Mr Evil schrieb:
trotzdem danke fuer die geduld {o;
Kein Problem, dafür ist das Forum ja da, um zu helfen

Grüssli
-
Dravere schrieb:
Dann such das nächste Mal besser, bevor du antwortest

lass mich q: #gg
Dravere schrieb:
Achsoooooo, das meinst du. Tja, musst dich halt schon korrekt ausdrücken ^^
Das sind Event Handler. Und die Funktionen heissen nicht OnHScroll oder OnVScroll, sondern OnEnHScroll[DieID] oder OnEnVScroll[DieID]. Und was das wichtigste ist, die Funktionen gehören nicht zu CEdit! Das sind eben Event Handler, Nachrichten, welche von CEdit an das Parentwindow gesendet werden. Im Parentwindow kann man dann die Nachricht eben abfangen und die entsprechende Funktion im Parentwindow aufrufen.durch mein beschrenktes wissen ueber die MFC konnt ich es nicht anders ausdruecken {o; gut erklaert {o;
Dravere schrieb:
Und du meinst, dass mit deinem (sorry) beschränktem Wissen über die MFC, an alle Möglichkeiten gedacht hast?
brauchst dich nicht entschuldigen {o; ich bin in der MFC lernphase und hab kaum zeit #gg, ich hab CListBox in benutzung {macht alles am besten mit} CListCtrl probiert - CEdit und CRichEdit - mit keinem funktioniert alles weitere so gut wie mit der CListBox #gg
Dravere schrieb:
Hmmm ... und du hast noch gesagt, dass du es nicht hinbekommen hast, eine eigene Klasse von CListBox abzuleiten und mit dieser dann zu arbeiten? Wo hat es denn gefehlt, bzw. wo gab es Probleme?
class COwnListBox : public CListBox { // ... Konstruktoren und all das Zeugs }Dort gehst du mit dem Zeiger dings bums rein und gehst dann auf Eigenschaften. Irgendwo kannst du jedenfalls hier Windowsnachrichten abfangen und zwar eben die WM_VSCROLL und die WM_HSCROLL. Da werden automatisch die entsprechenden Funktionen hinzugefügt. In der Dialogklasse wechselst du dann bei denen ListBoxen den Controlvariabeltyp von CListBox durch COwnListBox aus.
das ist genau das was ich hab {o; - das problem ist,
ich steck zb in der OnVScroll von listbox 1 -
und kann mit SetTopIndex das scroll alles setzen,
aber ich komm nicht an die zweite listboxich hab eine methode in der OwnListBox die ein zeiger von CListBox annimmt,
in der dialog klasse uebergebe ich den zeiger auf die zweite liste
dann will ich in der OnVScroll von liste 1 auch den settopindex von liste zwei setzen -
da schiesst das programm abwenn ich anstatt eine CListBox eine CWnd uebergeb,
hab ich nichtmal die moeglichkeit SetTopIndex aufzurufen -
funktioniert also wenigerin einem versuch hab ich die zweite listbox normal erstellt mit einer eigenen control variable die ich uebergeben hab an die OwnListBox
und in den anderen {ersteren} versuch hab ich fuer die zweite liste auch eine klasse abgeleitet und das OnVScroll abgefangen -
immer ist das problem das ich von liste A nicht auf liste B zugreifen kann egal wann und wiegenauer koennen es die testprojekte beschreiben -
schau weiter oben meine DL links, da sieht man direkt meine versuchefuer mein derzeitiges projekt hab ich die loesung mit der zusaetzlichen scrollbar, das wuerd ich auch gerne beibehalten da das genau das macht was gut ist - also das man die einzelnen listboxen trotzdem noch einzelnd scrollen kann {frei bewegen}
aber es foerdert mein MFC lernen wenn ich das auch noch hinbekomm - nur steh aufn schlauch, fummel schon ewig rum {solange es die zeit zulaesst #gg}
btw mein buch - Windows Programmierung mit dem MFC von Jeff Prosise hab ich daheim immer griffbereit -
und hier auf arbeit das englische ebook -
nur ohne eine idee weiss ich nicht wonach ich suchen muss #ggggich mach gleich feierabend, werd wo am wochenende daheim n bissl weitermachen #gg {je nachdem ob mcih meine frau laesst oder nicht #gg}
schoenen gruss
Da Evil
-
Ich wollte hier noch was dazufügen, aber dann war das Forum mal wieder down ^^
Und danach musste ich leider weg. Naja, aber das hole ich nun noch nach. Habe schnell ein 5 Minuten Projekt gemacht, wo das ganze mit CListBox eingebunden ist. Das Projekt beinhaltet alles, also nicht nur die .exe, sondern auch den ganzen Code, damit du dir das anschauen kannst, wie es zu funktionieren hat. Zumindest nehme ich an, dass du es so willst ^^
DownloadBei Fragen, immer Fragen, aber zuerst den Code genau lesen

Grüssli

-
vielen vielen dank - werd es mir zur gemuete fuehren sobald ich zeit find
das das forum {staendig} down ist, ist das einzigste was ich ueberhaupt nicht mag hier
{beim ersten ueberfliegen ist es so wie ich es shcon probiert hatte - muss mal schaun wo ich den fehler hatte}
dazuedit: habs gefunden was ich falsch hatte, und zwar hab ich ganz einfach die funktion der neuen klasse die den pointer annimmt falsch aufgerufen - ich koennte mcih selber treten - solch eine simple sache und ich habs ne gesehn #gg
vielen dank nochmal {=
ich brauchte nur mein aufruf aendern schon hat alles funktioniert was ich bisher hatte