Re: Tutorial do gpi...

Autor: Wojciech Gazda (gazda_at_fema.krakow.pl)
Data: Fri 28 Dec 2001 - 11:48:19 MET


Lech Wiktor Piotrowski napisał(a):
>
> On Mon, 24 Dec 2001 11:34:27 +0100 (MET), Wojciech Gazda wrote:
> >Pokaz kawalek kodu ktory jest w WM_PAINT - mam wrazenie, ze cos nie jest
> >dealokowane...
> >
>
> na wszelki wypadek pokazuje wiekszy kawalek. To jednak chyba nie
> jest wieszanie, tylko wieksze przestoje - budzi sie po jakims
> czasie. A ze wczoraj mialem duzy swap, to moze wygladalo jak
> wieszanie. Wszystko jedno, cos nie tak:

Tak jak myślałem - jest przydział presentation space na czas rysowania,
a pozniej nie ma jego zwolnienia za pomoca WinReleasePS() :->

MRESULT EXPENTRY ClientWndProc ( HWND hwndWnd,
                                 ULONG ulMsg,
                                 MPARAM mpParm1,
                                 MPARAM mpParm2 )
{ // Pozwolilem sobie tekst i zmienne wstawic tutaj...
  HPS hps; // To powinna byc zmienna lokalna...
  POINTL a;
  char tekst[] = "This is a sample multiline text I
                  wonder if I could make it scrollable?
                  Anyway, I'll try";

   switch ( ulMsg ) {
   case WM_PAINT:
      {
         // Tu tylko rysowanie
         hps = WinBeginPain(NULLHANDLE, NULL);
         a.x = 0; a.y = 0;
         GpiCharStringAt(hps, &a, strlen(tekst), tekst);
         WinEndPaint(hps);
         break;
       }
 
    case WM_ERASEBACKGROUND:
       {
          return MRFROMSHORT ( TRUE ) ;
       }
    case WM_CREATE :
       {
          // To co tu pobierasz to "cache presentation space"
          // sluzaca do rysowania drobiazgow, i ktora powinna
          // byc zwolniona przed wyjsciem z procedury okna.
          // Rysowanie w WM_CREATE i tak nie ma z reszta sensu
          // poniewaz okna jeszcze nie ma na ekranie...
          // Kasujemy wiec.
          // hps = WinGetPS(hwndWnd);
          // POINTL a={0,0}, b={100,100};
          // GpiMove(hps, &a);
          // GpiCharString(hps, sizeof("Sample Text"), "Sample Text");
          break;
       }
    case WM_VSCROLL:
       {
          // A tutaj lepiej wymusic wygenerowanie komunikatu WM_PAINT
          // ktory dopiero przerysuje odp. fragment. Robimy to
          // za pomoca WinInvalidateRect, pobrawszy uprzednio
          // rozmiary obszaru tekstowego:
          POINTL ptl[TXTBOX_COUNT];
          RECTL rcl;

          // Pobieramy uchwyt cache presentation space:
          HPS hps = WinGetPS(hwndWnd);

          // Mierzymy jaki obszar zajmie tekst:
          GpiQueryTextBox(hps, strlen(tekst), tekst, TXTBOX_COUNT, ptl);

          // Wymuszamy odswiezenie okna (wygenerowanie WM_PAINT):
          rcl.xLeft = 0; // Wspolzedne poczatkowe
          rcl.yBottom = 0;
          // Rozmiar obszaru teksowego:
          rcl.xRight = rcl.xLeft + ptl[TXTBOX_TOPRIGHT].x
                                    - ptl[TXTBOX_BOTTOMLEFT].x;
          rcl.yTop = rcl.yBottom + ptl[TXTBOC_TOPRIGHT].y
                                    - ptl[TXTBOX_BOTTOMLEFT].y;

          // Wymuszenie przerysowania: umieszcza WM_PAINT w kolejce.
          WinInvalidateRect(hwndWnd, &rcl, 0);
          // Zwalniamy presentation space
          WinReleasePS(hps);
          break;
       }
    default:
       return WinDefWindowProc ( hwndWnd,
                                 ulMsg,
                                 mpParm1,
                                 mpParm2 ) ;
    } /* endswitch */
 
    return MRFROMSHORT ( FALSE ) ;
 }
 
 (te na WM_CREATE nie maja sensu, ale to nie powinno miec znaczenia.
 

-- 
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