2009-11-02 1 views
2

У меня есть потомок TListView, который предлагает некоторые дополнительные функции, такие как сортировка и возможность загрузки себя из TDataset. Теперь я хочу расширить этот компонент, чтобы некоторые аспекты чертежа могли быть указаны в элементах времени, добавленных в представление списка.Пользовательский чертеж в потоковом потоке TListview

У меня возникли проблемы с выяснением, какая процедура или процедуры переопределить, чтобы взять управление чертежом. Я переопределил DrawItem, чтобы изменить стиль шрифта, чтобы включить зачеркивание, а затем вызвать унаследованный DrawItem. Если я также укажу стиль LVS_OWNERDRAWFIXED (в переопределенном CreateParams()), моя функция вызывается и работает так, как я хочу, за исключением того, что рисуется только элемент, а не подэлементы.

Кто-нибудь знает, как я могу рассказать в виде списка, чтобы нарисовать подэлементы? Я нашел one example существенно расширенного списка, но этот документ недостаточно хорошо документирован для того, чтобы я точно следил за тем, что происходит, и я надеюсь не перехватывать столько сообщений о событиях и окон, сколько этот делает - мне кажется, что просто установка ручек, кисти и шрифта, а затем наличие элемента рисунка не должно быть настолько вовлечено.

Вот что я до сих пор:

protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    procedure DrawItem(Item: TListItem; Rect: TRect; State: TOwnerDrawState); override; 

procedure TLookupListView.CreateParams(var Params: TCreateParams); 
begin 

    inherited CreateParams(Params); 

    Params.Style := Params.Style or lvs_OwnerDrawFixed; 

end; 

procedure TLookupListView.DrawItem(Item: TListItem; Rect: TRect; State: TOwnerDrawState); 
var I: Integer; 
    Left: Integer; 
begin 

    Canvas.Font.Style := Canvas.Font.Style + [fsStrikeOut]; 
    inherited DrawItem(Item, Rect, State); 
    //I know the canvas must be restored here, this is just for proof-of-concept. 

end; 

ОБРАТИТЕ ВНИМАНИЕ: Я не заинтересован в этом пользовательский рисунок в конкретном экземпляре TListView с помощью прилагаемых событий. Я знаю, как это сделать. Я пытаюсь «испечь» эту функцию своему пользовательскому компоненту TListview.

ответ

2

Компонент имеет виртуальный метод IsCustomDrawn(), который вызывается для определения того, какие коды кода должны быть выполнены. В реализации базового класса он проверяет, назначен ли какой-либо из обработчиков событий для рисования подэлементов, но вы можете переопределить метод для возврата True для всех тех этапов рисования, которые вы хотите обработать, даже если назначенный обработчик не назначен.

Если вы хотите обрабатывать все в коде, вы, вероятно, должны переопределить CustomDrawItem() и CustomDrawSubItem() и сделать все. Чтобы все было занято, я бы построил приложение с отладчиками DCU, перешел в обработчики событий и посмотрел вокруг, с чем минимальная сумма кода, с которой вы можете справиться. Важным методом проверки является TCustomListView.CNNotify() - здесь обрабатываются сообщения Windows для чертежа владельца.

Edit:

Я забыл добавить, что вы должны стараться не владелец сделать текст в элементе управления, но только, чтобы установить свойства холста на различных стадиях краски - по причине того, что в противном случае вы будете иметь чтобы текст был идеальным для всех версий Windows, что не соответствует VCL. Вы можете увидеть это, добавив несколько столбцов и строк в представление списка и переключив свойство OwnerDraw во время разработки, текст перескакивает.

+0

Спасибо mghie. На самом деле я стараюсь не рисовать текст самостоятельно, как для подписи, так и для подтитов. CustomDrawItem и CustomDrawSubItem выглядят так, как я хочу. Я расследую дальше. , , –

+0

Правильно, возможно, вы даже можете удалить флаг стиля «LVS_OWNERDRAWFIXED», поскольку уведомления о стадии рисования не (все) зависят от него. – mghie

+0

Да, мне не нужен LVS_OWNERDRAWFIXED.Сейчас у меня есть (видимо) работа, не внесенные никакими другими изменениями, кроме переопределения IsCustomDrawn и CustomDrawItem (изменения холста в CustomDrawItem остаются в силе через рисунок подтипов). Я думаю, что все, что у меня осталось, - это гарантировать, что любые пользовательские события для пользовательского чертежа не будут проигнорированы. –

1

В какой версии Delphi вы используете? В Delphi 2007 TListView поддерживает пользовательский чертеж, обрабатывая сообщения NM_CUSTOMDRAW, как описано here. В TListView уже определены события для подтипов пользовательского рисования, а также виртуальные методы, которые вы можете переопределить в своем потомке.

+0

D2007, и я хочу скоро переместить это в D2010. Я проверю ссылку, большое спасибо. –

Смежные вопросы