Re: Tutorial do gpi...

Autor: Wojciech Gazda (gazda_at_fema.krakow.pl)
Data: Fri 28 Dec 2001 - 12:27:50 MET


Lech Wiktor Piotrowski napisał(a):
>
> On Mon, 24 Dec 2001 12:10:40 +0100 (MET), Przemyslaw Dobrowolski wrote:
>
> >On Mon, 24 Dec 2001 11:51:58 +0100 (MET), Lech Wiktor Piotrowski wrote:
> >
> >[...]
> >
> >No dobrze... Przejrzałem kod. Czemu wszędzie rysujesz?
> >
>
> Wywalilem WM_CREATE i wsadzilem cos takiego do WM_PAINT":
>
> case WM_PAINT:
> {
> RECTL rect1;
> WinQueryWindowRect(hwndWnd, &rect1);
> hps = WinBeginPaint(hwndWnd, NULLHANDLE, &rect1);
> POINTL a={0,0}, b={100,100};
> char tekst[]="This is a sample multiline text I wonder if I could make it scrollable?
> Anyway, I'll try";
> GpiMove(hps, &a);
> GpiCharString(hps, sizeof(tekst), tekst);
> break;
>
> no i nijak sie to nie spisuje - przy resizach itp. robi sie syf w okienku - a w koncu cale
> powinno byc automatycznie odswiezane. Czy moze powinienem je czyscic na wstepie,
> a potem pisac, bo program sie nie domysla?
Powinienes wcześniej wyczyścic tlo pod napisem. Wydaje mi sie, ze
GpiCharStringPos robi to automatycznie ale nie jestem tego teraz do
konca pewien...
 
> WM_SIZE chyba automatycznie wywluje WM_PAINT, tylk ozastanawiam sie, w jakiej
> kolejnosci, bo jesli zmniejsze okienko od dolu, to napis znika - a w koncu w WM_PAINT
> jest przerysowywany na wspolrzednych 0,0, czyli po zmniejszeniu powinien byc
> rysowany od poczatku. Wynikaloby z tego,z e najpierw jest rysowany napis, a dopiero
> potem okienko jest zmniejszane - tzn zmieniaja sie wspolrzedne... Jednak jak zrobic,
> zeby najpierw nastepowalo zmniejsenie okienka, a dopiero potem rysowanie (o ile
> moja teoria jest prawdziwa)?
>

WM_SIZE wewnetrzne wywoluje WinInvalidateRect() co powoduje wstawienie
WM_PAINT do kolejki. To jaki obszar bedzie przerysowany zalezy od flag z
jakimi zostala zarejestrowana klasa okna:
- Jesli bylo to z CS_SIZEREDRAW, to przy kazdej zmianie rozmiaru
  wymuszane jest odswiezenie calego okna.
- Bez tej flagi, odswiezanie zalezy od tego co "robimy" z oknem,
  i od tego co zrobimy podczas obslugi komunikatu WM_CALCVALIDRECTS.
  WinDefWindowProc nie rusza obszarow i zwraca
  (CVR_ALIGNTOP | CVR_ALIGNLEFT) co oznacza, ze zawartosc okna
  jest dosuwana o lewego gornego rogu. A w zwiazku z tym:
  * zwiększamy obszar okna ciągnąc za górną krawędz:
    PM kopiuje zawratość okna i unieważnia dolny pasek.
  * Zmniejszamy obszar okna ciągnąć za górną krawędz:
    PM kopiuje zawartość okna i przerysowanie nienastepuje,
    poniewaz nowy obszar jest mniejszy niz stary.
  * Zwiększamy obszar okna ciągnąc za prawą krawędź:
    PM nic nie kopiuje, uniważnia tylko odsłonięty pasek z prawej.
  * Zmniejszamy obszar okna ciągnąc za prawą krawędź:
    PM nic nie kopiuje, odświeżanie nienastępuje.
  I tak dalej, analogicznie dla pozostałych krawędzi.

Manipulując flagami CVR_ można wyrównywać zawartość okna jak jest
wygodnie. Dodatkowo, zwracając 0 i modyfikując obszary przekazywane w
WM_CALCVALIDRECTS można np. centrować zawartość okna... Ogólnie jest z
tym sporo zabawy = modyfikacji obszarów "nie czuję" jeszcze zbyt
dobrze...

-- 
Wojciech Gazda
/*******************************************************/
/* Home page        - http://www.fema.krakow.pl/~gazda */
/* Asua programmers - http://www.asua.org.pl           */
/*******************************************************/


To archiwum zostało wygenerowane przez hypermail 2.1.7 : Tue 18 May 2004 - 15:34:11 MET DST