Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.31;
Скачать: CL | DM;

Вниз

Как изменить цвет выделенного элемента в 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 вся ветка

Текущий архив: 2005.07.31;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.046 c
4-1117720650
DmitryShevelev
2005-06-02 17:57
2005.07.31
Delphi 6. Обработка ошибок в Graphics


1-1121287971
ANB
2005-07-14 00:52
2005.07.31
Как определить, по какому контроллу кликнули мышей ?


14-1120674661
Cheater
2005-07-06 22:31
2005.07.31
Подскажите какую-нибудь небольшую игрушку....


14-1120694921
vidiv
2005-07-07 04:08
2005.07.31
c++ под linux


10-1098286030
GanibalLector
2004-10-20 19:27
2005.07.31
"как бы" утечка ...