Форум: "KOL";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];
ВнизКак изменить цвет выделенного элемента в TKolTreeView ? Найти похожие ветки
← →
gsv (2004-12-18 19:26) [0]Помогите, плз, разобраться со следующей вещью.
Возможно ли каким-нибудь образом изменить цвет и фон выделенного
элемента для TKolTreeView ? Попробовал включить в самое начало обработчика WndProcTreeView следующий фрагмент, но что-то никакой реакции :(
NMHdr := Pointer( Msg.lParam );
if (NMHdr.code = NM_CUSTOMDRAW) then begin
NMCustDraw := Pointer( Msg.lParam );
if LongBool( NMCustDraw.dwDrawStage and CDDS_ITEM ) then begin
TmpItem.hItem := NMCustDraw.dwItemSpec;
if Self_.TVItemSelected[TmpItem.hItem] then begin
Self_.Canvas.Brush.Color:=clYellow;
end;
end;
Result:=true;
exit;
end; Заранее благодарю за помощь.
ps. Использую D6, KOL версии 1.95, MCK версии 1.90 ( режим PAS_VERSION ),
если это важно.
← →
z007 (2004-12-18 23:44) [1]Это рисуется почти как в CustomDraw из Demos от Delphi. совсем чуть-чуть изменений.
← →
Gandalf © (2004-12-19 16:46) [2]Так пашет или нет?
← →
gsv (2004-12-19 19:20) [3]To z007 :
Посмотрел я пример CustomDraw из каталога Demos. Но ведь там, насколько
я понял, используется обработчик TVCustomDrawItem, который в KOL отсутствует.
Вот каким образом получить к нему доступ ?... Во всяком случае попытка добавления
в оконную функцию TKOlTreeView вышеуказанной процедуры ни к чему не приводит.
← →
z007 (2004-12-20 23:01) [4]Если там есть такое событие, значит оно к чему-то привязано. Не так ли?
Посмотри код - точно найдешь.
У меня, кажется, где-то был пример на Kol (я, правда, там так и не доделал полосу прокрутки).
← →
gsv (2004-12-22 21:28) [5]To z007 :
На данный момент застрял на следующем : в comctrls.pas ( \SOURCE\VCL ) для
обработки TVCustomDrawItem есть такой фрагмент :// восстановление текущего фонта и удаление фонта, который был выделен
// на предыдущем этапе
if (dwDrawStage and CDDS_ITEMPOSTPAINT <> 0) and
(FOurFont + FStockFont <> 0) then begin
SelectObject(hdc, FStockFont);
DeleteObject(FOurFont);
FOurFont := 0;
FStockFont := 0;
end;
try
// в качестве атрибутов канвы используются атрибуты TCustomTreeView
FCanvas.Handle := hdc;
FCanvas.Font := Font;
FCanvas.Brush := Brush;
// если рисуемый Item является текущим, то устанавливаем для него по умолчанию
// требуемые цвета текста и фона
if uItemState and CDIS_SELECTED <> 0 then begin
FCanvas.Font.Color := clHighlightText;
FCanvas.Brush.Color := clHighlight;
end;
// обработчик CanvasChanged просто устанавливает флаг FCanvasChanged в True,
// если внутри процедуры CustomDrawItem произошло изменение Canvas.Font
// или Canvas.Brush
FCanvas.Font.OnChange := CanvasChanged;
FCanvas.Brush.OnChange := CanvasChanged;
FCanvasChanged := False;
// в следующей строке вызываем уже наш обработчик OnTVCustomDrawItem
// возвращаемое значение -- использовать ли рисование по умолчанию. Возвращаем
// True, чтобы не перерисовывать всё полностью.
DefaultDraw := CustomDrawItem(Node,
TCustomDrawState(Word(uItemState)), cdPrePaint, PaintImages);
if not PaintImages then
Result := Result or TVCDRF_NOIMAGES;
if not DefaultDraw then
Result := Result or CDRF_SKIPDEFAULT
// вот самый интересный момент...
else if FCanvasChanged then begin
// сбрасываем обработчики, отслеживающие изменение фонта и кисти внутри
// CustomDrawItem
FCanvasChanged := False;
FCanvas.Font.OnChange := nil;
FCanvas.Brush.OnChange := nil;
// если изменения были, то создаем новый фонт (fOurFont) c параметрами,
// которые мы изменили внутри CustomDrawItem и замещаем им текущий
with PNMTVCustomDraw(NMHdr)^ do begin
clrText := ColorToRGB(FCanvas.Font.Color);
clrTextBk := ColorToRGB(FCanvas.Brush.Color);
if GetObject(FCanvas.Font.Handle, SizeOf(LogFont), @LogFont) <> 0 then
begin
FCanvas.Handle := 0;
FOurFont := CreateFontIndirect(LogFont);
FStockFont := SelectObject(hdc, FOurFont);
Result := Result or CDRF_NEWFONT;
end;
end;
end;
if IsCustomDrawn(dtItem, cdPostPaint) then
Result := Result or CDRF_NOTIFYPOSTPAINT;
finally
FCanvas.Handle := 0;
end;
Так вот эти манипуляции с канвой ( созданием нового шрифта и замещение им
текущего ) почему-то не проходят в KOL. То есть при отрисовке компонента
TKolTreeView создается новая канва, что ли ? ... Ничего не понимаю. Каким образом
можно передать из нашего обработчика CustomDrawItem измененные атрибуты канвы
этого самого TKolTreeView, чтобы они повлияли на отрисовку последнего ?
← →
z007 (2004-12-28 01:22) [6]Я пока в такие детали не вдавался.
Ограничился тем, что на OnPaint полностью перерисовывал видимую часть дерева.
Насчет передать измененные атрибуты канвы - так вот сходу не могу сообразить: дай начало и конец процедуры, которую тут привел, откуда она вызывается, какие параметры - там, наверное должен быть hdc?
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.218 c