ListBox - jak obciąć za długi tekst.

dział ogólny

ListBox - jak obciąć za długi tekst.

Nowy postprzez Cyfrowy Baron » środa, 28 kwietnia 2010, 13:18

Zdarza się, że tekst wprowadzony w linii obiektu typu TListBox jest za długi i wychodzi poza obszar roboczy obiektu. Niektóre komponenty np. z paczki LMD potrafią wyświetlić taki tekst obcięty. gdzie nadmiar tekstu jest wyświetlany w postaci trzech kropek. Chciałbym to samo zdobić z obiektem typu TListBox.

Mam w zdarzeniu OnDrawItem kod, który steruje wyświetlaniem tekstu, ale nie wiem bardzo jak zrobić jego skracanie:

Kod: Zaznacz cały

void __fastcall TBabelForm
::ListBox1(TWinControl *Controlint Index,
          
TRect &RectTOwnerDrawState State)
{
 if(
State.Contains(odSelected))
 {
  
dynamic_cast<TListBox *>(Control)->Canvas->Brush->Color = (TColor)0x002FA3FF;
  
dynamic_cast<TListBox *>(Control)->Canvas->Font->Color clMaroon;
 }

 
dynamic_cast<TListBox *>(Control)->Canvas->FillRect(Rect);

 
dynamic_cast<TListBox *>(Control)->Canvas->TextRect(RectRect.Left 3,
                                                    
Rect.Top 1,
                    
dynamic_cast<TListBox *>(Control)->Items->Strings[Index]);
}
 


Mógłbym pobierać rozmiar tekstu za pomocą funkcji TexWidth, potem porównywać z długością obiektu ListBox, następnie obcinałbym nadmiar i wstawiał kropki. Ta metoda jednak jest niedoskonała, być może zetknąłeś się z prostszą metodą.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: ListBox - jak obciąć za długi tekst.

Nowy postprzez polymorphism » środa, 28 kwietnia 2010, 17:47

A nie możesz po prostu namalować te kropki na końcu obszaru (z tłem oczywiście)?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: ListBox - jak obciąć za długi tekst.

Nowy postprzez Cyfrowy Baron » czwartek, 29 kwietnia 2010, 07:08

Nie o to chodzi.

Masz np. listę


tekst
tekst
tekst
za długi tekst
tekst
tekst




"za długi tekst" wychodzi na przykład poza obszar roboczy obiektu i widać tylko np. "za długi te" więc żeby to poprawić chcę skrócić ten tekst tak by wyświetlało "za długi...". Przerysowując tekst w zdarzeniu OnDrawItem nie wpływam na zawartość listy TStrings obiektu a jedynie na to co jest wyświetlane, więc zawartość listy pozostaje niezmienna.

Musze poczytać o funkcji DrawText gdyż z tego co pamiętam oferuje ona większe możliwości obsługi tekstu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: ListBox - jak obciąć za długi tekst.

Nowy postprzez polymorphism » czwartek, 29 kwietnia 2010, 08:08

Nie o to chodzi.

No właśnie o to, doskonale rozumiem o co Ci chodzi. To co podałem jest jedną z metod realizacji tego, co chcesz zrobić. Wspomniałeś o funkcji DrawText, właśnie przypomniało mi się, że oferuję ona taką funkcję skracania tekstu - flaga DT_END_ELLIPSIS bodajże.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: ListBox - jak obciąć za długi tekst.

Nowy postprzez Cyfrowy Baron » piątek, 30 kwietnia 2010, 18:16

Tak. Co do tej flagi to masz rację. Problem już rozwiązałem właśnie funkcją DrawText:

Kod: Zaznacz cały

void __fastcall TBabelForm
::ListBox1DrawItem(TWinControl *Controlint Index,
          
TRect &RectTOwnerDrawState State)
{
 if(
State.Contains(odSelected))
 {
  
dynamic_cast<TListBox *>(Control)->Canvas->Brush->Color = (TColor)0x002FA3FF;
  
dynamic_cast<TListBox *>(Control)->Canvas->Font->Color clMaroon;
 }

 
dynamic_cast<TListBox *>(Control)->Canvas->FillRect(Rect);

 
String lText dynamic_cast<TListBox *>(Control)->Items->Strings[Index];

 
TRect dRect Rect;
 
dRect.Left  Rect.Left  3;
 
dRect.Right Rect.Right 3;

 
DrawTextdynamic_cast<TListBox *>(Control)->Canvas->Handle,
           
lText.t_str(),
           -
1,
           &
dRect,
           
DT_LEFT DT_VCENTER DT_END_ELLIPSIS);
}
 
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 5 gości