Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

Как быть и как с этим бороться(Canvas)   Найти похожие ветки 

 
Roadroller   (2005-12-03 09:31) [0]

Есть следующий код:
...
var
pDC : HDC;
...
begin
...
pDC:=Form1.Image1.Canvas.Handle;
...
Ellips(pDC,1,1,1,1);
...
Дак вот елсипс не рисуется на канвасе????
В чем проблема???


 
Virgo_Style ©   (2005-12-03 09:36) [1]

Посчитаем размеры эллипса:
горизонталь: 1-1 = 0;
вертикаль:   1-1 = 0


Вот и все.


 
Roadroller   (2005-12-03 09:44) [2]

да блин если и не 0, то всеравно не рисует...
вот если писать без pDC, т.е. Form1.Imege1.Canvas.Elips(...), то все OK рисует и радуется...


 
Virgo_Style ©   (2005-12-03 10:15) [3]

Хм, странно. Проверил - у меня все работает...


 
Roadroller   (2005-12-03 10:20) [4]

у меня это на кнопочке, сначало рисую елипс в одном месте, тыкаю кнопуку зачищаю, а новый не рисуется.(то исть рисует только один раз и все больше скока не тыкуй не рисует)


 
umbra ©   (2005-12-03 10:49) [5]

Canvas.Handle это не HDC.
Попоробуйте

pDC:=GetDC(Form1.Image1.Canvas.Handle);


 
begin...end ©   (2005-12-03 11:57) [6]

> umbra ©   (03.12.05 10:49) [5]

> Canvas.Handle это не HDC.

А что это?


 
Roadroller   (2005-12-04 09:10) [7]

up
>Umbra нет не работает


 
Roadroller   (2005-12-04 09:15) [8]

ПРивожу более подробный текст проги

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);
...

Результат такой что после первого нажатия кружочик рисуится, а при повторном нажатии на кнопку нет.


 
Вася   (2005-12-04 10:18) [9]

А вот так не устраеваит?

 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


 
Virgo_Style ©   (2005-12-04 10:30) [10]

Roadroller   (04.12.05 9:15) [8]
ReleaseDC(Form1.Image1.Canvas.Handle,pDC);


Не то что бы я был уверен, но эта строка мне очень не нравится... Мне кажется, полученный таким образом DC освобождать не нужно.


 
Вася   (2005-12-04 10:38) [11]

эта строка ни на что не влияет:
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:39) [12]

Проверил, во-первых, работает и с ReleaseDC (может быть, потому что первый аргумент неверен? В общем, я в этом не очень разбираюсь, так что не буду гадать, может и ошибаюсь), во-вторых, чтобы изменения отобразились, нужен Repaint.


 
sniknik ©   (2005-12-04 11:08) [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;


 
Roadroller   (2005-12-04 15:13) [14]

>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);

Буду благодарен если всетаки кто-нибудь подскажет как же рисовать на канве имеджа...


 
Roadroller   (2005-12-04 15:17) [15]

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;


Вот перед этим пропустил кусок.

Исправился))

но всеравно...


 
jack128 ©   (2005-12-04 15:39) [16]

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;


 
jack128 ©   (2005-12-04 15:41) [17]

А недры такого поведеня сидят глубоко в исходниках VCL

procedure TWinControl.MainWndProc(var Message: TMessage);
begin
 try
   try
     WindowProc(Message);
   finally
     FreeDeviceContexts; //!!!!!!!!!!!!!!!!!!!
     FreeMemoryContexts;
   end;
 except
   Application.HandleException(Self);
 end;
end;


 
sniknik ©   (2005-12-04 16:02) [18]

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")


 
Roadroller   (2005-12-04 16:21) [19]

не спорю
>  Form1.Image1.Canvas.Handle

мой касяк, поздно заметил, но если даже убрать Имедж, то не работает.
А если все также но рисовать на канве формы работает, а на канве Имеджа нет!


 
Roadroller   (2005-12-04 16:29) [20]

>jack128

> Ты один раз получаешь хендл и потом по всей программе этой
> переменной пользуешься??

Я и так каждый раз новый запрашиваю....
а на assert у меня чето ругаиться.... попробую конечно... но не знаю....


 
Roadroller   (2005-12-04 16:35) [21]

В общем так: На канве Формы рисует нормально
                  На канве Имеджа, в лучшем образом тока один раз, а                       то ваще ниразу!


 
Набережных С. ©   (2005-12-04 17:04) [22]

ReleaseDC не нужен.


 
sniknik ©   (2005-12-04 17:27) [23]

> На канве Имеджа, в лучшем образом тока один раз, а то ваще ниразу!
ну так значится нада шота делать. ;)

предалагаю остановится на варианте с рефрешем, раз уж оно работает, или переделай на вызова методов непосредственно от канваса (тоже работает).


 
sniknik ©   (2005-12-04 17:30) [24]

аааа ... ну да, с рефрешем... ;о))
судя по Roadroller   (04.12.05 15:13) [14]/Roadroller   (04.12.05 15:17) [15]
у тебя и там ошибка, т.е. и там не работает, чтобы решить посмотри внимательно Вася   (04.12.05 10:38) [11] и найди 10 отличий в вызове метода Refresh. ;о))


 
Roadroller   (2005-12-04 17:56) [25]

>Вася пасиба!!!!
>sniknik Пасиба

Сам понял что был не прав, обещаю исправиться!!!
(А ведь она вертиться (с))



Страницы: 1 вся ветка

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.045 c
14-1133032576
lookin
2005-11-26 22:16
2005.12.18
Ошибочный файл в EMule


2-1133740879
HF-Trade
2005-12-05 03:01
2005.12.18
Прервать работу основной процедуры - из вызванной процедуры...


2-1133257072
Alek
2005-11-29 12:37
2005.12.18
вопрос по FireBird


14-1132272722
Kerk
2005-11-18 03:12
2005.12.18
Никогда не используйте сторонние компоненты...


2-1133433950
linox
2005-12-01 13:45
2005.12.18
нужно кинуть таблицу (2, 12) в WORD