Verwijderd schreef op 25 June 2003 @ 08:23:
waarom niet gewoon die node.text gebruiken? Je kunt met .canvas.textwidt(text) de breedte van je tekst opvragen in pixels. Dan even truncen op de juiste lengte en zetten in node.text..
Hmm ja dat zou natuurlijk kunnen. Ik heb 't geprobeerd maar op de een of andere manier wordt het lettertype ineens heel groot terwijl ik daar geen properties van verander. Als ik voor de functie het font even in een temp variabele zet en na afloop weer terugzet lost dat ook niets op.
Zo issie als ik de hele functie comment: (let ook op de trails terwijl die repaints uit staan nu)
Als ik de functie uncomment worden de fonts ineens veel groter. De textwidth wordt wel met de originele fontmaten gemeten; dat heb ik gecontroleerd. Hij maakt er dit van:
De tekstafbreking werkt verder prima. Als ik de maximale breedte op 100 pixels zet maakt hij er dit van:
Stukje code... (sorry voor de layoutverneuking

)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| procedure TMainForm.UsertreeCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
maxWidth, currentWidth, i: integer;
username: string;
tempFont: TFont;
begin
tempFont := Sender.Canvas.Font;
if Node.Parent = nil then exit; // zelfde verhaal, root vergeten we ff
maxWidth := 100; //Sender.Width - Node.DisplayRect(true).Left;
username := TUser(Node.Data).Get_treeviewname;
currentWidth := Sender.Canvas.TextWidth(username);
while (currentWidth > maxWidth) and (Length(username) > 0) do
begin
{-------- Alleen een puntje? Dan wordt 't een lege zin --------}
if username = '.' then
username := ''
else
{-------- 2 puntjes? Dan wordt 't 1 puntje. --------}
if username = '..' then
username := '.'
else
{-------- 3 puntjes? Dan worden het 2 puntjes. --------}
if username = '...' then
username := '..'
else
{-------- 3 puntjes aan het einde? Dan inkorten. --------}
if (Length(username) > 3) and (Copy(username, Length(username) - 2, 3) = '...') then
username := Copy(username, 1, Length(username) - 4) + '...'
else
{-------- Naam korter dan 4 letters? Dan alles omzetten in puntjes. --------}
if Length(username) < 4 then
for i := 1 to Length(username) do
username[i] := '.'
else
{-------- Anders gewoon laatste 3 vervangen door puntjes --------}
username := Copy(username, 1, Length(username) - 3) + '...';
currentWidth := Sender.Canvas.TextWidth(username);
end;
Node.Text := username;
Sender.Canvas.Font := tempFont; // font-debug-ding
end; |
Ben ik nou zo achterlijk?

Zelfs als ik het font bewaar en terugzet dandandan blijven die letters groot!
Aan die OnHitTest en NodeAt functies heb ik niet zoveel als ik met DrawText ga werken. De tekst wordt afzonderlijk getekend door DrawText en daar is de TreeView niet van op de hoogte. Die zal dus ook niet aangeven dat er een node zit waar je klikt. Dat is opgelost als ik de tekst alsnog in Node.Text zet en DefaultDraw op false zet, maar dan verschijnt de scrollbar nog steeds.
Ik denk dat ik de coordinaten van alle rects maar in een list donder en dan de coordinaten van de OnMouseDowns maar vergelijk met die in de list. Kan me niet voorstellen dat MS het ook zo heeft opgelost in hun Messenger, maarja. Als 't maar werkt he...