Delphi Не прорисовывается компонент.

программирование Delphi делфи

Подскажите пожалуйста, что делаю не так.
Нужно перерисовать TreeNode так, чтоб он отобразился как кнопка.

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; var DefaultDraw: Boolean);
var
WDc: HDc;
R: TRect;
begin
WDc := GetWindowDc(Node.Handle);
GetBoundsRect(WDc, R, 0);
DrawFrameControl(WDc, R, DFC_BUTTON, DFCS_BUTTON3STATE);
ReleaseDc(Node.Handle, WDc);
end;

Примечание:
Неужели никто не подскажет.
Я никогда не пытался изменять внешний вид компонентов и если честно почти ничего не понимаю в этом коде, я его из интернета содрал, правда там рисовали четвёртую кнопку у окна.
Ответы:
1) в GetWindowDc нет необходимости HDC можно получить из Sender.Canvas.Handle
2) GetBoundsRect тоже не нужен, т.к. отрисовываем только один нод - можно использовать Node.DisplayRect(True)
3) лучше обрабатывать событие OnAdvancedCustomDrawItem так:
//код использует Vcl.Themes
procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
 Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
 var PaintImages, DefaultDraw: Boolean);
var
 Details: TThemedElementDetails;
 r: trect;
begin
 if Stage = cdPostPaint then
 begin
   if cdsHot in State then
     Details := StyleServices.GetElementDetails(tbPushButtonHot)
   else if cdsFocused in State then
     Details := StyleServices.GetElementDetails(tbPushButtonDefaulted)
   else if cdsDisabled in State then
     Details := StyleServices.GetElementDetails(tbPushButtonDisabled)
   else
     Details := StyleServices.GetElementDetails(tbPushButtonNormal);
   r := Node.DisplayRect(True);
   OffsetRect(r, -2, 0);
   r.Width := r.Width + 4;
   StyleServices.DrawElement(Sender.Canvas.Handle, Details, r);
   StyleServices.DrawText(Sender.Canvas.Handle, Details, Node.Text, r,
     TTextFormatFlags(DT_Center or DT_END_ELLIPSIS), Sender.Canvas.Font.Color);
   DefaultDraw := False;
   PaintImages := True;
 end
 else
 begin
   PaintImages := True;
   DefaultDraw := True;
 end;
end;


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.