![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как быть и как с этим бороться(Canvas)
Roadroller © (2005-12-03 09:31:00)Есть следующий код:
...
var
pDC : HDC;
...
begin
...
pDC:=Form1.Image1.Canvas.Handle;
...
Ellips(pDC,1,1,1,1);
...
Дак вот елсипс не рисуется на канвасе????
В чем проблема???
Roadroller (2005-12-04 17:56:00) [1]>Вася пасиба!!!!
>sniknik Пасиба
Сам понял что был не прав, обещаю исправиться!!!
(А ведь она вертиться (с))
sniknik (2005-12-04 17:30:00) [2]аааа ... ну да, с рефрешем... ;о))
судя по Roadroller (04.12.05 15:13) [14]/Roadroller (04.12.05 15:17) [15]
у тебя и там ошибка, т.е. и там не работает, чтобы решить посмотри внимательно Вася (04.12.05 10:38) [11] и найди 10 отличий в вызове метода Refresh. ;о))
sniknik (2005-12-04 17:27:00) [3]> На канве Имеджа, в лучшем образом тока один раз, а то ваще ниразу!
ну так значится нада шота делать. ;)
предалагаю остановится на варианте с рефрешем, раз уж оно работает, или переделай на вызова методов непосредственно от канваса (тоже работает).
Набережных С. (2005-12-04 17:04:00) [4]ReleaseDC не нужен.
Roadroller (2005-12-04 16:35:00) [5]В общем так: На канве Формырисует нормально
На канве Имеджа, в лучшем образом тока один раз, а то ваще ниразу!
Roadroller (2005-12-04 16:29:00) [6]>jack128
> Ты один раз получаешь хендл и потом по всей программе этой
> переменной пользуешься??
Я и так каждый раз новый запрашиваю....
а на assert у меня чето ругаиться.... попробую конечно... но не знаю....
Roadroller (2005-12-04 16:21:00) [7]не спорю
>Form1.Image1.Canvas.Handle
мой касяк, поздно заметил, но если даже убрать Имедж, то не работает.
А если все также но рисовать на канве формы работает, а на канве Имеджа нет!
sniknik (2005-12-04 16:02:00) [8]Roadroller (04.12.05 15:13) [14]
>sniknik да блин на канве формы мне рисовать не надо (
да блин, я и не говорил, что надо ... я написал в чем возможная ошибка (а она точно есть т.к. в хелпе там явно указан хендл окна первым параметром)
Roadroller (04.12.05 15:17) [15]
> ReleaseDC(Form1.Image1.Canvas.Handle,pDC);
> Form1.Image1.Canvas.Refresh;
а ты ее опять сделал
первый параметр Form1.Image1.Canvas.Handle в твоем случае равен pDC, а надо хендлу окна от которого взят.
вот найди от чего оно взято в канвасе, да освождай для него же, тогда все и исправится. (хинт: по F7 можно трасировать с вхождением в процедуры/методы, а в свойствах проекта в "компиляторе" есть пункт "Uses Debug DCUs")
jack128 (2005-12-04 15:41:00) [9]А недры такого поведеня сидят глубоко в исходниках VCL
procedure TWinControl.MainWndProc(var Message: TMessage);
begin
try
try
WindowProc(Message);
finally
FreeDeviceContexts; //!!!!!!!!!!!!!!!!!!!
FreeMemoryContexts;
end;
except
Application.HandleException(Self);
end;
end;
jack128 (2005-12-04 15:39:00) [10]Roadroller (03.12.05 9:31)
pDC:=Form1.Image1.Canvas.Handle;
Ты один раз получаешь хендл и потом по всей программе этой переменной пользуешься?? Это не верный подход. Хендл канвы постоянно меняется, так что во всех случаях используй Canvas.Handle.
напрмер
var
Canvas_Handle: Integer;
s: string;
begin
Canvas_Handle := Canvas.Handle;
s := Caption;
Assert(Canvas_Handle = Canvas.Handle);
Caption := IntToStr(Canvas_Handle) + ' ' + s; // чтоб оптимизатор не мешал.
end;
Roadroller (2005-12-04 15:17:00) [11]
pDC:=Form1.Canvas.Handle;
PatBlt(pDC, 0, 0, Form1.Image1.Width, Form1.Image1.Height, WHITENESS);
Bug1.Draw_Bug(pDC,Bug1.place_x,Bug1.place_y);
ReleaseDC(Form1.Image1.Canvas.Handle,pDC);
Form1.Image1.Canvas.Refresh;
Вот перед этим пропустил кусок.
Исправился))
но всеравно...
Roadroller (2005-12-04 15:13:00) [12]>sniknik да блин на канве формы мне рисовать не надо (
>Вася так тоже не пашет (04.12.05 10:38) [11]
>Вася нетне устраивает т.к. у меня класс который должен себя рисовать на ИМАДЖ.КАНВАС а ему дя етого нужен контекст устройсва куда он рисуеиться.(Handle по англицки) (04.12.05 10:18) [9]
>Virgo_Style © таким образом DC освобаждают прогая под OpenGL(04.12.05 10:30) [10]
в общем я нашел способ, но приходиться рисовать на канве формы, поверх имеджа:
PatBlt(pDC, 0, 0, Form1.Image1.Width, Form1.Image1.Height, WHITENESS);
Bug1.Draw_Bug(pDC,Bug1.place_x,Bug1.place_y);
ReleaseDC(Form1.Image1.Canvas.Handle,pDC);
Form1.Image1.Canvas.Refresh;
Draw_Bug реализован как : Ellipse(pDC,x+4,y+4,x-4,y-4);
Буду благодарен если всетаки кто-нибудь подскажет как же рисовать на канве имеджа...
sniknik (2005-12-04 11:08:00) [13]> может быть, потому что первый аргумент неверен?
именно
в начальном коде все работает, и по второму разу, только в ReleaseDC первый параметр неверно задан (повторяет тот же pDC а должен быть хендл окна. судя по хелпу)
вот проверь две на 2х кнопках
procedure TForm1.Button1Click(Sender: TObject);
var pDC: THandle;
begin
Form1.Canvas.Brush.Color:= clRed;
pDC:= Form1.Canvas.Handle;
PatBlt(pDC, 0, 0, Form1.Width, Form1.Height, WHITENESS);
Ellipse(pDC, 40, 40, -40, -40);
ReleaseDC(Form1.Handle, pDC);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var pDC: THandle;
begin
Form1.Canvas.Brush.Color:= clGreen;
pDC:= Form1.Canvas.Handle;
PatBlt(pDC, 0, 0, Form1.Width, Form1.Height, WHITENESS);
Ellipse(pDC, 40, 40, -40, -40);
ReleaseDC(Form1.Handle, pDC);
end;
Virgo_Style (2005-12-04 10:39:00) [14]Проверил, во-первых, работает и с ReleaseDC (может быть, потому что первый аргумент неверен? В общем, я в этом не очень разбираюсь, так что не буду гадать, может и ошибаюсь), во-вторых, чтобы изменения отобразились, нужен Repaint.
Вася (2005-12-04 10:38:00) [15]эта строка ни на что не влияет:
ReleaseDC(Form1.Image1.Canvas.Handle,pDC);
можно вот так:
procedure TForm1.BitBtn2Click(Sender: TObject);
...
Form1.Image1.Canvas.Brush.Color:=clRed;
pDC:=Form1.Image1.Canvas.Handle;
PatBlt(pDC, 0, 0, Form1.Image1.Width, Form1.Image1.Height, WHITENESS);
Ellipse(pDC,Bug1.place_x+4,Bug1.place_y+4,Bug1.place_x-4,Bug1.place_y-4);
ReleaseDC(Form1.Image1.Canvas.Handle,pDC);
Image1.Refresh;
...
Virgo_Style (2005-12-04 10:30:00) [16]Roadroller (04.12.05 9:15) [8]
ReleaseDC(Form1.Image1.Canvas.Handle,pDC);
Не то что бы я был уверен, но эта строка мне очень не нравится... Мне кажется, полученный таким образом DC освобождать не нужно.
Вася (2005-12-04 10:18:00) [17]А вот так не устраеваит?
Image1.Canvas.Brush.Color:=clWindow;
Image1.Canvas.FillRect(Image1.ClientRect);
Image1.Canvas.Brush.Color:=clRed;
Image1.Canvas.Ellipse(Bug1.place_x+4,Bug1.place_y+4,Bug1.place_x-4,Bug1.place_y-4
Roadroller (2005-12-04 09:15:00) [18]ПРивожу более подробный текст проги
procedure TForm1.BitBtn2Click(Sender: TObject);
...
Form1.Image1.Canvas.Brush.Color:=clRed;
pDC:=Form1.Image1.Canvas.Handle;
PatBlt(pDC, 0, 0, Form1.Image1.Width, Form1.Image1.Height, WHITENESS);
Ellipse(pDC,Bug1.place_x+4,Bug1.place_y+4,Bug1.place_x-4,Bug1.place_y-4);
ReleaseDC(Form1.Image1.Canvas.Handle,pDC);
...
Результат такой что после первого нажатия кружочик рисуится, а при повторном нажатии на кнопку нет.
Roadroller (2005-12-04 09:10:00) [19]up
>Umbra нет не работает
begin...end (2005-12-03 11:57:00) [20]> umbra © (03.12.05 10:49) [5]
> Canvas.Handle это не HDC.
А что это?