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