eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Rysowanie wartości tablicy w okienku.
Ilość wypowiedzi w tym wątku: 14

  • 1. Data: 2009-09-26 06:51:25
    Temat: Rysowanie wartości tablicy w okienku.
    Od: Jan Górski <j...@g...com>

    Jak szybko narysować w okienku Win32 tablicę n x m (u mnie około
    600x400) pikseli w 256 odcieniach szarości (licząc czarny). Czy warto
    użyć GDI, czy może zakotwiczyć tam DirectX i wspomagać sprzętowo ?
    Programuję w c++, używając Visual C++ Express Edition.

    Myślałem o wypisywaniu piksel po pikselu SetPixel. Ale dopiero
    zaczynam Win32 i okienka. Do tej pory konsola, SDL albo winbgim.
    Chciałbym to zrobić mądrze, odświeżać nie będzie się często, jednak
    SetPixel jest bardzo wolna.


  • 2. Data: 2009-09-26 07:41:58
    Temat: Re: Rysowanie wartości tablicy w okienku.
    Od: "Mariusz Marszałkowski" <b...@g...SKASUJ-TO.pl>

    Jan Górski <j...@g...com> napisał(a):

    > Jak szybko narysowa=E6 w okienku Win32 tablic=EA n x m (u mnie oko=B3o
    > My=B6la=B3em o wypisywaniu piksel po pikselu SetPixel.

    Nie wiem co to znaczy dla Ciebie "szybko".

    Szybciej od "SetPixel" będzie, gdy utworzysz pixmape i pobierzesz adres
    piseli w tej pixmapie. Później do pixmapy piszesz tak jak do zwykłej
    tablicy w pamięci RAM, zamiast używać funkcji typu SetPixel, albo LineTo, itd.
    Jak juz w pamięci RAM zrobisz kompletny rysunek, to przerzucasz całą pixmape
    na ekran przy pomocy jednego wywołania BitBlt.

    Pozdrawiam



    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 3. Data: 2009-09-26 08:23:00
    Temat: Re: Rysowanie wartości tablicy w okienku.
    Od: Jan Górski <j...@g...com>

    Czy mógłbym poprosić o dokładniejsze naprowadzenie w tym temacie ? Mam
    utworzyć bitmapę używając GDI? Czy stworzyć po prostu dynamicznie
    układ tablic charów 2D w czystym C/C++ - tam byłoby prościej.
    Następnie znając ograniczenia tablic i ich ilość użyć BitBlt ?

    Szukałem w google, jednak z marnym rezultatem, na msdn jest taka
    funkcja tworząca pixmapę, ale w openGL.


  • 4. Data: 2009-09-26 09:30:28
    Temat: Re: Rysowanie wartości tablicy w okienku.
    Od: "Mariusz Marszałkowski" <b...@g...SKASUJ-TO.pl>


    Jan Górski <j...@g...com> napisał(a):

    > Czy m=F3g=B3bym poprosi=E6 o dok=B3adniejsze naprowadzenie w tym temacie ? =
    > Mam
    > utworzy=E6 bitmap=EA u=BFywaj=B1c GDI? Czy stworzy=E6 po prostu dynamicznie
    > uk=B3ad tablic char=F3w 2D w czystym C/C++ - tam by=B3oby pro=B6ciej.
    > Nast=EApnie znaj=B1c ograniczenia tablic i ich ilo=B6=E6 u=BFy=E6 BitBlt ?
    >
    > Szuka=B3em w google, jednak z marnym rezultatem, na msdn jest taka
    > funkcja tworz=B1ca pixmap=EA, ale w openGL.

    Wpisalem w google msdn bitblt. Pierwszy link w googach prowadzi na strone
    msdn u samego microsofta. Na stronie jest opisana (niestety pa angielsku,
    ale jest opisana) owa funkcja bitblt. Funkcja bitblt jest w tym samym
    rozdziale co inne funkcje do bitmap (prawde powiedziawszy do pixmap), spis
    wszystkich funkcji do bitmap widac po lewej stronie. Jedna z tych funkcji
    to CreateDIBSection. Pobiera ona wskaźnik do wskaźnika typu VOID. Pod
    ten wskaźnik kopiuje uchwyt do pamięci pikseli i w tej pamieci mozesz
    "recznie" wykonywac operacje bez uzycia SetPixel, LineTo, itd. Nastepnie
    to co zwróci CreateDIBSection, czyli uchwyt HBITMAP, wykorzystujesz normalnie
    w BitBlt (albo w innych funkcjach do kopiowania bitmap) do przerzucenia
    na ekran.

    Jeśli chcesz gotowca to chętnie dam, ale dopiero wieczorem albo jutro.

    Pozdrawiam






    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 5. Data: 2009-09-26 11:22:27
    Temat: Re: Rysowanie wartości tablicy w okienku.
    Od: Mateusz Loskot <s...@s...net>

    Jan Górski wrote:
    > Jak szybko narysować w okienku Win32 tablicę n x m (u mnie około
    > 600x400) pikseli w 256 odcieniach szarości (licząc czarny).

    Co ta tablica reprezentuje?
    Co tak na prawdę rysujesz?

    Tablica n x m może zawierać różne dane, na przykład sample rastra
    albo punkty, które tworzą geometrię (łamaną, poligon).

    Każdy wariant to różny sposób renderowania, a więc i różne możliwości
    optymalizacji.

    > Czy warto użyć GDI, czy może zakotwiczyć tam DirectX i wspomagać sprzętowo ?

    Za wcześnie na to pytanie, bo nie podałeś konkretów.
    Po drugie, zakładając że nie ma innych wymagań (np. wymagania klienta o
    zakazie stosowanie DirectX) użyj tego z czym masz najlepsze
    doświadczenie. Zmierz. Zoptymalizuj. Zmierz. Z...

    > Myślałem o wypisywaniu piksel po pikselu SetPixel.

    Cokolwiek byś nie chciał renderować, jest to tak zwany brute-force,
    a więc mało optymalne.
    Ponownie, brak konkretów, trudno ocenić.

    > Ale dopiero zaczynam Win32 i okienka. Do tej pory konsola, SDL albo winbgim.
    > Chciałbym to zrobić mądrze, odświeżać nie będzie się często, jednak
    > SetPixel jest bardzo wolna.

    Najpierw określ, co to za obiekty które reprezentujesz w tablicy n x m.

    Pozdrawiam
    --
    Mateusz Loskot, http://mateusz.loskot.net
    Charter Member of OSGeo, http://osgeo.org


  • 6. Data: 2009-09-26 18:52:34
    Temat: Re: Rysowanie wartości tablicy w okienku.
    Od: Jan Górski <j...@g...com>

    > Wpisalem w google msdn bitblt. Pierwszy link w googach prowadzi na strone
    > msdn u samego microsofta. Na stronie jest opisana (niestety pa angielsku,
    > ale jest opisana) owa funkcja bitblt. Funkcja bitblt jest w tym samym
    > rozdziale co inne funkcje do bitmap (prawde powiedziawszy do pixmap), spis
    > wszystkich funkcji do bitmap widac po lewej stronie. Jedna z tych funkcji
    > to CreateDIBSection. Pobiera ona wskaźnik do wskaźnika typu VOID. Pod
    > ten wskaźnik kopiuje uchwyt do pamięci pikseli i w tej pamieci mozesz
    > "recznie" wykonywac operacje bez uzycia SetPixel, LineTo, itd. Nastepnie
    > to co zwróci CreateDIBSection, czyli uchwyt HBITMAP, wykorzystujesz normalnie
    > w BitBlt (albo w innych funkcjach do kopiowania bitmap) do przerzucenia
    > na ekran.
    >
    > Jeśli chcesz gotowca to chętnie dam, ale dopiero wieczorem albo jutro.
    >
    > Pozdrawiam
    >
    > --
    > Wysłano z serwisu Usenet w portalu Gazeta.pl ->http://www.gazeta.pl/usenet/

    Dziękuję za pomoc, właśnie o taką odpowiedź mi chodziło. Doczytam
    sobie to i postaram się sam wymodzić.


  • 7. Data: 2009-09-26 19:07:43
    Temat: Re: Rysowanie wartości tablicy w okienku.
    Od: "Mariusz Marszałkowski" <b...@g...SKASUJ-TO.pl>

    Jan Górski <j...@g...com> napisał(a):

    > Dzi=EAkuj=EA za pomoc, w=B3a=B6nie o tak=B1 odpowied=BC mi chodzi=B3o. Docz=
    > ytam
    > sobie to i postaram si=EA sam wymodzi=E6.

    Poniżej obiecany gotowiec :)

    Pozdrawiam



    #undef UNICODE

    #include <windows.h>
    #include <stdio.h>

    HINSTANCE hInst;
    int w,h,wrow;
    HBITMAP mem_bmp;
    HDC mem_hdc;
    unsigned __int8 *pix;
    unsigned __int8 *buf1;
    unsigned __int8 *buf2;
    unsigned __int8 *ptr_buf1,*ptr_buf2;
    unsigned __int8 colot_table[5*5*5];

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    PAINTSTRUCT ps;
    HDC hdc;
    static DWORD czas=0;
    static DWORD frame=0;
    static TCHAR buf[256];
    static int start=0;
    static int licz=0;

    switch (message)
    {
    case WM_CREATE:
    break;
    case WM_TIMER:
    InvalidateRect( hWnd , NULL , FALSE );
    break;
    case WM_KEYDOWN:
    if( wParam == VK_ESCAPE )
    DestroyWindow( hWnd );
    if( wParam == VK_SPACE )
    {
    if( start )
    KillTimer( hWnd , 0 );
    else
    {
    SetTimer( hWnd , 0 , 0 , NULL );
    czas = GetTickCount();
    }
    start = !start;
    }
    break;
    case WM_PAINT:
    {
    int x,y,x1,y1,t,sum;
    unsigned __int8 *swp;
    t = GetTickCount();
    if( t - czas > 5000 )
    {
    sprintf( buf , "fps: %5.2lf", frame * 1000.0 / ( t - czas ) );
    czas = t;
    frame = 0;
    }
    frame ++ ;
    hdc = BeginPaint(hWnd, &ps);
    for( y=20 ; y<h-20 ; y++ )
    {
    for( x=20 ; x<w-20 ; x++ )
    {
    sum = 0;
    for(x1=x-2;x1<=x+2;x1++)
    for(y1=y-2;y1<=y+2;y1++)
    sum += ptr_buf1[y1*w+x1];
    sum -= ptr_buf1[y*w+x];
    ptr_buf2[y*w+x] = colot_table[sum];
    pix[y*wrow*3+x*3+0] = 0;
    pix[y*wrow*3+x*3+1] = 0;
    pix[y*wrow*3+x*3+2] = ptr_buf2[y*w+x] ? 255 : 0;
    }
    }
    TextOut( mem_hdc , 20 , 30 , buf , (int)strlen(buf) );
    BitBlt( hdc , 0 , 0 , w , h , mem_hdc , 0 , 0 , SRCCOPY );
    EndPaint(hWnd, &ps);
    swp = ptr_buf1;
    ptr_buf1 = ptr_buf2;
    ptr_buf2 = swp;
    break;
    }
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }


    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
    lpCmdLine, int nCmdShow)
    {
    int i;
    MSG msg;
    WNDCLASSEX wcex;
    hInst = hInstance;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION );
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = TEXT("dywan_wnd_class");
    wcex.hIconSm = NULL;

    ATOM res = RegisterClassEx(&wcex);

    w = GetSystemMetrics(SM_CXSCREEN);
    h = GetSystemMetrics(SM_CYSCREEN);

    mem_hdc = CreateCompatibleDC( NULL );

    BITMAPINFO bmi;
    memset(&bmi,0,sizeof(bmi));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = w;
    bmi.bmiHeader.biHeight = -h;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biCompression = BI_RGB;
    bmi.bmiHeader.biBitCount = 24;
    mem_bmp = CreateDIBSection(mem_hdc,&bmi,DIB_RGB_COLORS,(void**
    )&pix,NULL,0);
    SelectObject(mem_hdc,mem_bmp);
    wrow = w;
    while(wrow & 0x3)
    wrow++;
    SetTextColor( mem_hdc , RGB(100,100,255));
    SetBkMode( mem_hdc , TRANSPARENT );
    buf1 = new unsigned __int8[w*h];
    buf2 = new unsigned __int8[w*h];
    ptr_buf1 = buf1;
    ptr_buf2 = buf2;
    memset( buf1 , 0 , w*h );
    memset( buf2 , 0 , w*h );

    memset( colot_table , 0 , sizeof(colot_table) );
    colot_table[3] = 5;
    colot_table[4] = 2;
    colot_table[7] = 5;
    colot_table[11] = 1;
    colot_table[18] = 5;
    colot_table[29] = 1;
    colot_table[46] = 3;
    colot_table[76] = 1;
    colot_table[123] = 5;

    ptr_buf1[w*(h/2-2)+w/2-2] = 1;
    ptr_buf1[w*(h/2-2)+w/2+1] = 1;
    ptr_buf1[w*(h/2+1)+w/2-2] = 1;
    ptr_buf1[w*(h/2+1)+w/2+1] = 1;

    HWND hWnd = CreateWindow(TEXT("dywan_wnd_class"), TEXT("xx") ,
    WS_POPUP|WS_VISIBLE , 0 , 0, w , h , NULL, NULL, hInstance, NULL);

    while (GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    delete[] buf1;
    delete[] buf2;
    DeleteDC( mem_hdc );
    DeleteObject( mem_bmp );

    return (int) msg.wParam;
    }


    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 8. Data: 2009-09-26 19:40:06
    Temat: Re: Rysowanie wartości tablicy w okienku.
    Od: Mateusz Loskot <s...@s...net>

    Jan Górski wrote:
    > Dziękuję za pomoc, właśnie o taką odpowiedź mi chodziło. Doczytam
    > sobie to i postaram się sam wymodzić.

    Jak lecisz po BitBlt, to polecam codeproject.com i tam doczytać o
    "double buffering" z użyciem Windows GDI.

    Pozdrawiam
    --
    Mateusz Loskot, http://mateusz.loskot.net
    Charter Member of OSGeo, http://osgeo.org


  • 9. Data: 2009-09-30 08:17:28
    Temat: Re: Rysowanie wartości tablicy w okienku.
    Od: "pkorbut" <p...@i...pl>

    > Jan Górski wrote:
    > > Dziękuję za pomoc, właśnie o taką odpowiedź mi chodziło. Doczytam
    > > sobie to i postaram się sam wymodzić.
    >
    > Jak lecisz po BitBlt, to polecam codeproject.com i tam doczytać o
    > "double buffering" z użyciem Windows GDI.

    Właśnie takie użycie BitBlt jak w podanym przykładzie to jest dokładnie "double
    buffering z użyciem Windows GDI"...

    Nie mieszaj chłopakowi w głowie...

    PK

    --
    Wysłano z serwisu OnetNiusy: http://niusy.onet.pl


  • 10. Data: 2009-09-30 10:46:01
    Temat: Re: Rysowanie wartości tablicy w okienku.
    Od: "Mateusz Loskot" <m...@l...net>

    "pkorbut" <p...@i...pl> wrote in message
    news:1557.000002d6.4ac31418@newsgate.onet.pl...
    >> Jan Górski wrote:
    >> > Dziękuję za pomoc, właśnie o taką odpowiedź mi chodziło. Doczytam
    >> > sobie to i postaram się sam wymodzić.
    >>
    >> Jak lecisz po BitBlt, to polecam codeproject.com i tam doczytać o
    >> "double buffering" z użyciem Windows GDI.
    >
    > Właśnie takie użycie BitBlt jak w podanym przykładzie to jest dokładnie
    > "double
    > buffering z użyciem Windows GDI"...
    >
    > Nie mieszaj chłopakowi w głowie...


    Nie mieszam, po prostu nie miałem czasu na analize podanego przykładu
    ale podałem nazwy, dzięki którym przykładów znajdzie na pęczki.

    Pozdrawiam
    --
    Mateusz Loskot, http://mateusz.loskot.net
    pl.comp.lang.c FAQ: http://pl.cpp.wikia.com/wiki/FAQ
    C++ FAQ: http://parashift.com/c++-faq-lite

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: