Thread View: alt.pl.comp.lang.csharp
7 messages
7 total messages
Started by wojtek kurek
Wed, 07 Apr 2004 22:06
rysowanie w C#
Author: wojtek kurek
Date: Wed, 07 Apr 2004 22:06
Date: Wed, 07 Apr 2004 22:06
13 lines
1188 bytes
1188 bytes
Witam Mam takie pytanie. Jak narysować linię łączącą dwa punkty w C# Builderze? Wszedzie napisane jest ze trzeba do tego wykorzystac zdarzenie PaintEventArgs . Moje pytanie jest następujące czy można to zrobic bez wykorzystania tego zdarzenia, a jak nie to jak wywołać takie zdarzenie przy pomocy nacisnięcia przycisku? -- pozdrawiam wojtek kurek
Re: rysowanie w C#
Author: Maciej Łuszczyński
Date: Thu, 08 Apr 2004 06:33
Date: Thu, 08 Apr 2004 06:33
21 lines
1606 bytes
1606 bytes
> Mam takie pytanie. Jak narysować linię łączącą dwa punkty w C# > Builderze? Wszedzie napisane jest ze trzeba do tego wykorzystac > zdarzenie PaintEventArgs . > Moje pytanie jest następujące czy można to zrobic bez wykorzystania tego > zdarzenia, a jak nie to jak wywołać takie zdarzenie przy pomocy > nacisnięcia przycisku? Jeśli zdarzenie, to wystarczy wywołać: Invalidate(); Jeśli bez zdarzenia, to musisz utworzyć obiekt klasy Graphics, posługując się metodą klasy Control: Graphics grfx = this.CreateGraphics(); grfx.DrawLine(...) grfx.Dispose(); // bezwzglednie Pozdrawiam -- Macko *** A czym się różni Cray od normalnego peceta? *** Tym, że Cray wykonuje pętle nieskończone w 10 sekund.
Re: rysowanie w C#
Author: wojtek kurek
Date: Thu, 08 Apr 2004 10:26
Date: Thu, 08 Apr 2004 10:26
28 lines
1756 bytes
1756 bytes
Użytkownik Maciej Łuszczyński napisał: >>Mam takie pytanie. Jak narysować linię łączącą dwa punkty w C# >>Builderze? Wszedzie napisane jest ze trzeba do tego wykorzystac >>zdarzenie PaintEventArgs . > > > >>Moje pytanie jest następujące czy można to zrobic bez wykorzystania tego >>zdarzenia, a jak nie to jak wywołać takie zdarzenie przy pomocy >>nacisnięcia przycisku? > > Jeśli zdarzenie, to wystarczy wywołać: > Invalidate(); > > Jeśli bez zdarzenia, to musisz utworzyć obiekt klasy Graphics, posługując > się metodą klasy Control: > Graphics grfx = this.CreateGraphics(); > grfx.DrawLine(...) > grfx.Dispose(); // bezwzglednie > > Pozdrawiam Dziekuje bardzo za pomoc. Wszystko pieknie zadzialało. -- pozdrawiam wojtek kurek
Re: rysowanie w C#
Author: Marek Janaszewski USUNTO. z adre...
Date: Thu, 08 Apr 2004 15:22
Date: Thu, 08 Apr 2004 15:22
26 lines
1890 bytes
1890 bytes
wojtek kurek wrote: > Witam > > Mam takie pytanie. Jak narysować linię łączącą dwa punkty w C# > Builderze? Wszedzie napisane jest ze trzeba do tego wykorzystac > zdarzenie PaintEventArgs . > > Moje pytanie jest następujące czy można to zrobic bez wykorzystania > tego zdarzenia, a jak nie to jak wywołać takie zdarzenie przy pomocy > nacisnięcia przycisku? Witam! Albo rysuje na jakieś bitmapie lub metapliku albo bezpośrednio w pamięci karty graficznej. Ten drugi sposób jest akcelerowany przez procesor karty graficznej, ten pierwszy o ile mi wiadomo jeszcze oznacza użycie pamięci operacyjnej i CPU. Zatem całe rysowanie w Paint jest akcelerowane, a przygotowanie bitmapie i tylko wyświetlenie jej w metodzie Paint nie. Użycie bitmapy ma jedną przewagę, nie musisz się zmieścić w cyklach odświeżania ekranu. Jeśli zostaniesz złapany z nieskończonym rysunkiem powstanie efekt migania albo płynięcia obrazu. -- Pozdrawiam, Marek Janaszewski [ j_m...@gazeta.pl ]
Re: rysowanie w C#
Author: Maciej Łuszczyński
Date: Thu, 08 Apr 2004 16:48
Date: Thu, 08 Apr 2004 16:48
32 lines
1941 bytes
1941 bytes
<ciach>
> przygotowanie bitmapie i tylko wyświetlenie jej w metodzie Paint nie. Użycie
> bitmapy ma jedną przewagę, nie musisz się zmieścić w cyklach odświeżania
> ekranu. Jeśli zostaniesz złapany z nieskończonym rysunkiem powstanie efekt
> migania albo płynięcia obrazu.
Wcale nie :)
Istnieje możliwość określenia swojej kontrolki jako używającej podwójnego
buforowania. Dzięki temu efekt migotania nie występuje, i to nawet przy
rysowaniu całkiem sporej liczby obiektów:
// konstruktor
public Kontrolka()
{
SetStyle(ControlStyles.UserPaint |
ControlStyles.Selectable |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.DoubleBuffer |
ControlStyles.ResizeRedraw, true);
}
protected override void OnPaint(PaintEventArgs e)
{
// rysowanie poprzez e.Graphics
}
Pozdrawiam
--
Macko
*** A czym się różni Cray od normalnego peceta?
*** Tym, że Cray wykonuje pętle nieskończone w 10 sekund.
Re: rysowanie w C#
Author: Marek Janaszewski USUNTO. z adre...
Date: Thu, 08 Apr 2004 23:43
Date: Thu, 08 Apr 2004 23:43
57 lines
3562 bytes
3562 bytes
Maciej Łuszczyński wrote: > <ciach> >> przygotowanie bitmapie i tylko wyświetlenie jej w metodzie Paint >> nie. Użycie bitmapy ma jedną przewagę, nie musisz się zmieścić w >> cyklach odświeżania ekranu. Jeśli zostaniesz złapany z nieskończonym >> rysunkiem powstanie efekt migania albo płynięcia obrazu. > > Wcale nie :) > > Istnieje możliwość określenia swojej kontrolki jako używającej > podwójnego buforowania. Dzięki temu efekt migotania nie występuje, i > to nawet przy rysowaniu całkiem sporej liczby obiektów: [...] Witam! Ale co oznacza podwójne buforowanie, przeciesz właśnie to tak działa tylko jest realizowane automatycznie przez kontrolkę. Cytat z pomocy MSDN: If true, drawing is performed in a buffer, and after it completes, the result is output to the screen. Double-buffering prevents flicker caused by the redrawing of the control. To fully enable double-buffering, you must also set the UserPaint and AllPaintingInWmPaint style bits to true. Twócy gier mają możliwość przez DirectX albo OpenGL przygotować zawartość rysunku części pamięci karty, która nie jest wyświetlana i albo kazać, karcie to pokazać albo szybko dokonać transferu bloków. W przecież procesor, karty graficznej nie będzie rysował w głównej pamięci. Znalazłem na potwierdzenie tych słów artykuł na jakieś stronie z GDI+ FAQ: http://www.bobpowell.net/doublebuffer.htm Cytata: When these are all set true, the draw process is modified so that instead of your Paint handler being passed a Graphics for the screen, it is passed a Graphics for an in-memory bitmap. When you draw to this Graphics object, you are drawing on an invisible image. At the end of the draw cycle, this bitmap is copied to the main window automatically and the actual pixels you see are all changed in a fraction of a second instead of one at a time as the draw cycle progresses. Autor nazywa tą metodę "automatic double buffering", a to co ja zaproponowałem "manual double buffering". Wymienia różnice między podejściami i jak efektywnie stosować "double buffering". P.S. Ciekawe skąd się wzięła nazwa "double buffering" czyli podwójne buforowanie. Podobne ustawienie dotyczące dysku było w MS-DOS czy w Windows 9x w Msdos.sys. Jak dla mnie w tym przypadku wystarczyła by nazwa "buforowanie". Chyba, że autorzy zawartość pamięci karty graficznej traktują jak buffor, a bitmapę w pamięci jako drugi buffor. -- Pozdrawiam, Marek Janaszewski [ j_m...@gazeta.pl ]
Re: rysowanie w C#
Author: Maciej Łuszczyński
Date: Fri, 09 Apr 2004 07:17
Date: Fri, 09 Apr 2004 07:17
18 lines
1888 bytes
1888 bytes
>>> przygotowanie bitmapie i tylko wyświetlenie jej w metodzie Paint >>> nie. Użycie bitmapy ma jedną przewagę, nie musisz się zmieścić w >>> cyklach odświeżania ekranu. Jeśli zostaniesz złapany z nieskończonym >>> rysunkiem powstanie efekt migania albo płynięcia obrazu. >> Istnieje możliwość określenia swojej kontrolki jako używającej >> podwójnego buforowania. Dzięki temu efekt migotania nie występuje, i >> to nawet przy rysowaniu całkiem sporej liczby obiektów: > Ale co oznacza podwójne buforowanie, przeciesz właśnie to tak działa tylko > jest realizowane automatycznie przez kontrolkę. Zgadza się, nie przeczę. Chodziło mi po prostu o to, że mechanizm ten jest gotowy do wykorzystania w sposób niemal przejrzysty dla programisty. Pozdrawiam, Macko -- *** A czym się różni Cray od normalnego peceta? *** Tym, że Cray wykonuje pętle nieskończone w 10 sekund.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads