Конференция "KOL" » Пример OnDrawCell
 
  • Trible (28.09.07 14:34) [0]
    Hello,
    Дайте пример для OnDrawCell для KOLmdvXLGrid, пожалуйста.

    Вообще мне нужно в каждой ячейке отрисовать PBitmap, и правее него вывести оригинальный текст ячейки. Хелп мии ;)
  • mdw © (28.09.07 16:50) [1]
    ????????
    procedure TMainForm.XLGridDrawCell(Sender: PControl; ACol, ARow: Integer;
     ACell: PmdvXLCell; ACanvas: PCanvas; ARect: TRect; ASelected,
     AFocused: Boolean; var Access: Boolean);
    begin
       Access:= True;
    //как-то получаем битмап Bmp: PBitmap
    ......

       Bmp.StretchDraw(

       if Access then begin
         if not AFocused then begin
           ACanvas.Brush.Color:= clYellow;
           ACanvas.Brush.BrushStyle:= bsSolid;
           ACanvas.FillRect(ARect);
           ACanvas.Pen.Color:= clRed;
           ACanvas.Pen.PenWidth:= 1;
           ACanvas.Pen.PenMode:= pmCopy;
           ACanvas.Brush.BrushStyle:= bsClear;
           ACanvas.Rectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
           ACanvas.Font.Color:= clNavy;
         end;
         ACanvas.DrawText('C='+Int2Str(ACol)+'  R='+Int2Str(ARow), ARect, DT_WORDBREAK or DT_CENTER);
       end;
    end;
  • mdw © (28.09.07 16:55) [2]
    ????????
    procedure TMainForm.XLGridDrawCell(Sender: PControl; ACol, ARow: Integer;
     ACell: PmdvXLCell; ACanvas: PCanvas; ARect: TRect; ASelected,
     AFocused: Boolean; var Access: Boolean);
    begin
       Access:= True;
    //как-то получаем битмап Bmp: PBitmap
    ......

       Bmp.Draw(ACanvas.Handle, ARect.Left+2, ARect.Top + (ARect.Bottom-ARect.Top - Bmp.Height) div 2);
       ARect.Left:= ARect.Left + 4 + Bmp.Width;
       ACanvas.DrawText('Ваш текст', ARect, DT_SINGLELINE or DT_LEFT or DT_VCENTER);

    end;
  • mdw © (28.09.07 16:56) [3]
    первый пост как-то случайно добавился. Смотреть второй.
  • finder2007 © (23.10.07 02:37) [4]
    Не получается своя отрисовка в TreeListEdit. Вот код из тестовой программки:
    function TForm1.mTreeTLEDrawCell(Sender: PControl; DC: HDC; Rect: TRect; AItem: THandle; ACol: Integer; ItemState: TDrawState): Boolean;
    var BMP:pBitmap;
    begin
    BMP:=NewBitMap(0,0);
    BMP.LoadFromResourceName( hInstance,'MY_BMP_RES');
     if ACol=0 then
      begin
       Bmp.Draw(mTree.Canvas.Handle, Rect.Left+2, Rect.Top + (Rect.Bottom-Rect.Top - Bmp.Height) div 2);
       Rect.Left:= Rect.Left + 4 + Bmp.Width;
      end;
    mTree.Canvas.DrawText(mTree.Cells[AItem,ACol], Rect, DT_SINGLELINE or DT_LEFT or DT_VCENTER);
    BMP.Free;
    result:=true;
    end;                      


    Пиктограммы и текст отрисовываются нормально, но узлы выделяются только если щелкать мышкой на пиктограмме, а не на тексте. Правая кнопка реагирует нормально при включенном TVRightClickSelect.
    И еще - когда встроил примерно такой код в работающий проект - пошла двойная отрисовка - стандартная и своя одновременно. Свойства TreeListEdit те же, думал влияет TLECellAdjust - удалил, все по прежнему. Подскажите, где копать?
    Делал в Lazarus, на Delphi не пробовал.
  • mdw © (23.10.07 12:13) [5]

    > Не получается своя отрисовка в TreeListEdit. Вот код из
    > тестовой программки:

    А что не получается? конкретно?

    > Пиктограммы и текст отрисовываются нормально, но узлы выделяются
    > только если щелкать мышкой на пиктограмме, а не на тексте.
    >  Правая кнопка реагирует нормально при включенном TVRightClickSelect.

    А что подразумевается под выделением узла? и что такое пиктограмма, ваш битмап, который рисуете?

    > И еще - когда встроил примерно такой код в работающий проект
    > - пошла двойная отрисовка - стандартная и своя одновременно.

    С чего вы сделали такой вывод?
  • finder2007 (23.10.07 14:29) [6]
    Под выделением узла я подразумевал переход в активное состояние (TVSelected). А проверял по OnSelChange. Нажимаю левой кнопкой на пиктограмму - переходит, на текст - нет. Причем при включенном TVRightClickSelect правая кнопка отрабатывает нормально - и на пиктограмме и на тексте. Фон на выделенном узле меняется только под пиктограммой, фон текста какой был, такой и остается. Под пиктограммой я имел ввиду этот же битмап. Это все по тестовому примеру, который выше привел. Здесь текст отрисовывается только один раз, только с выделением проблема.
    Вторая проблема - когда этот код вставил в рабочий проект, появилась двойная отрисовка текста - с отступом, как и должно быть, и без отступа. Текст, который без отступа, виден как под пиктограммой, так и в промежутке между пиктограммой и нормальным текстом. Поэтому такое мнение, что текст отрисовывается сначала стандартно, а потом в DrawCell. Причем выделяется фоном стандартный текст. Здесь уже пиктограмму рисовал и битмапами, и ImageList.Draw, убирал TLECellAdjust - думал, вдруг из-за нее стандартная отрисовка сработывает, хотя там только цветом оперирую. ImageList с привязкой к TLE тоже убирал. C входящим параметром DC оперировал, канву создавал. Параметры все те же, что и в тестовом примере. Ничего не помогает. Не понимаю, где туплю.
  • mdw © (23.10.07 14:52) [7]

    >  А проверял по OnSelChange.

    Есть OnTVSelChanging

    > Фон на выделенном узле меняется только под пиктограммой,
    >  фон текста какой был, такой и остается.

    Ну так закрасьте нужным цветом. Вы же  берете на себя функцию отрисовки ячейки, вот и рисуйте в зависимости от состояния (ItemState).

    > Вторая проблема - когда этот код вставил в рабочий проект,
    >  появилась двойная отрисовка текста - с отступом....

    Ну, не знаю, пришлите мин. проект, где не работает, так сложно сказать.
  • finder2007 (23.10.07 15:16) [8]
    OnTVSelChanging - аналогично. Срабатывает только на пиктограмме либо по правой кнопке.
    function TForm1.mTreeTVSelChanging(Sender: PControl; oldItem, newItem: THandle ): Boolean;
    begin
    msgok(mTree.Cells[newitem,0]);
    result:=true;
    end;              

  • mdw © (23.10.07 16:28) [9]
    Короче, уменя все работает.:)))
    Присылайте проект и укажите что и где не работает, а то какой-то дурной разговор получается.
  • mdw © (23.10.07 18:35) [10]
    Отвечу здесь на письмо.
    1. Отрисовка. Битмап лучше один раз создать, а не при отрисовке каждой ячейки, но хозяин барин.

    function TForm1.mTreeTLEDrawCell(Sender: PControl; DC: HDC; Rect: TRect;
     AItem: THandle; ACol: Integer; ItemState: TDrawState): Boolean;
    begin
    BMP:=NewBitMap(0,0);
    BMP.LoadFromResourceName( hInstance,'MY_BMP_RES');

    if (odsSelected in ItemState)and(mTree.CurCol = ACol) then  mTree.Canvas.Brush.Color:= clHighlight
    else mTree.Canvas.Brush.Color:= clWindow;
    mTree.Canvas.FillRect(Rect);

    Bmp.Draw(mTree.Canvas.Handle, Rect.Left+2, Rect.Top + (Rect.Bottom-Rect.Top - Bmp.Height) div 2);

    Rect.Left:= Rect.Left + 4 + Bmp.Width;
    mTree.Canvas.DrawText(mTree.Cells[AItem,ACol], Rect, DT_SINGLELINE or DT_LEFT or DT_VCENTER);

    BMP.Free;
    result:=true;
    end;

    2. По поводу выделения\невыделения проверьте не включен ли SIMPLE_TREEVIEW?
 
Конференция "KOL" » Пример OnDrawCell
Есть новые Нет новых   [134431   +10][b:0][p:0.001]