Форум: "Начинающим";
Текущий архив: 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