Skocz do zawartości

Okno do bitmapy albo JPG :)


Recommended Posts

Napisano

Witam.
Potrzebuję zrobić "printscreen" okna aplikacji (uchwyt okna pobieram przez FindWindowEx), zapisać go jako BMP albo nawet lepiej jako JPG i nie bardzo wiem jak się do tego zabrać :(, okno prawdopodobnie wykorzystuje DirectDraw ale wolałbym jakiś "uniwersalny" sposób. Z góry tlx. Za pomoc :)

Napisano

Aby skopiowac cokolwiek z ekranu wystarczy urzyc nastepujacego algorytmu:

var
 dc,screen:hDC;
 bm:HBITMAP;
begin
 screen:=getdc(0);
 bm:=createcompatiblebitmap(screen,200,200); //200 to np. rozmiar wyskosci i szerokosci kopiowanego okna
 dc:=createcompatibledc(screen);
 selectobject(dc,bm);
 bitblt(dc,0,0,200,200,screen,50,50,SRCCOPY); //50 to polozenie okna (x,y)
 releasedc(0,screen);
 ...

i bm jest uchwytem zrzuconej mapy. A jezeli chcesz pobrac polozenie okna wystarczy zastosowac GetWindowRect.

Napisano

A więc po przeróbce kod działa ale pojawiły się 2 nowe problemy :(
1. Czy idzie jakoś pobrać obraz okna zasłoniętego (na razie pobiera mi obraz każdego okna nad nim)
2. Dlaczego po paru odrysowaniach okno nie przyjmuje komunikatu WM_PAINT (nie odrysowuje się) tu kawałek kodu :

...
        case WM_PAINT:
                hWndH3 = FindWindowEx(NULL,NULL,NULL,"Heroes of Might and Magic III");
        if (hWndH3==NULL)
        {
                MessageBox(NULL,"Brak okna Gry !","Błąd",MB_OK);
                PostQuitMessage(0);
        }
        GetWindowRect(hWndH3,&rozOkna);
                memset(&bitMapa,0,sizeof(HBITMAP));
                DCScreenH3 = GetDC(hWndH3);
                bitMapa=CreateCompatibleBitmap(DCScreenH3,rozOkna.right-rozOkna.left,rozOkna.bottom-rozOkna.top);
                DCH3=CreateCompatibleDC(DCScreenH3);
                SelectObject(DCH3,bitMapa);
                BitBlt(DCH3,0,0,rozOkna.right-rozOkna.left,rozOkna.bottom-rozOkna.top,DCScreenH3,0,0,SRCCOPY);
                DeleteDC(DCH3);
                DeleteDC(DCScreenH3);
                hdc=BeginPaint(hWnd,&ps);               
                memDC=CreateCompatibleDC(hdc);
                SelectObject(memDC,bitMapa);
        //      BitBlt(hdc,0,0,rozOkna.right-rozOkna.left,rozOkna.bottom-rozOkna.top,memDC,0,0,SRCCOPY);
                StretchBlt(hdc,0,0,400,400,memDC,0,0,rozOkna.right-rozOkna.left,rozOkna.bottom-rozOkna.top,SRCCOPY);
                EndPaint(hWnd,&ps);
                DeleteDC(memDC);
                DeleteDC(hdc);
                UpdateWindow(hWnd);
                hWndH3=NULL;
                break;
        case WM_TIMER:
                InvalidateRect(hWnd,NULL,true);
                break;
...

[UPDATE]
Problem nr 2 rozwiązałem poprzez usuwanie bitmapy po kazdym rysowaniu :)

Napisano

Czy sie da skopiowac przyslonietego okna to niewiem, bo nie probowalem. Ale ogolnie, to nie jestem pewien czy da sie tak standardowo skopiowac obraz odrysowywany przez DirectX. Pierwsza uwaga to za duzo tego kodu w WM_PAINT. Powinien byc tylko kod do odrysowania, a nie tez do pokazania komunikatow. No i ten UpdateWindow w tym komunikacie? Poza tym zrobiles zegar i komunikat chyba nie zdazy takiej ilosci wykonac naraz - zalezne jest to od sprzetu i jaki zadales interwal czasowy na SetTimer. WM_Paint poiwnien prawidlowo wygladac tak:

WM_PAINT:begin
 dc:=beginpaint(okno,ps);
 ... //tutaj kod do odrysowania. Odrysowujac na oknie masz kontekst dc, lub ps.hdc. zawsze jak tworzysz nowekonteksty w pamieci to pamietaj aby je na koncu zwalniac. Jezeli odrysowujesz ciagle te same okno to po co naokraglo odwolywac sie do niego w tym komunikacie. Wystarczy raz pobrac np. w WM_CREATE i np. w zegarze sprawdzac czy caly czas jest. Bo jesli nie to po co wywlywac odrysowanie okna poprzez InvalidateRect?
 endpaint(okno,ps);
end;

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...