Главная страница
    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.51 MB
Время: 0.019 c
14-1133005560
Хинт
2005-11-26 14:46
2005.12.18
P-Cad и K155


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


14-1132901183
Ega23
2005-11-25 09:46
2005.12.18
С днем рождения! 25 ноября


4-1129633004
timotei
2005-10-18 14:56
2005.12.18
BSOD KeBugCheckEx как???


1-1132847315
jolik
2005-11-24 18:48
2005.12.18
CheckBox.Checked и многопоточность.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский