CListBox
-
Hallo,
habe eine ListBox und möchte den (Text-) Inhalt (auch teilweise) mit der Maus (sollte zum Cursor werden) markieren können. Anschließend Ctrl-C drücken und mit Ctrl V dann den Inhalt an beliebiger Stelle (z.B. Editor) ablegen können. Wie geht das? Ist das eine Eigenschaft von CListBox? Oder was muß ich tun, damit diese Funktion aktiviert wird?

Kann mir jemand einen kleinen Tip geben?
-
Ich geb dir mal nen langen Tip, frag, wenn was unklar ist.

// ------------------------------------------------------------------------------------------------ // "Bearbeiten -> Kopieren" // ------------------------------------------------------------------------------------------------ void CMeinDoc::OnEditCopy() { // Element mit Focus holen CWnd* pWnd = m_pView->GetFocus(); if (pWnd) { // Jetzt rausfinden, was es ist: // Ein Edit? CEdit* pEdit = dynamic_cast<CEdit*>(pWnd); if (pEdit) { pEdit->Copy(); return; } // Eine Combobox? CComboBox* pCbx = dynamic_cast<CComboBox*>(pWnd); if (pCbx) { pCbx->Copy(); return; } CListBox* pLst = dynamic_cast<CListBox*>(pWnd); if (pLst) { CString strText; pLst->GetText(pLst->GetCurSel(), strText); CopyToClipboard(strText); return; } CSortListCtrl* pLsc = dynamic_cast<CSortListCtrl*>(pWnd); if (pLsc) { pLsc->Copy(); } } } // ------------------------------------------------------------------------------------------------ // "Bearbeiten -> Kopieren" De-/Aktivierung // ------------------------------------------------------------------------------------------------ void CBasisDoc::OnUpdateEditCopy(CCmdUI* pCmdUI) { // Element mit Focus holen CWnd* pWnd = m_pView->GetFocus(); if (pWnd) { pCmdUI->Enable((pWnd->IsKindOf(RUNTIME_CLASS(CEdit))) || (pWnd->IsKindOf(RUNTIME_CLASS(CComboBox))) || (pWnd->IsKindOf(RUNTIME_CLASS(CListBox)))|| (pWnd->IsKindOf(RUNTIME_CLASS(CListCtrl)))) ; } else { // Wenn nichts den Focus hat, kann man nichts machen. pCmdUI->Enable(FALSE); } } // ------------------------------------------------------------------------------------------------ // Legt den gegebenen Text in die Zwischenablage // ------------------------------------------------------------------------------------------------ void CBasisDoc::CopyToClipboard(CString& f_strText) const { if(OpenClipboard(NULL)) { // Leermachen EmptyClipboard(); // Speicher reservieren (incl. \0) HGLOBAL hCpDaten = GlobalAlloc(GMEM_DDESHARE, f_strText.GetLength() + 1); // Daten in systemweiten Speicher schieben char* pchData = (char*)GlobalLock(hCpDaten); strcpy(pchData, LPCSTR(f_strText)); // Für andere zur Verfügung stellen GlobalUnlock(hCpDaten); // Daten in die Zwischenablage schieben SetClipboardData(CF_TEXT, hCpDaten); // Fertig CloseClipboard(); } }Über Einfügen solltest du bei ein wenig MSDN-Forschung zu den Befehlen von alleine stolpern.

Achja, wenn du einen Dialog hast, wirst du einiges vereinfachen können.

Ich bin nur nicht sicher ob der Accelerator da auch funktioniert...
-
Hallo estartu,
vielen Herzlichen Dank für den ausführlcihen "Tip"!

tatsächlich habe ich da noch ein paar Fragen...
1. ich möchte nur den Text markieren, über den die Maus drübergezogen wird, während ich die linke maustaste drücke. Bei mir werden aber immer gleich ganze Zeilen markiert... (Hinweis: ich füge neue Zeilen mit AddString() in meine ListBox ein)
2. Wer oder was ruft den die Funktion OnEditCopy() bzw. die anderen beiden eigentlich auf?
(Mir fehlt z.B. die Verbindung zu einem Tastendruck wie Ctrl-C oder Ctrl-V)
-
zappofix schrieb:
1. ich möchte nur den Text markieren, über den die Maus drübergezogen wird, während ich die linke maustaste drücke. Bei mir werden aber immer gleich ganze Zeilen markiert... (Hinweis: ich füge neue Zeilen mit AddString() in meine ListBox ein)
Was da passiert ist das Standardverhalten einer Listbox.
Wie man ihr das umbiegen kann weiß ich nicht. Unmöglich ist ja nichts - aber es dürfte kompliziert werden.
Mein Code ist übrigens nur für Einzelauswahl-Listboxen. Aber das sollte sich ja anpassen lassen.Wie wäre es stattdessen mit einem mehrzeiligen Edit? Da geht auch das Kopieren einfacher, wie du an meinem Code sehen kannst.
Und wenn es schreibgeschützt ist, kann der User auch nix eintippen.2. Wer oder was ruft den die Funktion OnEditCopy() bzw. die anderen beiden eigentlich auf?
(Mir fehlt z.B. die Verbindung zu einem Tastendruck wie Ctrl-C oder Ctrl-V)In den Ressourcen findest du die Accelerator-Tabelle.
Da müsste Strg+C für ID_EDIT_COPY schon drin sein. (Strg+V = ID_EDIT_PASTE)
Das ist ja Windowsstandard und deswegen Englisch.
-
einen "Accelerator" kann ich in meinen Ressourcen nicht finden...
ich sehe unter Ressource nur die Punkte:Dialog
Icon
String Table
Versiondas war's...

das nächste mal probier ich die editbox. an der stört mich halt der graue hintergrund, wenn man sie deaktiviert - ich möchte halt, daß ma da nicht drin rumpfuschen kann...
-
Naja, klick doch mal mit der rechten Maustaste auf "Projektname Ressourcen" und guck mal, was man da alles hinzufügen kann.
Und das mit dem grauen Hintergrund lässt sich mit der Lösung zur Dialogfärbung in der FAQ erschlagen.

Achja: Nicht deaktivieren! Schreibschützen: SetReadOnly.
-
Accelerator eingefügt! Leider ist das Teil leer! Nix ID_EDIT_COPY...
Ich schau mal, wie ich das da reinbekomme...Muß mal für ein paar Stunden weg - werd' mich nachher wieder intensiv um das Problem kümmern! Vielen Dank nochmal soweit!

Bis später
