TTreeView - źle rysują się itemy

0

Witam,

co za szitowaty problem...
Jest sobie TTreeView. Dodaję mu itemy na żywo:

TTreeNode * kp_node = 0, * kp_node2 = 0;

 kp_node = TVRSS->Items->Add(0, "jeden");
 TVRSS->Items->AddChild(kp_node, "jeden 1");
 TVRSS->Items->AddChild(kp_node, "jeden 2");

 kp_node = TVRSS->Items->Add(0, "dwa");
 kp_node2 = TVRSS->Items->AddChild(kp_node, "dwa 1");
 TVRSS->Items->AddChild(kp_node, "dwa 2");
 kp_node = TVRSS->Items->AddChild(kp_node2, "dwa 1 1");
 kp_node2 = TVRSS->Items->AddChild(kp_node, "dwa 1 1 1");

Obsługuję tylko OnCustomDrawItem:

 void __fastcall TFRoot::TVRSSCustomDrawItem(TCustomTreeView *Sender, TTreeNode *Node,
          TCustomDrawState State, bool &DefaultDraw)
{
	int i_posX = GetScrollPos(TVRSS->Handle, SB_HORZ);

	TRect tagRectDraw = Node->DisplayRect(false);
	TRect tagRectTxt = Node->DisplayRect(true);

	if((tagRectDraw.Top + (tagRectDraw.Bottom - tagRectDraw.Top) / 2 - 8) < 0){

		TVRSS->Canvas->TextOutA(-i_posX + Node->Level * TVRSS->Indent + 18,
					tagRectDraw.top + (tagRectDraw.bottom - tagRectDraw.top) / 2 - TVRSS->Canvas->TextHeight(Node->Text) / 2,	IntToStr((int)tagRectDraw.top) + " " + IntToStr((int)tagRectDraw.bottom));

	}else

	TVRSS->Canvas->TextOutA(-i_posX + Node->Level * TVRSS->Indent + 18,
					tagRectDraw.Top + (tagRectDraw.Bottom - tagRectDraw.Top) / 2 - TVRSS->Canvas->TextHeight(Node->Text) / 2,	Node->Text);

	DefaultDraw = false;
}

Nie rysuję tu przycisków rozwijających i zwijających, żeby nie zaciemniać.
I efekt jest taki, że przy pierwszym rozwinięciu elementów "dwa 1" i "dwa 1 1" tekst i ewentualny obraz buttona rysowany jest nad pierwszym itemem oraz na prawidłowej pozycji. Zrobiłem warunek sprawdzający i wychodzi na to, że tagRectDraw jest wyzerowany.
Wygląda to tak:

user image

W czym ma ślepota się objawia?

0

DisplayRect zwraca ci prostokąt już z uwzględnieniem pozycji scrolla

0

Nie zwraca. Sprawdzałem. Scroll to w sumie malusie zmatrwienie w tym całym cholerstwie :]

0

To zawsze (bez warunku) rysuj tak:

TVRSS->Canvas->TextOutA(-i_posX + Node->Level * TVRSS->Indent + 18,(tagRectDraw.Top + tagRectDraw.Bottom - TVRSS->Canvas->TextHeight(Node->Text)) / 2, Node->Text);
0

Warunek dałem tylko po to, żeby sprawdzić sobie wartości top i bottom. Bez niego, w miejscach "0 0" wypisywany jest dubel Noda. I ten dubel jest tu problemem. CZEMU RECT JEST WYZEROWANY??

0

Może problemem jest ShowRootNode=false ?

0

ShowRoot jest na True. Na razie zrobiłem głupie obejście sprawdzając czy top i bottom równają się 0 i wtedy nie wypisuję tekstu. Uchhhhh...

0

No właśnie w tym masz problem. Ma być ShowRoot = false.

0

Coś mi się wydaję, że sobie strzelasz. To nie jest problemem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1