[C++] Copy/capture

Pagina: 1
Acties:

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ik heb een handle naar een bepaald iets (in dit geval een frame) en deze wil ik graag naar mijn eigen window kopieren. Het maakt me niet uit dat het een "echte" kopie is, dus dat je de controls echt kopieerd, of dat het een capture is van de handle. Ik heb de volgende code zelf geprobeerd. Deze werkt in principe wel, maar deze code kopieerd alleen wat ook daadwerkelijk zichtbaar is op het scherm. Als de helft zichtbaar is, kopieerd ie ook maar de helft (en het is de bedoeling dat het window waarvan hij hem kopieerd juist niet zichtbaar is):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    HWND handler = 0;
    handler = FindWindow(NULL,"Processing Result");
    if(handler)
    {   classnameHandler=0;
        EnumChildWindows(handler,(WNDENUMPROC)FindClassnameCallback,(LPARAM)"ThunderRT6Frame");
        HDC dc = GetDC(classnameHandler);
        Graphics::TCanvas *ScreenCanvas = new Graphics::TCanvas;
        ScreenCanvas->Handle = dc;
        TRect rect = ScreenCanvas->ClipRect;
        rect.Right  = rect.Right  - rect.Left;
        rect.Bottom = rect.Bottom - rect.Top;
        rect.Top = 0;
        rect.Left = 0;

        Image3->Picture->Bitmap->Width = rect.Right;
        Image3->Picture->Bitmap->Height= rect.Bottom;
        Image3->Picture->Bitmap->Canvas->CopyRect(rect,
                                                  ScreenCanvas,
                                                  ScreenCanvas->ClipRect);
        delete ScreenCanvas;
    }


De bovenstaande code is dus een screencapture. Met de andere methode die ik bedoel, zou ik in principe hetzelfde resultaat willen bereiken als met SetParent, maar dan zonder dat hij van parent veranderd...

Ik hoop dat het duidelijk is wat ik bedoel. Alvast bedankt voor jullie hulp!

  • DolleDries
  • Registratie: Oktober 2000
  • Laatst online: 22-08 11:46
Ik denk dat dit komt doordat er alleen getekend wordt wat zichtbaar is...
(optimalizatie van windows enzo).

Dus als een deel van een scherm ergens achter valt is de kans groot dat deze dus niet mee..gekopieerd kan worden.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Wat je wilt kan niet. Binnen Windows wordt door het OS geen scherminformatie gebufferd die niet nodig is, oftewel de screendata van een hidden window bestaat botweg nergens waar jij 'm zou kunnen achterhalen.

Workaround (of liever gezegd de wel correcte methode ;) ) is om handmatig een WM_PRINT naar het desbetreffende window te sturen.

Professionele website nodig?


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
curry684 schreef op 05 May 2003 @ 15:01:
Workaround (of liever gezegd de wel correcte methode ;) ) is om handmatig een WM_PRINT naar het desbetreffende window te sturen.
Volgens mij is dit inderdaad ook wat ik wil. Ik heb net een hele tijd lopen proberen om dit werkend de krijgen, maar ik doe elke keer iets fout, omdat ik simpelweg geen beeld op mijn scherm krijg. Wat doe ik fout?
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        HDC dc = CreateCompatibleDC(GetDC(classnameHandler));
        ::SendMessage(classnameHandler,WM_PRINT,(WPARAM)dc,PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND | PRF_NONCLIENT | PRF_OWNED);
        Graphics::TCanvas *ScreenCanvas = new Graphics::TCanvas;
        ScreenCanvas->Handle = dc;
        TRect rect = ScreenCanvas->ClipRect;
        rect.Right  = rect.Right  - rect.Left;
        rect.Bottom = rect.Bottom - rect.Top;
        rect.Top = 0;
        rect.Left = 0;
        Image3->Picture->Bitmap->Width = rect.Right;
        Image3->Picture->Bitmap->Height= rect.Bottom;
        Image3->Picture->Bitmap->Canvas->CopyRect(rect,
                                                  ScreenCanvas,
                                                  ScreenCanvas->ClipRect);
        delete ScreenCanvas;

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Bliep ik zou een bitmap in je DC selecten voordat je iemand erop laat tekenen.

Uit het blote hoofd:
C++:
1
2
3
4
TBitmap*  l_Bitmap = new TBitmap;
l_Bitmap->Height = ...;
l_Bitmap->Width = ...;
SendMessage(..., ..., l_Bitmap->Canvas->Handle, ...);

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Je doet trouwens wel meer fout. Je gebruikt GetDC op een window, maar als je die niet met ReleaseDC weer vrijgeeft krijg je ruzie met je systeem (je mag vooral onder 9x-kernels maar een beperkt aantal DC's per process vasthouden). En ik weet niet wat 'classnameHandler' voor moet stellen maar als het echt een HWND is is het de slechtst gekozen naam die ik ooit voor een handle heb gezien: het klinkt meer als een functiepointer.

Professionele website nodig?

Pagina: 1