windows - vis skjult kontrol på bitmap

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har HDC=hdc af et lille kort, et rektangel R med logiske koordinater i hdc og HWND=hwnd for en scroll-kontrol skabt af CreateWindow med SBS\_HORZ. Rullekontrollen er barnet i et andet vindue. Jeg vil vise scrollkontrollen på bitmapet i rektangel R.


Jeg opnåede en HDC til scroll-kontrollen og brugte BitBlt til at kopiere kontrollen til rektanglet. Alt fungerer godt, hvis hele rullekontrollen er synlig i dennes forælder, men hvis rullepanelet er skjult, får jeg det, der nogensinde er oven på linjen. Hvis kontrollen er slukket på skærmen, får jeg intet.


Dette er alt sammen en del af en indsats for regelmæssigt at gemme et skærmbillede af appen, hvis du undrer dig over, hvordan rullebjælken kan skjules. Jeg ønsker ikke at bringe rullepanelets forælder til fronten.


Er der alligevel jeg kan få et ægte billede af rullefeltet under disse forhold?


Eller alternativt kunne jeg på en eller anden måde lave en rullefelt, der ikke viste, hvem jeg kunne kopiere? Jeg kender alle de nødvendige parametre.

Bedste reference


Jeg fandt følgende synes at virke, selvom kontrollen er skjult eller væk fra skærmen. Opret en DC og kompatibel bitmap fra kontrollen. Send kontrollen en WM\_PRINT-meddelelse, der beder om at udskrive sig i DC/Bitmap. Derefter kopieres bitmappen med BitBlt.


Meget grimt! Er der en bedre måde?


Noget sådan her ...


            HDC                 hdcScroll;
            WINDOWPLACEMENT     WP;
            HDC                 memdc;
            HBITMAP             membit;

            hdcScroll = GetDC (hwndScroll);
            GetWindowPlacement (hwndScroll, &WP);
            int Height = WP.rcNormalPosition.bottom - WP.rcNormalPosition.top;
            int Width  = WP.rcNormalPosition.right  - WP.rcNormalPosition.left;
            memdc = CreateCompatibleDC(hdcScroll);                          // destination DC
            membit = CreateCompatibleBitmap(hdcScroll, Width, Height);      //  destination bitmap
            HBITMAP hOldBitmap =(HBITMAP) SelectObject(memdc, membit);  //   add bitmap to DC
            SendMessage (hwndScroll,WM\_PRINT,(WPARAM) memdc, PRF\_CLIENT);

            BitBlt 
                (hdc,                               // destination HDC
                 rt\_scroll.left,                    // dest upper left corner X
                 rt\_scroll.top,                     // dest upper left corner Y
                 rt\_scroll.right-rt\_scroll.left+1,  // width of dest rectangle
                 rt\_scroll.bottom-rt\_scroll.top+1,  // height of dest rectangle

                 memdc,                             // source HDC
                 0,                                 // source upper left corner X
                 0,                                 // source upper left cornet Y

                 SRCCOPY
                );

            SelectObject(memdc, hOldBitMap);
            DeleteObject (membit);
            DeleteDC (memdc);
            ReleaseDC (hwndScroll, hdcScroll);