Форум: "KOL";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];
ВнизПример 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 вся ветка
Форум: "KOL";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c