Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизРисование на канве mdwXLGrid Найти похожие ветки
← →
Dimaxx © (2005-04-10 22:09) [0]Собссно сабж, господа мастера!
Как отрисовать на его канве линии, а то при любом выводе на канву вызывается перерисовка ячеек и все нарисованное исчезает? А на VCL"овском можно было рисовать без проблем.
Автору вопрос отправил, но он пока молчит...
← →
<Falcon> (2005-04-11 12:54) [1]Можно попробовать рисовать на битмапе и выводить его в onDrawCell
в ячейках.
← →
Dimaxx © (2005-04-11 21:57) [2]Рисовать сначала на битмапе, а потом кусками выводить в ячейки не катит.
← →
<Falcon> (2005-04-12 11:39) [3]Как вариант:
Рисуй на канве грида, а для тех ячеек которые не должны перерисовываться - в onDrawCell установить Access:=True и рисуй наздоровье. Вот так например:
if (ACol<3) and(ARow<3) then
begin
Access:=True;
with ACanvas^ do
begin
Pen.Color:=clRed;
Pen.PenStyle:=psSolid;
Brush.Color:=clLime;
Brush.BrushStyle:=bsSolid;
FillRect(makerect(0,0,150,70));
MoveTo(10,10);
LineTo(50,50);
Font.Color:=clBlack;
TextOut(70,30,"Test");
end;
end
else Access:=False;
Недостаток - отрисовка "художеств" будет вызываться для каждой ячейки. Так что если рисование навороченное то может и притормаживать будет.
← →
mdw © (2005-04-12 18:25) [4]<Falcon> правильно говорит. Торможения быть не должно, т.к. рисуются не все, а только видимые ячейки.
← →
Dimaxx © (2005-04-12 23:07) [5]Спасибо, попробую. А то я сначала и не понял для чего этот Access нужен...
← →
Dimaxx © (2005-04-14 01:12) [6]Проверил... Нифига не работает!
Может для отдельной ячейки прокатит, но в моем случае не катит. Мне нужно соединять центры разных ячеек. Можно до рисования на кнве сделать BeginUpdate, а к конце рисования EndUpdate, но канва постоянно перерисовывается и получается мерцание.
← →
<Falcon> (2005-04-14 10:53) [7]Тогда вычисляй ячейки через которые будут проходить линии (а не только те, центры которых соединяешь) и для них объявляй Access:=True. И всего делов.
Только у меня вот сомнения, а нужно ли для таких вещей таблицу использовать? Может разграфи себе битмэпчик и на нем твори? Хотя я не знаю твою задачу...
Если рисуешь в onDrawCell, то BeginUpdate - EndUpdate смысла не вижу. А насчет мерцания, попробцй с DoubleBuffered поиграться.
← →
Dimaxx © (2005-04-14 23:30) [8]C DoubleBuffered играл - мерцание все равно есть, но меньше. Я уже думал насчет битмапа, но мне нужно двойным щелчком вызывать свойства "кубика", а также выделять их группами (удаление, изменение отдельных свойств). Поэтому городить код собственного выбора групп не имеет смысла - слишком громоздко и неудобно. Хотя если решения не найдется - придется рисовать самому.
mdw обещал посмотреть код VCL"овского грида - там нормально можно рисовать.
← →
Dimaxx © (2005-04-14 23:33) [9]Забыл добавить...
Я для эксперимента ВСЕ ячейки объявлял Access:=True. При отрисовке линий соединения они (линии) появлялись на долю секунды, а потом затирались. Хотя я рисую линии в OnDrawCell и по идее после перерисовки все должно опять отрисоваться. Но этого не происходит.
← →
ECM © (2005-04-15 10:56) [10]Для того чтобы побороть моргания и лишние перерисовки ...ИМХО..
(без DoubleBuffered особенно) нужно еще перекрыть обработку WM_ERASEBKGND... Можно попробовать там вообще ничего не рисовать, либо отрисовывать полностью тоже самое что и в WM_PAINT (вынести всю отрисовку в отд. процедуру например).
← →
thaddy (2005-04-15 11:17) [11]If the cells are not in the cliprect, don't update?
I use the canvas.cliprect wherever I can since it was added.
← →
thaddy (2005-04-15 11:18) [12]If the cells are not in the cliprect, don't update?
I use the canvas.cliprect wherever I can since it was added.
← →
<Falcon> (2005-04-16 18:59) [13]У меня все работает. ;-))
Вот код, если нужно, могу выслать демо-проект
Клацаем в первую ячейку, затем нажимаем контрол и клацаем по следующим ячейкам. Соединяем все линией. Отпускаем контрол - выбираем первую точку в следуюжей линии.
{ KOL MCK } // Do not remove this line!
{$DEFINE KOL_MCK}
unit test;
interface
{$IFDEF KOL_MCK}
uses Windows, Messages, ShellAPI, KOL, KOLmdvXLGrid {$IFNDEF KOL_MCK}, mirror, Classes, Controls, mckControls, mckObjs, Graphics,
MCKmdvXLGrid {$ENDIF};
{$ELSE}
{$I uses.inc}
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
{$ENDIF}
type
TSelCells = packed record
FirstCell: TPoint;
SndCell : TPoint;
end;
{$IFDEF KOL_MCK}
{$I MCKfakeClasses.inc}
{$IFDEF KOLCLASSES} TForm1 = class; PForm1 = TForm1; {$ELSE OBJECTS} PForm1 = ^TForm1; {$ENDIF CLASSES/OBJECTS}
{$IFDEF KOLCLASSES}{$I TForm1.inc}{$ELSE} TForm1 = object(TObj) {$ENDIF}
Form: PControl;
{$ELSE not_KOL_MCK}
TForm1 = class(TForm)
{$ENDIF KOL_MCK}
KOLProject1: TKOLProject;
KOLForm1: TKOLForm;
Grid1: TKOLmdvXLGrid;
procedure KOLForm1FormCreate(Sender: PObj);
procedure Grid1KeyDown(Sender: PControl; var Key: Integer;
Shift: Cardinal);
procedure Grid1MouseDown(Sender: PControl;
var Mouse: TMouseEventData);
procedure Grid1MouseUp(Sender: PControl;
var Mouse: TMouseEventData);
procedure Grid1DrawCell(Sender: PControl; ACol, ARow: Integer;
ACell: PmdvXLCell; ACanvas: PCanvas; ARect: TRect; ASelected,
AFocused: Boolean; var Access: Boolean);
private
{ Private declarations }
public
Pic : array of TSelCells;
temp : TSelCells;
{ Public declarations }
end;
var
Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;
{$IFDEF KOL_MCK}
procedure NewForm1( var Result: PForm1; AParent: PControl );
{$ENDIF}
implementation
{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}
{$IFDEF KOL_MCK}
{$I test_1.inc}
{$ENDIF}
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
SetLength(Pic,1);
end;
procedure TForm1.Grid1KeyDown(Sender: PControl; var Key: Integer;
Shift: Cardinal);
var
ARect: TRect;
begin
if Key = VK_CONTROL then
begin
ARect:=Grid1.CelltoRect(Grid1.Position.X,Grid1.Position.Y);
temp.FirstCell:=makepoint((ARect.Left + ARect.Right) div 2,(ARect.Top + ARect.Bottom) div 2);
end;
end;
procedure TForm1.Grid1MouseDown(Sender: PControl;
var Mouse: TMouseEventData);
var
ARect: TRect;
begin
if (GetKeyState(VK_LCONTROL)<0) AND (mouse.Button = mbLeft)then
begin
ARect:=Grid1.CelltoRect(Grid1.MouseToCell(mouse.X,mouse.Y).X,Grid1.MouseToCell(mouse.X,mouse.Y).Y);
temp.SndCell:=makepoint((ARect.Left + ARect.Right) div 2,(ARect.Top + ARect.Bottom) div 2);
SetLength(Pic,Length(Pic)+1);
Pic[High(Pic)].FirstCell:=Temp.FirstCell;
Pic[High(Pic)].SndCell:=Temp.SndCell;
end;
end;
procedure TForm1.Grid1MouseUp(Sender: PControl;
var Mouse: TMouseEventData);
begin
if (GetKeyState(VK_LCONTROL)<0) AND (mouse.Button = mbLeft)then
end;
procedure TForm1.Grid1DrawCell(Sender: PControl; ACol, ARow: Integer;
ACell: PmdvXLCell; ACanvas: PCanvas; ARect: TRect; ASelected,
AFocused: Boolean; var Access: Boolean);
var
i: integer;
begin
Access:=true;
With ACanvas^ do
begin
if ASelected then ACanvas.Brush.Color:= Grid1.SelectedColor
else ACanvas.Brush.Color:=ACell.Color;
ACanvas.Brush.BrushStyle:= bsSolid;
ACanvas.Pen.PenWidth:= 1;
ACanvas.Pen.PenMode:= pmCopy;
ACanvas.Pen.Color:= Grid1.LineColor;
ACanvas.Rectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
ACanvas.FillRect(ARect);
Pen.Color:=clBlack;
Pen.PenWidth:=2;
for i:=0 to High(Pic) do
begin
MoveTo(Pic[i].FirstCell.X, Pic[i].FirstCell.Y);
LineTo(Pic[i].SndCell.X, Pic[i].SndCell.Y);
end;
end;
end;
end.
← →
<Falcon> (2005-04-16 19:09) [14]И никакого мерцания, все нормально. D7,KOL 2.07
2 Dimaxx
А какая версия сетки? Текущая 1.15 кажется.
И если раскапаешь, в чем трабл был - напиши, уже просто интересно.
← →
Dimaxx © (2005-04-17 21:23) [15]У меня последняя версия сетка - 1.14. На сайте автора - аналогично. Демо на мыло, плиз... Вместо с откомпиленным экзешником. Я попробую его, пото откомпилю у себя и проверю...
← →
mdw © (2005-04-18 11:09) [16]Выложил на сайт автора версию 1.15. В v1.14 с отрисовкой возникли проблемы после какого-то обновления KOL, в 1.15 это исправлено.
← →
<Falcon> (2005-04-18 19:16) [17]ОК. Лови дему с экзешником. Но я использовал сетку 1.15, может поэтому у меня и все нормально с отрисовкой.
← →
Vladimyr © (2005-04-18 21:07) [18]mdw: А можно ссылку на 1.15?
А то что-то не найду никак...
← →
Dimaxx © (2005-04-18 23:46) [19]http://www.mdvkol.narod.ru/
← →
Dimaxx © (2005-04-19 23:14) [20]2 <Falcon>:
Попробовал - нифига не выходит! Твой код пашет - мой мерцает! Двадцать раз оба кода пересмотрел. И вот ведь идиотизм! И как я не заметил сразу! Оказывается, я рисовал "кубики" используя локальную ACanvas, а линии рисовал, используя XLGrid1.Canvas!!!!! Поменял в рисовании линий XLGrid1.Canvas на ACanvas и все заработало!!
Всем спасибо! Все свободны! :-)
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.041 c