eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › [winapi] mulący repaint przy resize
Ilość wypowiedzi w tym wątku: 12

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

strony : [ 1 ] . 2


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: