Форум: "Прочее";
Текущий архив: 2014.12.21;
Скачать: [xml.tar.bz2];
ВнизCustomDrawTreeView.pas Найти похожие ветки
← →
Лактоза (2014-05-21 13:29) [0]Друзья, поделитесь файликом, а то у меня не находится. Говорят, что в 2007 он лежи здесь:
Users\Public\Documents\RAD Studio\5.0\Demos\DelphiWin32\VCLWin32\CustomDraw\CustomDrawTreeView.pas
Можно всю демку, даже желательнее.
Спасибо.
← →
MBo © (2014-05-21 13:56) [1]демки теперь лежат тут:
http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/
но в том наборе, что у меня скачан, CustomDraw нет
какой-то пример есть в онлайн-хелпе
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ComCtrls_TTreeView_OnCustomDrawItem.html
← →
Лактоза (2014-05-21 14:03) [2]Этот код я нашел, меня непосредственно интересовали эти строки:
DrawButton(NodeRect, Node); // See the CustomDraw demo
DrawImage(NodeRect, Node.ImageIndex); // See the CustomDraw demo
← →
Игорь Шевченко © (2014-05-21 14:15) [3]
procedure TCustomDrawForm.DrawButton(ARect: TRect; Node: TTreeNode);
var
cx, cy: Integer;
begin
cx := ARect.Left + TV.Indent div 2;
cy := ARect.Top + (ARect.Bottom - ARect.Top) div 2;
with TV.Canvas do
begin
Pen.Color := ButtonColorDialog.Color;
//draw horizontal line.
if Node.HasChildren then
begin
PenPos := Point(cx+FButtonSize, cy);
LineTo(ARect.Left + TV.Indent + FButtonSize, cy);
end else
begin
PenPos := Point(cx, cy);
LineTo(ARect.Left + TV.Indent + FButtonSize, cy);
end;
//draw half vertical line, top portion.
PenPos := Point(cx, cy);
LineTo(cx, ARect.Top-1);
if ((Node.GetNextVisible <> nil) and (Node.GetNextVisible.Level = Node.Level))
or (Node.GetNextSibling <> nil) then
//draw bottom portion of half vertical line.
begin
PenPos := Point(cx, cy);
LineTo(cx, ARect.Bottom+1);
end;
if Node.HasChildren then
begin
//Let"s try a circular button instead
Ellipse(cx-FButtonSize, cy-FButtonSize, cx+FButtonSize, cy+FButtonSize);
//draw the horizontal indicator.
PenPos := Point(cx-FButtonSize+2, cy);
LineTo(cx+FButtonSize-2, cy);
//draw the vertical indicator if the node is collapsed
if not Node.Expanded then
begin
PenPos := Point(cx, cy-FButtonSize+2);
LineTo(cx, cy+FButtonSize-2);
end;
end;
//now connect vertical lines of higher level nodes.
Node := Node.Parent;
while Node <> nil do
begin
cx := cx - TV.Indent;
if Node.GetNextSibling <> nil then
begin
PenPos := Point(cx, ARect.Top);
LineTo(cx, ARect.Bottom);
end;
Node := Node.Parent;
end;
end;
end;
procedure TCustomDrawForm.DrawImage(NodeRect: TRect; ImageIndex: Integer);
var
cy: Integer;
begin
cy := NodeRect.Top + (NodeRect.Bottom - NodeRect.Top) div 2;
//center image in NodeRect.
ImageList.Draw(TV.Canvas, NodeRect.Left, cy - TV.Images.Height div 2,
ImageIndex, True);
end;
← →
Лактоза (2014-05-21 14:30) [4]Спасибо.
← →
Лактоза (2014-05-21 14:50) [5]Интересно, что брошенный на форму тривью и имаджлист, связанные через TreeView.images и заполненное само дерево. Дают AV, т.к. на момент DrawImage ImageList = nil
Получается, что прорисовка начинается еще до создания всей формы. Кто-то там в генофонде накалокодил. Если поставить проверку на нил, то все нормально отрабатывает.
← →
junglecat (2014-05-21 15:58) [6]> прорисовка начинается еще до создания всей формы
до создания имиджлиста еще может. Но никак не формы
← →
Лактоза (2014-05-21 16:39) [7]Я имел в виду по полного создания формы до момента оншоу. Т.к. в конструкторе формы происходит создание контролов и компонентов на ней лежащих. И, видимо, в момент создания тривью, когда еще не создан имаджлист и происходит вызов его прорисовки. Я не копался, мне по большому счету всеравно, но либо кто-то принудительно вызывает перерисовку при создании, либо одно из двух.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2014.12.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c