Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

Как быть и как с этим бороться(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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.014 c
2-1132726445
AndreyAR
2005-11-23 09:14
2005.12.18
Не виден сервер


1-1132798674
konrads
2005-11-24 05:17
2005.12.18
Определить сменный диск


3-1130935650
Александр_н
2005-11-02 15:47
2005.12.18
Создание таблиц с помощью IBSQL


4-1129202576
Spellcaster
2005-10-13 15:22
2005.12.18
Собственный хинт в трее


8-1121117343
АСК1
2005-07-12 01:29
2005.12.18
pfDevice - это сколько байт на пиксель в TBitMap ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский