-
Hello, Дайте пример для OnDrawCell для KOLmdvXLGrid, пожалуйста.
Вообще мне нужно в каждой ячейке отрисовать PBitmap, и правее него вывести оригинальный текст ячейки. Хелп мии ;)
-
???????? 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;
-
???????? 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;
-
первый пост как-то случайно добавился. Смотреть второй.
-
Не получается своя отрисовка в 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 не пробовал.
-
> Не получается своя отрисовка в TreeListEdit. Вот код из > тестовой программки:
А что не получается? конкретно?
> Пиктограммы и текст отрисовываются нормально, но узлы выделяются > только если щелкать мышкой на пиктограмме, а не на тексте. > Правая кнопка реагирует нормально при включенном TVRightClickSelect.
А что подразумевается под выделением узла? и что такое пиктограмма, ваш битмап, который рисуете?
> И еще - когда встроил примерно такой код в работающий проект > - пошла двойная отрисовка - стандартная и своя одновременно.
С чего вы сделали такой вывод?
-
Под выделением узла я подразумевал переход в активное состояние (TVSelected). А проверял по OnSelChange. Нажимаю левой кнопкой на пиктограмму - переходит, на текст - нет. Причем при включенном TVRightClickSelect правая кнопка отрабатывает нормально - и на пиктограмме и на тексте. Фон на выделенном узле меняется только под пиктограммой, фон текста какой был, такой и остается. Под пиктограммой я имел ввиду этот же битмап. Это все по тестовому примеру, который выше привел. Здесь текст отрисовывается только один раз, только с выделением проблема. Вторая проблема - когда этот код вставил в рабочий проект, появилась двойная отрисовка текста - с отступом, как и должно быть, и без отступа. Текст, который без отступа, виден как под пиктограммой, так и в промежутке между пиктограммой и нормальным текстом. Поэтому такое мнение, что текст отрисовывается сначала стандартно, а потом в DrawCell. Причем выделяется фоном стандартный текст. Здесь уже пиктограмму рисовал и битмапами, и ImageList.Draw, убирал TLECellAdjust - думал, вдруг из-за нее стандартная отрисовка сработывает, хотя там только цветом оперирую. ImageList с привязкой к TLE тоже убирал. C входящим параметром DC оперировал, канву создавал. Параметры все те же, что и в тестовом примере. Ничего не помогает. Не понимаю, где туплю.
-
> А проверял по OnSelChange.
Есть OnTVSelChanging
> Фон на выделенном узле меняется только под пиктограммой, > фон текста какой был, такой и остается.
Ну так закрасьте нужным цветом. Вы же берете на себя функцию отрисовки ячейки, вот и рисуйте в зависимости от состояния (ItemState).
> Вторая проблема - когда этот код вставил в рабочий проект, > появилась двойная отрисовка текста - с отступом....
Ну, не знаю, пришлите мин. проект, где не работает, так сложно сказать.
-
OnTVSelChanging - аналогично. Срабатывает только на пиктограмме либо по правой кнопке. function TForm1.mTreeTVSelChanging(Sender: PControl; oldItem, newItem: THandle ): Boolean;
begin
msgok(mTree.Cells[newitem,0]);
result:=true;
end;
-
Короче, уменя все работает.:))) Присылайте проект и укажите что и где не работает, а то какой-то дурной разговор получается.
-
Отвечу здесь на письмо. 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?
|