🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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#
#863
Author: wojtek kurek
Date: Wed, 07 Apr 2004 22:06
13 lines
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#
#864
Author: Maciej Łuszczyński
Date: Thu, 08 Apr 2004 06:33
21 lines
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#
#866
Author: wojtek kurek
Date: Thu, 08 Apr 2004 10:26
28 lines
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#
#867
Author: Marek Janaszewski USUNTO. z adre...
Date: Thu, 08 Apr 2004 15:22
26 lines
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#
#868
Author: Maciej Łuszczyński
Date: Thu, 08 Apr 2004 16:48
32 lines
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#
#869
Author: Marek Janaszewski USUNTO. z adre...
Date: Thu, 08 Apr 2004 23:43
57 lines
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#
#865
Author: Maciej Łuszczyński
Date: Fri, 09 Apr 2004 07:17
18 lines
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