c ++ - Få bitmap af, hvad minimeret vindue ville se ud, hvis normaliseret

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at skrive en kopi af, hvad min apps-vindue ser jævnligt ud. Ting fungerer fint, hvis vinduet er normaliseret f.eks. På skrivebordet. Men hvis vinduet minimeres, får jeg kun den minimerede kommandolinje.


Jeg har forsøgt forskellige fremgangsmåder ved at bruge SendMessage med WM\_PRINT og PrintWindow uden succes. I den følgende kode ved hjælp af SendMessage ved jeg, at den korrekte størrelse af det normaliserede vindue bruges til at oprette bitmappen. Jeg ved, at standardbehandling af WM\_PRINT via DefWindowProc genereres en WM\_PRINTCLIENT besked. hWnd er håndtaget til det minimerede vindue.


        HDC                 scrdc, memdc;
        HBITMAP             membit;
        WINDOWPLACEMENT     WP;
        EncoderParameters   encoderParameters;
        ULONG               quality;
        Status              status;
        RECT                Rect;

        WP.length  = sizeof (WP);
        WP.flags   = 0;
        WP.showCmd = 0;

        GetWindowPlacement (hWnd, &WP);
        int WPHeight = WP.rcNormalPosition.bottom - WP.rcNormalPosition.top;
        int WPWidth  = WP.rcNormalPosition.right  - WP.rcNormalPosition.left;

        scrdc = GetWindowDC (hWnd);                                 // source DC
        GetWindowRect(hWnd,&Rect);                                  //  source Rectangle
        int Height = Rect.bottom-Rect.top;                          //   source height
        int Width  = Rect.right-Rect.left;                          //    source width

        if (WP.showCmd == SW\_SHOWMINIMIZED)
        {
            Height = WPHeight;
            Width  = WPWidth;
        }

        memdc = CreateCompatibleDC(scrdc);                          // destination DC
        membit = CreateCompatibleBitmap(scrdc, Width, Height);      //  destination bitmap
        HBITMAP hOldBitmap =(HBITMAP) SelectObject(memdc, membit);  //   add bitmap to DC

// copy screen to new BitMap

//      BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);   

//      PrintWindow (hWnd, memdc, 0);

        BitBlt 
        (
            memdc,
            0,
            0,
            GetDeviceCaps(memdc,HORZRES),
            GetDeviceCaps(memdc,VERTRES),
            NULL,
            NULL,
            NULL,
            WHITENESS
        );

        SendMessage (hWnd, WM\_PRINT, unsigned int (memdc), PRF\_CLIENT|PRF\_NONCLIENT);


Og her er koden til WM\_PRINT-, WM\_PRINTCLIENT- og WM\_PAINT-handlerne


    case WM\_PRINT:
        return DefWindowProc (hWnd, message, wParam, lParam);

    case WM\_PRINTCLIENT:
        Screen.WMPrint (hWnd, HDC (wParam), NULL);
        return true;
        return DefWindowProc (hWnd, message, wParam, lParam);

    case WM\_PAINT:                          
        Screen.WMPaint (hWnd);
        break;


Jeg ved også, at Screen.WMPrint scribbles de rigtige ting i HDC.


Så hvis nogen kan give mig nogle tip eller foreslå en tilgang, så værdsætter jeg det. Jeg kunne bruge Screen.WMPaint, men så får jeg kun klientområdet og savner kommandolinjen og grænserne.


Jeg vil ikke normalisere vinduet, da det vil irritere brugeren.

Bedste reference


Dette er svært, for når dit vindue er minimeret, ser det ikke ud til dets ubegrænsede selv.


WM\_PRINT udskriver det ikke-klientområde i dit vindue (siden du forbinder flaget) ved at ringe til den sædvanlige WM\_NCPAINT-handler. Og den håndterer ser på vinduet tilstand, så hvis det minimeres, vandt du ' Jeg vil ikke få det, du vil. Og så forsøger det at udskrive klientområdet, men jeg tror også her, at den minimerede tilstand medfører, at denne del bliver sprunget over. Et minimeret vindue effektivt har intet klientområde.


At kalde din interne maling rutine kan være den enkleste løsning. Ja, det giver dig kun klientområdet. Bemærk, at de forhåndsvisninger du ser på proceslinjen i Windows 7, når du svæver over fliserne for et minimeret vindue, udelukker også området uden klient. Jeg synes det er for svært.

Andre referencer 1


I din WM\_PAINT-handler forudsætter du at du bruger dobbelt buffering, gør din backbuffer hdc global, og når du vil tage et øjebliksbillede af dit program, skal du bare bitblt den HDC til en bitmap uden for skærmen, og der har du den.


Her er hvad din WM\_PAINT-behandler skal se ud:
http://pastebin.com/aNvtHiD6[4]

Andre referencer 2


Dette er måske bare muligt at konstruere en sådan kort. Jeg tror, ​​at man bliver nødt til at glomme på en bitmap af hele vinduet efter hver malingsoperation for at få titellinjen og grænserne. Så kunne man slette klientområdet. Dette ville udgøre et udgangspunkt, hvor man kunne foretage forskellige GDI-operationer. En yderligere komplikation er, at enhver kontrol som rullefelter, datakontroller, redigeringsfelter osv. Skal indsamles individuelt og tilføjes til bitmapet. Til min ansøgning besluttede jeg, at jeg ikke ville håndtere den minimerede situation. Jeg havde nok problemer med at få kontrollerne på den nye bitmap. Problemet med kontrollerne opstår, fordi man ikke bare kan gøre dem børn i hovedvinduet, fordi alt du har er en bitmap, selve vinduet minimeres eller kontrollerne skjules eller væk fra skærmen.