Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как быть и как с этим бороться(Canvas)


Страницы:   1 2

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.

А что это?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо