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

Вниз

Пример OnDrawCell   Найти похожие ветки 

 
Trible   (2007-09-28 14:34) [0]

Hello,
Дайте пример для OnDrawCell для KOLmdvXLGrid, пожалуйста.

Вообще мне нужно в каждой ячейке отрисовать PBitmap, и правее него вывести оригинальный текст ячейки. Хелп мии ;)


 
mdw ©   (2007-09-28 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 ©   (2007-09-28 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 ©   (2007-09-28 16:56) [3]

первый пост как-то случайно добавился. Смотреть второй.


 
finder2007 ©   (2007-10-23 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 ©   (2007-10-23 12:13) [5]


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

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

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

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

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

С чего вы сделали такой вывод?


 
finder2007   (2007-10-23 14:29) [6]

Под выделением узла я подразумевал переход в активное состояние (TVSelected). А проверял по OnSelChange. Нажимаю левой кнопкой на пиктограмму - переходит, на текст - нет. Причем при включенном TVRightClickSelect правая кнопка отрабатывает нормально - и на пиктограмме и на тексте. Фон на выделенном узле меняется только под пиктограммой, фон текста какой был, такой и остается. Под пиктограммой я имел ввиду этот же битмап. Это все по тестовому примеру, который выше привел. Здесь текст отрисовывается только один раз, только с выделением проблема.
Вторая проблема - когда этот код вставил в рабочий проект, появилась двойная отрисовка текста - с отступом, как и должно быть, и без отступа. Текст, который без отступа, виден как под пиктограммой, так и в промежутке между пиктограммой и нормальным текстом. Поэтому такое мнение, что текст отрисовывается сначала стандартно, а потом в DrawCell. Причем выделяется фоном стандартный текст. Здесь уже пиктограмму рисовал и битмапами, и ImageList.Draw, убирал TLECellAdjust - думал, вдруг из-за нее стандартная отрисовка сработывает, хотя там только цветом оперирую. ImageList с привязкой к TLE тоже убирал. C входящим параметром DC оперировал, канву создавал. Параметры все те же, что и в тестовом примере. Ничего не помогает. Не понимаю, где туплю.


 
mdw ©   (2007-10-23 14:52) [7]


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

Есть OnTVSelChanging

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

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

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

Ну, не знаю, пришлите мин. проект, где не работает, так сложно сказать.


 
finder2007   (2007-10-23 15:16) [8]

OnTVSelChanging - аналогично. Срабатывает только на пиктограмме либо по правой кнопке.
function TForm1.mTreeTVSelChanging(Sender: PControl; oldItem, newItem: THandle ): Boolean;
begin
msgok(mTree.Cells[newitem,0]);
result:=true;
end;              


 
mdw ©   (2007-10-23 16:28) [9]

Короче, уменя все работает.:)))
Присылайте проект и укажите что и где не работает, а то какой-то дурной разговор получается.


 
mdw ©   (2007-10-23 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?



Страницы: 1 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.012 c
15-1216609884
Пломба
2008-07-21 07:11
2008.09.07
Printer selected is not valid


2-1216942953
Ruzzz
2008-07-25 03:42
2008.09.07
Что-то типа хеша


2-1217413081
Alexey
2008-07-30 14:18
2008.09.07
Переименование файла


2-1217352003
werty
2008-07-29 21:20
2008.09.07
определение границ ланных в Excel


2-1215238577
Владимир
2008-07-05 10:16
2008.09.07
Работа с ADOQuery