-
1. Data: 2010-06-08 10:04:46
Temat: [winapi] mulący repaint przy resize
Od: "fir" <p...@p...onet.pl>
jesli odrysowanie ekranu w programie pod winapi trwa kawałek czasu
(np generowany jest skomplikowany obraz itp) to powstaje pewien
prosty problem i zastanawiam sie co z tym sie robi:
jesli repaint jest podłaczony pod resize (CS_HREDRAW, CS_VREDRAW)
to 'resize sie tnie' - po przeciagnieciu kawalka ramki okna wywoluje sie
repaint i trzba czekac - defakto zgrabne resize jest uniemozliwione
jesli zas pod resize nie jest podpiety repaint to po resiznieciu
okna obraz jest zdeformowany i trzeba by np kliknac coś by
wywołac repaint
jak to sie rozwiazuje?
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
-
2. Data: 2010-06-08 16:53:00
Temat: Re: [winapi] mulący repaint przy resize
Od: Norbert <n...@r...no>
Dnia Tue, 08 Jun 2010 12:04:46 +0200, fir napisał(a):
> jesli odrysowanie ekranu w programie pod winapi trwa kawałek czasu
> (np generowany jest skomplikowany obraz itp) to powstaje pewien
> prosty problem i zastanawiam sie co z tym sie robi:
Malowac na WM_WINDOWPOSCHANGED?
--
pozdrawiam
Norbert
-
3. Data: 2010-06-08 17:49:33
Temat: Re: [winapi] mulący repaint przy resize
Od: grg12 <g...@c...at>
Norbert pisze:
> Malowac na WM_WINDOWPOSCHANGED?
>
A co to da? (serio pytam)
Ja bym przerzucił rysowanie do oddzielnego wątku (malować oczywiście na
buforze w pamięci), WM_PAINT służyłby tylko do wyświetlania bufora.
Oczywiście jest przy tym sporo zabawy z zapewnieniem synchronizacji
pomiędzy wątkami (trzeba zadbać żeby dane wejściowe nie zmieniały się
podczas rysowania, pilnować żeby WM_PAINT nie próbował odmalować ze
skasowanej bitmapy itp.) ale w ten sposób mamy pewność że program będzie
szybko reagował na sygnały (inne rozwiązanie - długotrwałe odrysowywanie
podzielić na kawałki i pomiędzy nimi sprawdzać mailboxa - w razie czego
zacząć rysowanie od początku)
-
4. Data: 2010-06-10 10:06:28
Temat: Re: [winapi] mulÄ cy repaint przy resize
Od: t...@p...onet.pl
> Norbert pisze:
>
> > Malowac na WM_WINDOWPOSCHANGED?
> >
>
> A co to da? (serio pytam)
> Ja bym przerzuciĹ rysowanie do oddzielnego wÄ tku (malowaÄ oczywiĹcie na
> buforze w pamiÄci), WM_PAINT sĹuĹźyĹby tylko do wyĹwietlania bufora.
> OczywiĹcie jest przy tym sporo zabawy z zapewnieniem synchronizacji
> pomiÄdzy wÄ tkami (trzeba zadbaÄ Ĺźeby dane wejĹciowe nie zmieniaĹy siÄ
> podczas rysowania, pilnowaÄ Ĺźeby WM_PAINT nie prĂłbowaĹ odmalowaÄ ze
> skasowanej bitmapy itp.) ale w ten sposĂłb mamy pewnoĹÄ Ĺźe program bÄdzie
> szybko reagowaĹ na sygnaĹy (inne rozwiÄ zanie - dĹugotrwaĹe odrysowywanie
> podzieliÄ na kawaĹki i pomiÄdzy nimi sprawdzaÄ mailboxa - w razie czego
> zaczÄ Ä rysowanie od poczÄ tku)
poruszasz chyba ogolniejszy problem jak przerwac dlugo trwajaca obsluge
zdarzenia - ja mam skromniejsze pytanie samo dlugotrwajace odrysowanie
moge zaakceptowac byle tylko nie wywolywaalo sie tam gdzie nie chce
chyba da sie to jakos zrobic bez wątków, ani bez grzebania w idleLoop,
chodzi o to aby móc odróżnić w onPaincie te repainty ktore lecą przy
resizowaniu (i które chcialbym zignorować) od poprawnych reapaintow
sa chyba takie zdarzenia WM_ENTERSIZING WM_EXITSIZING czy cos takiego
i byc moze jak zaznacze sobie globalnym intem sizing=1 ten czas
miedzy tymi zdarzeniami to w onpaincie bede mogl skipnac te rapainty
- nie wiem czy zadziala (znajac winapi to moze nie zadzialac)
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
-
5. Data: 2010-06-14 08:07:21
Temat: Re: [winapi] mulÄ cy repaint przy resize
Od: "fir" <p...@p...onet.pl>
>
> sa chyba takie zdarzenia WM_ENTERSIZING WM_EXITSIZING czy cos takiego
> i byc moze jak zaznacze sobie globalnym intem sizing=1 ten czas
> miedzy tymi zdarzeniami to w onpaincie bede mogl skipnac te rapainty
> - nie wiem czy zadziala (znajac winapi to moze nie zadzialac)
>
ogólnie niestety te frustrujace momentami zabawy z ewentami pod winapi
przypominają mi coś co chyba by można nazwać dosyć kretyńską łamigłówką :/
zaznaczeyłem tego 'sizing' i niby działa ale jakby tak na 90%,
najwiekszy problem to to ze jesli najadę nad swoje okno jakims malym
okienkiem np suwakami do ust glosnosci w windzie to przy przesuwaniu
ich nad moim oknem invalidaty do niego wysyłaja sie jakby czesciowo
i powstaja czarne obszary tylko z paskami invalidetów :-/ nie wiem
z czego to wynika, drugi problem ze odrysowanie z bufora robie
setPixelem i trwa to wolno (gdzies tak 1/3 sekundy)
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
-
6. Data: 2010-06-14 08:44:05
Temat: Re: [winapi] mulÄ?cy repaint przy resize
Od: "Grzegorz Niemirowski" <g...@p...onet.pl>
fir <p...@p...onet.pl> napisał(a):
> drugi problem ze odrysowanie z bufora robie
> setPixelem i trwa to wolno (gdzies tak 1/3 sekundy)
Jak rysujesz po pikselu to nic dziwnego. Do takich rzeczy jest BitBlt.
--
Grzegorz Niemirowski
http://www.grzegorz.net/
OE PowerTool i Outlook Express: http://www.grzegorz.net/oe/
Uptime: 4 days, 7 hours, 24 minutes and 36 seconds
-
7. Data: 2010-06-14 09:20:53
Temat: Re: [winapi] mulÄ?cy repaint przy resize
Od: "fir" <p...@p...onet.pl>
> fir <p...@p...onet.pl> napisał(a):
> > drugi problem ze odrysowanie z bufora robie
> > setPixelem i trwa to wolno (gdzies tak 1/3 sekundy)
>
> Jak rysujesz po pikselu to nic dziwnego. Do takich rzeczy jest BitBlt.
>
no muszę looknąć - dawno i zarazem rzadko używałem czystego winapi
(i choć zarazem szkielet i najczesciej używane funkcje mam
opanowane to mam pewne luki) kwestia tego że ja swój bufor
mam w wygodnym mi formacie (i dopiero przy rysowaniu
wartosci przetwarzam na kolory pixeli) - pewnie dla tego bitblta
musialbym przygotowac go specjalnie, mozesz powiedzec pare słow
o przygotowaniu tego bufora do blitnięcia? [da sie blitnac od razu
np cos takiego "unsigned char [400][300][3];" ?]
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
-
8. Data: 2010-06-14 09:42:25
Temat: Re: [winapi] mulÄ?cy repaint przy resize
Od: "Grzegorz Niemirowski" <g...@p...onet.pl>
fir <p...@p...onet.pl> napisał(a):
> no muszę looknąć - dawno i zarazem rzadko używałem czystego winapi
> (i choć zarazem szkielet i najczesciej używane funkcje mam
> opanowane to mam pewne luki) kwestia tego że ja swój bufor
> mam w wygodnym mi formacie (i dopiero przy rysowaniu
> wartosci przetwarzam na kolory pixeli) - pewnie dla tego bitblta
> musialbym przygotowac go specjalnie, mozesz powiedzec pare słow
> o przygotowaniu tego bufora do blitnięcia? [da sie blitnac od razu
> np cos takiego "unsigned char [400][300][3];" ?]
Właśnie tak robiłem.
BYTE bitmap[800*600*3];
void drawf(HDC lnghdc) {
HDC fHDC = CreateCompatibleDC(NULL);
BITMAPINFOHEADER bmiHeader;
bmiHeader.biSize=sizeof(bmiHeader);
bmiHeader.biWidth = 800;
bmiHeader.biHeight = -600;
bmiHeader.biPlanes = 1;
bmiHeader.biBitCount = 24;
bmiHeader.biCompression = BI_RGB;
bmiHeader.biSizeImage = 0;
bmiHeader.biXPelsPerMeter =0;
bmiHeader.biYPelsPerMeter =0;
bmiHeader.biClrUsed = 0;
bmiHeader.biClrImportant = 0;
BITMAPINFO pbmi;
pbmi.bmiHeader = bmiHeader;
void *ppvBits = NULL;
HBITMAP fBitmap = CreateDIBSection (fHDC, &pbmi, DIB_RGB_COLORS, &ppvBits,
NULL, NULL);
SelectObject(fHDC,fBitmap);
CopyMemory(ppvBits,bitmap,800*600*3);
BitBlt(lnghdc,0,0,800,600,fHDC,0,0,SRCCOPY);
DeleteObject(fBitmap);
}
--
Grzegorz Niemirowski
http://www.grzegorz.net/
OE PowerTool i Outlook Express: http://www.grzegorz.net/oe/
Uptime: 4 days, 8 hours, 21 minutes and 48 seconds
-
9. Data: 2010-06-14 09:45:17
Temat: Re: [winapi] mulÄ?cy repaint przy resize
Od: "ślamazar" <p...@p...onet.pl>
> fir <p...@p...onet.pl> napisał(a):
> > no muszę looknąć - dawno i zarazem rzadko używałem czystego winapi
> > (i choć zarazem szkielet i najczesciej używane funkcje mam
> > opanowane to mam pewne luki) kwestia tego że ja swój bufor
> > mam w wygodnym mi formacie (i dopiero przy rysowaniu
> > wartosci przetwarzam na kolory pixeli) - pewnie dla tego bitblta
> > musialbym przygotowac go specjalnie, mozesz powiedzec pare słow
> > o przygotowaniu tego bufora do blitnięcia? [da sie blitnac od razu
> > np cos takiego "unsigned char [400][300][3];" ?]
>
> Właśnie tak robiłem.
> BYTE bitmap[800*600*3];
> void drawf(HDC lnghdc) {
> HDC fHDC = CreateCompatibleDC(NULL);
> BITMAPINFOHEADER bmiHeader;
> bmiHeader.biSize=sizeof(bmiHeader);
> bmiHeader.biWidth = 800;
> bmiHeader.biHeight = -600;
> bmiHeader.biPlanes = 1;
> bmiHeader.biBitCount = 24;
> bmiHeader.biCompression = BI_RGB;
> bmiHeader.biSizeImage = 0;
> bmiHeader.biXPelsPerMeter =0;
> bmiHeader.biYPelsPerMeter =0;
> bmiHeader.biClrUsed = 0;
> bmiHeader.biClrImportant = 0;
> BITMAPINFO pbmi;
> pbmi.bmiHeader = bmiHeader;
> void *ppvBits = NULL;
> HBITMAP fBitmap = CreateDIBSection (fHDC, &pbmi, DIB_RGB_COLORS, &ppvBits,
> NULL, NULL);
> SelectObject(fHDC,fBitmap);
> CopyMemory(ppvBits,bitmap,800*600*3);
> BitBlt(lnghdc,0,0,800,600,fHDC,0,0,SRCCOPY);
> DeleteObject(fBitmap);
> }
>
>
ok, much tnx, przerobie to w ten sposób - może ni chcialoby mi sie za to
zabrać ale skoro rozwiazanie mam na talerzu to chętnie zapodam
fir :)
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
-
10. Data: 2010-06-15 08:04:23
Temat: Re: [winapi] mulÄ?cy repaint przy resize
Od: " ślamazar" <f...@W...gazeta.pl>
> fir <p...@p...onet.pl> napisał(a):
> > no muszę looknąć - dawno i zarazem rzadko używałem czystego winapi
> > (i choć zarazem szkielet i najczesciej używane funkcje mam
> > opanowane to mam pewne luki) kwestia tego że ja swój bufor
> > mam w wygodnym mi formacie (i dopiero przy rysowaniu
> > wartosci przetwarzam na kolory pixeli) - pewnie dla tego bitblta
> > musialbym przygotowac go specjalnie, mozesz powiedzec pare słow
> > o przygotowaniu tego bufora do blitnięcia? [da sie blitnac od razu
> > np cos takiego "unsigned char [400][300][3];" ?]
>
> Właśnie tak robiłem.
> BYTE bitmap[800*600*3];
> void drawf(HDC lnghdc) {
> HDC fHDC = CreateCompatibleDC(NULL);
> BITMAPINFOHEADER bmiHeader;
> bmiHeader.biSize=sizeof(bmiHeader);
> bmiHeader.biWidth = 800;
> bmiHeader.biHeight = -600;
> bmiHeader.biPlanes = 1;
> bmiHeader.biBitCount = 24;
> bmiHeader.biCompression = BI_RGB;
> bmiHeader.biSizeImage = 0;
> bmiHeader.biXPelsPerMeter =0;
> bmiHeader.biYPelsPerMeter =0;
> bmiHeader.biClrUsed = 0;
> bmiHeader.biClrImportant = 0;
> BITMAPINFO pbmi;
> pbmi.bmiHeader = bmiHeader;
> void *ppvBits = NULL;
> HBITMAP fBitmap = CreateDIBSection (fHDC, &pbmi, DIB_RGB_COLORS, &ppvBits,
> NULL, NULL);
> SelectObject(fHDC,fBitmap);
> CopyMemory(ppvBits,bitmap,800*600*3);
> BitBlt(lnghdc,0,0,800,600,fHDC,0,0,SRCCOPY);
> DeleteObject(fBitmap);
> }
>
ok, zasiadłem do maszyny i to zasadniczo działa, tnx tylko ze
widzę tu chyba trzy błedy/problemy
1) o ile sie orientuje samo CreatedibSection alokuje sobie bufor
ktory jest dostepny pod ppvBits[] i mozna go uzywac,
a CopyMemory z jeszcze jednego innego bufora jest fatalną redundancją
i marnotrastwem i ramu i procka
2) całą to inicjalicacje przed BitBlt jak i destrukcje
po, warto zrobic tylko raz na poczatku i raz na koncu a nie wespol
z kazdym BitBlitem
3) w moim helpie do winapi jest napisane zeby deletowac zarowno
bitmape jak i kontekst a ty deletujesz tylko bitmape; tu mam niejasnosc
bo bitmapa jest czescia kontekstu i nie wiem czy o tyle wystarczy
dletnac tylko kontekst czy tez np wczesniej jego podczesc czyli bitmape :-/
czy ktos moglby to wyjasnic - powiedziec pare słow
fir
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/